前記
上一篇中搜贤,我們了解了樸素貝葉斯。現(xiàn)在知道了调衰,樸素貝葉斯是監(jiān)督學(xué)習(xí)的一種算法膊爪。
樸素貝葉斯特殊的一點(diǎn)在于,這種算法非常適合文本分類嚎莉。在處理文本時(shí)米酬,常見(jiàn)的做法是將每個(gè)單詞看作一個(gè)特征,這樣就會(huì)有大量的特征趋箩。樸素貝葉斯假設(shè)各個(gè)特征之間獨(dú)立的赃额,并且算法又相對(duì)簡(jiǎn)單,使得它在文本分類應(yīng)用中發(fā)揮作用叫确。
支持向量機(jī)SVMs(support vector machines)
另一種監(jiān)督分類算法支持向量機(jī)SVMs(support vector machines)跳芳。
SVMs出現(xiàn)的時(shí)間不久,由Vadimir Vaplik(俄羅斯人)提出竹勉。
假設(shè)我們有一些兩種不同類型的數(shù)據(jù)飞盆。支持向量機(jī)就是在兩類數(shù)據(jù)之間尋找分隔線(通常稱之為超平面)的一種算法。
概念
margin - maximizes distance to nearest point
區(qū)分兩個(gè)類的分隔線與兩個(gè)類的最近點(diǎn)的距離次乓。最大化這個(gè)距離吓歇,就可以提高分類的穩(wěn)健性。
SVM的內(nèi)部原理也是最大限度的提升結(jié)果的穩(wěn)健性票腰。
SVM總是首先考慮分類正確性城看,然后才考慮對(duì)間隔最大化。
異常值響應(yīng)
對(duì)于異常值杏慰,SVM原則是盡量找到?jīng)Q策面测柠,并允許單個(gè)異常值在決策面的另一側(cè)。
實(shí)際上 SVM對(duì)于異常值非常健壯缘滥。在某種程度上在找出最大間隔和忽略異常值之間做了均衡 轰胁。
我們也可以通過(guò)修改SVM的參數(shù),決定了它如何檢測(cè)新的異常值朝扼。
用法
同貝葉斯差不多.
- 導(dǎo)入
from sklearn import SVM - 創(chuàng)建分類器
svm.SVC() - 訓(xùn)練(擬合)
fit - 分類
predict
函數(shù)原型:
class sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3, gamma='auto', coef0=0.0, shrinking=True, probability=False, tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, decision_function_shape=None, random_state=None)[source]
各參數(shù)解釋如下:
1. 核函數(shù)
SVM可以生成非常復(fù)雜的決策邊界软吐。
SVM是基于線性分隔的分類器,但由于SVM會(huì)創(chuàng)建新特征吟税,使得SVM可以學(xué)習(xí)非線性決策面凹耙。
這些新特性就是借助創(chuàng)建SVM時(shí)傳入的參數(shù)kernel來(lái)決定的姿现。
定義
可以將低維度的輸出空間(特征空間)映射到高維度空間的函數(shù)。我們稱之為核函數(shù)肖抱。
通過(guò)使用這種映射备典,使得原來(lái)不可線性分離的內(nèi)容變?yōu)榭煞蛛x。
SVM將這些分類分離后意述,獲取解并返回到原始空間提佣。這樣就得到了一個(gè)非線性分隔。
這是SVM非常重要的優(yōu)點(diǎn)荤崇。通過(guò)在更高維度的空間使用SVM拌屏,可以很容易的找出最佳的線性分類器∈趸纾或決策面倚喂。
在所有機(jī)器學(xué)習(xí)中,SVM是最主要的技巧之一瓣戚。
參數(shù)kernel可選擇如下幾種:
當(dāng)然端圈,也可以自己定義。
C
C值越大子库,可以獲得更多的訓(xùn)練點(diǎn)舱权。也可以說(shuō),C越大仑嗅,可以獲得更復(fù)雜的決策邊界宴倍。
到底是想要一條直線的決策邊界,還是想要一條彎曲的邊界以提高分類準(zhǔn)確度仓技,這就是機(jī)器學(xué)習(xí)中的藝術(shù)性所在(人們口中常說(shuō)的調(diào)參狗鸵贬?)。
咖瑪
咖瑪值有什么作用浑彰?我在linear方法下恭理,測(cè)試了一些值(1.0, 100.0, 1000,0)沒(méi)有發(fā)現(xiàn)明顯區(qū)別拯辙。問(wèn)題先保留郭变。如果有消息再回來(lái)補(bǔ)充。
過(guò)擬合fitting
如果參數(shù)不合適涯保,會(huì)導(dǎo)致本應(yīng)很簡(jiǎn)單的決策面變得復(fù)雜。所以要避免過(guò)度擬合。
避免的方法就是指定SVM的參數(shù)谷饿,也就是調(diào)參(這就是很多人說(shuō)的荧降,機(jī)器學(xué)習(xí)的初級(jí)階段就是調(diào)參)以防止過(guò)度擬合。
當(dāng)然及志,也有自動(dòng)檢測(cè)的方法片排,后面會(huì)學(xué)到寨腔。
優(yōu)缺點(diǎn)
SVM在復(fù)雜的但具有明顯分隔邊界的情況下,表現(xiàn)十分出色率寡。
但在海量數(shù)據(jù)集中表現(xiàn)不太好迫卢。
因?yàn)楫?dāng)訓(xùn)練集變大時(shí),訓(xùn)練時(shí)間是通常會(huì)成倍增長(zhǎng)冶共。
另外乾蛤,噪音過(guò)多的情況下此方法效果也不好。所以如果要分類的類別之間重疊較為嚴(yán)重捅僵,那就需要找一些獨(dú)立的特征家卖,這時(shí)使用貝葉斯分類器會(huì)更有效。
總結(jié)
樸素貝葉斯速度通常比SVM速度快庙楚。適合文本等海量數(shù)據(jù)集上荡。
但SVM在很多方面也很優(yōu)秀,通常準(zhǔn)確率也比貝葉斯高醋奠。
所以榛臼,選擇合適的算法很重要。另外窜司,根據(jù)選擇的算法不同沛善,還需要考慮相應(yīng)的參數(shù)調(diào)整以及過(guò)擬合的可能性(特別是在你沒(méi)有大量訓(xùn)練數(shù)據(jù)的情況下)。
調(diào)整參數(shù)的工作量很大塞祈,后面會(huì)介紹 GridCV(一種幾乎能自動(dòng)查找最優(yōu)參數(shù)調(diào)整的優(yōu)秀 sklearn 工具)金刁。
調(diào)參!調(diào)參议薪!調(diào)參尤蛮!
我的電腦i5-4460 CPU @ 3.20GHz,訓(xùn)練安然郵件數(shù)據(jù)集7000多斯议,要100秒产捞,如果要手工調(diào)參的話,有點(diǎn)太耗時(shí)了哼御。有沒(méi)有更好的辦法坯临??恋昼?換電腦看靠?
望有經(jīng)驗(yàn)的同學(xué)指點(diǎn)一下。謝謝了液肌。
代碼片段
### features_train and features_test are the features for the training
### and testing datasets, respectively
### labels_train and labels_test are the corresponding item labels
features_train, features_test, labels_train, labels_test = preprocess()
#########################################################
### your code goes here ###
#features_train = features_train[:len(features_train)/100]
#labels_train = labels_train[:len(labels_train)/100]
print("features lenghth:",len(features_test))
from sklearn.svm import SVC
clf=SVC(kernel="rbf", C=10000.0)
t0 = time()
clf.fit(features_train, labels_train)
print "training time:", round(time()-t0, 3), "s"
t0 = time()
pred=clf.predict(features_test)
print "predict time:", round(time()-t0, 3), "s"
from sklearn.metrics import accuracy_score
print(accuracy_score(pred, labels_test))
i=0
for label in pred:
if label == 1:
i = i+1
print("total chris:", i)
#########################################################
參考:
Support Vector Machines-kernel functions
sklearn.svm.SVC
機(jī)器學(xué)習(xí)入門 - Udacity