核函數(shù)
往往會(huì)選擇高斯核函數(shù)
映射關(guān)系兩個(gè)不同變量之間求點(diǎn)乘吼虎,將其定義為核函數(shù)
如果n=3,則此多項(xiàng)式核函數(shù)有9+3+1=13個(gè)特征
多項(xiàng)式核函數(shù)世囊,把原函數(shù)映射成平方或更高次的維度
如圖,根據(jù)原有SVM脊僚,無(wú)法將cancer樣本區(qū)分出來(lái)距贷,所以需要利用核函數(shù)柄冲,將cancer樣本升維,其他樣本降維忠蝗,通過(guò)線(xiàn)性方式分開(kāi)
利用泰勒展式展開(kāi)现横,即形成第二行的算式
高斯核函數(shù),把原始的函數(shù)映射成無(wú)窮維
先求φ阁最,再去做映射是不可能的
高斯核函數(shù)->將線(xiàn)性的變成非線(xiàn)性
問(wèn):幾種核函數(shù)的使用和數(shù)據(jù)集分布有關(guān)么戒祠?
答:可以無(wú)腦式的先試試高斯核函數(shù),但是有些時(shí)候不見(jiàn)得一定使用高斯核函數(shù)速种,有些時(shí)候使用多項(xiàng)式核函數(shù)就夠了姜盈。
實(shí)踐中做一些探索性的項(xiàng)目,可以用SVM做圖像分類(lèi)配阵,可以解決問(wèn)題馏颂,也很穩(wěn)定,不一定需要神經(jīng)網(wǎng)絡(luò)棋傍。但是用高斯核函數(shù)救拉,在訓(xùn)練集很好,測(cè)試集卻過(guò)不了瘫拣。然后改成多項(xiàng)式核函數(shù)亿絮,就能把事情做得很好。
所以根據(jù)實(shí)踐情況麸拄,來(lái)確定是否合適壹无。
即如果沒(méi)有太多的先驗(yàn)知識(shí),可以先用高斯核函數(shù)感帅,但是在訓(xùn)練集效果好,測(cè)試集效果不好地淀,如過(guò)擬合失球,可以試著退回不太強(qiáng)的核函數(shù),即多項(xiàng)式核函數(shù)帮毁。也許能得到更好的效果实苞。
問(wèn):無(wú)窮維怎么算?
答:高斯核函數(shù)隱藏著φ(x)烈疚,相當(dāng)于幫我們做了無(wú)窮維黔牵。(保證半正定)
問(wèn):SVM做OCR合適么?
答:在現(xiàn)在的情況不一定合適爷肝。假定做中文的OCR猾浦,字符集成千上萬(wàn)陆错,假定有一萬(wàn)個(gè)常用字,則需要做一萬(wàn)個(gè)分類(lèi)金赦。分類(lèi)數(shù)量增多音瓷,SVM效果會(huì)降下去。只能說(shuō)有一定的可能性夹抗,但不一定非常合適绳慎。
懲罰因子越小,抗過(guò)擬合能力越強(qiáng)漠烧,寬度越大
問(wèn):(xgboost的問(wèn)題)用6分類(lèi)的數(shù)據(jù)杏愤,訓(xùn)練集與測(cè)試集分開(kāi)。為何出現(xiàn)過(guò)擬合已脓?訓(xùn)練集準(zhǔn)確率非常高珊楼,可是測(cè)試集非常差,請(qǐng)問(wèn)如何改進(jìn)摆舟?
答:可以嘗試減少樹(shù)的深度亥曹,增大λ的阻尼值
Python代碼實(shí)踐
1. 鳶尾花代碼
SVC指:支撐向量分類(lèi)器(Support Vector Classifier)
C取0.1,意味著α是從0~0.1
kernel: linear, 意味著使用線(xiàn)性核函數(shù)
decision function: 以鳶尾花三分類(lèi)為例恨诱,給出某一個(gè)樣本屬于哪個(gè)類(lèi)別的可能是比較大的
decision_function_shape: ovr媳瞪,one_vs_rest。
得到三個(gè)SVM照宝,根據(jù)得分大小蛇受,進(jìn)行分類(lèi)
2. decision_function
SVM多分類(lèi)器實(shí)現(xiàn),用若干個(gè)二分類(lèi)器厕鹃,合成一個(gè)多分類(lèi)器
可以加入np.set_printoptions(suppress=True)兢仰,控制numpy的輸出
scipy的:stats.multivariate_normal: 多元正態(tài)分布,將均值與方差喂給此函數(shù)剂碴,即可得到模型
用此模型調(diào)用rvs把将,即動(dòng)態(tài)隨機(jī)采樣(Random Variable Sample)
sigmas * 0.1的目的:方差不要太大,有利于各個(gè)點(diǎn)分散一些忆矛,不要太聚在一起
a = np.array((0, 1, 2, 3)).reshape((-1, 1))的目的察蹲,是將a轉(zhuǎn)換為:
arrary([[0],
? ? ? ? ? ? [1],
? ? ? ? ? ? [2],
? ? ? ? ? ? [3]])
的形式。
np.tile方法:如np.tile(a, N)催训,即將arrary:a洽议,復(fù)制N次,得到新的array漫拭。
如y = np.tile(a. 2)亚兄,則得到:
array([[0, 0],
? ? ? ? ? [1,1],
? ? ? ? ? [2,2],
? ? ? ? ? [3,3]])
然后,我們對(duì)y做flatten采驻,即做拉伸审胚,得到新的array:
array([0,0,1,1,2,2,3,3])
等同于y.reshape(-1,)
這個(gè)目的就是得到分類(lèi)向量y
svm的核函數(shù)使用的是高斯RBF, decistion function shape使用的是ovr: one-vs-rest匈勋,如果是4分類(lèi),則會(huì)輸出多行4列的矩陣菲盾。
還有一個(gè)類(lèi)別是ovo: one-vs-one颓影,從四個(gè)類(lèi)別之間兩兩之間做分類(lèi)器,其實(shí)需要6個(gè)值(12懒鉴,13诡挂,14,23临谱,24璃俗,34)。即decision_function輸出會(huì)是多行6列的矩陣悉默。
取得分最大的列索引為分配的類(lèi)別
穿插講解如何分類(lèi)
五角星相比藍(lán)線(xiàn)距離是負(fù)數(shù)城豁,相比紅線(xiàn)與黑線(xiàn)距離是正數(shù)。
而五角星到黑線(xiàn)距離更遠(yuǎn)抄课,則分類(lèi)會(huì)將五角星分類(lèi)到黑線(xiàn)類(lèi)別
PS: 負(fù)數(shù)代表不可能屬于這個(gè)類(lèi)別
decision_function唱星,會(huì)輸出各個(gè)類(lèi)別的得分,取得分最大的索引為分配的類(lèi)別跟磨。
3. SVM_draw
此截圖间聊,方便看全plt.scatter的所有參數(shù)
另一種簡(jiǎn)潔繪制方式:
4. ClassifierIndex
以預(yù)測(cè)疾病為例進(jìn)行解釋?zhuān)?/p>
精度(accuracy):將得病與未得病做對(duì)的預(yù)測(cè)/總樣本個(gè)數(shù)
準(zhǔn)確率(precision): 被診斷得病的樣本個(gè)數(shù)/被診斷得病的樣本個(gè)數(shù)+錯(cuò)誤診斷得病的樣本個(gè)數(shù)
召回率(recall): 被診斷得病的樣本個(gè)數(shù)/被診斷得病的樣本個(gè)數(shù)+得病但是沒(méi)有被診斷得病的樣本個(gè)數(shù)
Precision與Recall不可能同時(shí)增大,因此需要做加強(qiáng)抵拘,F(xiàn)1與Fβ就是做這個(gè)事情
如果β^2是∞哎榴,則Fβ就是Recall,如果β趨近于0僵蛛,則Fβ趨近于Precision
F1是什么呢尚蝌?當(dāng)然就是β為1時(shí)的公式啊
實(shí)際數(shù)據(jù):
4正? ? 2負(fù)
預(yù)測(cè)
正? ? 負(fù)
TP:3? ? FN:1
FP:2? ? TN:0
所以,
accuracy = (3 + 0) / (3 + 1 + 2 + 0) = 0.5
precision = 3 / 3 + 2 = 0.6
recall = 3 / 3 + 1 = 0.75
代碼示例
sklearn的metrics中充尉,已經(jīng)內(nèi)置了precision, recall, f1, fbeta的計(jì)算類(lèi)飘言,可以直接使用
classification_report,可以將precision, recall, f1-score, support的值驼侠,根據(jù)各個(gè)分類(lèi)热凹,整體輸出為一張表。非常方便泪电。
5. unBalance
class_weight的參數(shù):因?yàn)?的樣本數(shù)據(jù)只有10個(gè),所以權(quán)重設(shè)置很大纪铺,如class_weight={-1:1, 1:99}相速。但是設(shè)置為99未必一定好,設(shè)置為10其實(shí)效果也不錯(cuò)鲜锚,或者說(shuō)堪用了突诬,不會(huì)完全過(guò)擬合苫拍。
問(wèn):如果樣本不均衡比例達(dá)到1000:1,是不是只能通過(guò)增加樣本來(lái)建模旺隙?
答:1000:1的情況是普遍存在的绒极,比如金融欺詐數(shù)據(jù)。是的蔬捷,實(shí)在搞不定垄提,只能這樣了
6. HandWrittenDigits
數(shù)據(jù)下載地址:http://archive.ics.uci.edu/ml/machine-learning-databases/optdigits/
一行數(shù)據(jù)表示一副圖片:每行65個(gè)數(shù)字,前64個(gè)數(shù)字代表8x8的小圖片周拐,其數(shù)值代表黑色的強(qiáng)度:0~16铡俐,第65個(gè)數(shù)字代表對(duì)應(yīng)的數(shù)字。
使用SVM妥粟,即是十分類(lèi)問(wèn)題
此處取高斯核,為了穩(wěn)妥一些勾给,gamma值足夠小滩报,相當(dāng)于近似線(xiàn)性核
7. MNIST
28x28的圖像,數(shù)據(jù)下載地址為:https://pjreddie.com/projects/mnist-in-csv/
數(shù)據(jù)集第一列是代表的數(shù)字播急,之后28x28列的數(shù)字脓钾,代表數(shù)字各個(gè)點(diǎn)的黑度
所以特征集通過(guò): data.iloc[:,1:].values獲取
真實(shí)值y,通過(guò)data.iloc[:,0].values獲取
因?yàn)橐呀?jīng)有mnist_test.csv作為測(cè)試集旅择,所以無(wú)需train_test_split這個(gè)方法將訓(xùn)練集進(jìn)行拆分
這些代碼已經(jīng)經(jīng)過(guò)實(shí)際調(diào)試惭笑,確保運(yùn)行正常
訓(xùn)練集的初始圖片以及代表的數(shù)字:
SVM的核函數(shù)為高斯核函數(shù)
隨機(jī)森林訓(xùn)練的速度在一分鐘以?xún)?nèi)
訓(xùn)練集的準(zhǔn)確率在100%,隨機(jī)森林確實(shí)挺強(qiáng)的
但是SVM訓(xùn)練的速度就慢得多~~~
如果說(shuō)此例SVM算法的訓(xùn)練時(shí)間以及predict的時(shí)間生真,就令你懷疑人生沉噩,那是因?yàn)檫€沒(méi)有見(jiàn)過(guò)訓(xùn)練幾天幾夜也結(jié)束不了的數(shù)據(jù)集與相關(guān)算法。柱蟀。川蒙。
8. SVR
繪制支撐向量回歸的曲線(xiàn)
y: 正弦的曲線(xiàn),加上一點(diǎn)噪聲长已,噪聲給的大一些畜眨,樣本會(huì)隨著曲線(xiàn)抖動(dòng)的厲害一些
如果不要噪聲,則構(gòu)建完全在線(xiàn)的數(shù)據(jù)
很顯然术瓮,在這個(gè)例子康聂,多項(xiàng)式核的能力是讓我們吃驚的。完全沒(méi)有按照正弦趨勢(shì)走胞四。
而SVR恬汁,高斯核,則體現(xiàn)出正弦曲線(xiàn)的趨勢(shì)
問(wèn):SVR的損失函數(shù)辜伟?
答:SVR的損失函數(shù)與SVC的損失函數(shù)一致的氓侧。仍然是我們計(jì)算預(yù)測(cè)值和實(shí)際值誤差的平方脊另,作為它的損失值。但是這個(gè)值離的近的話(huà)约巷,依然給它更大的損失偎痛;如果這個(gè)值足夠遠(yuǎn),就不要給它損失了独郎。
9. Grid
問(wèn):隨機(jī)森林在實(shí)際應(yīng)用中踩麦,要把所有輸入特征離散化么?
答:這個(gè)根據(jù)具體情況囚聚。比如用隨機(jī)森林做了鳶尾花數(shù)據(jù)的分類(lèi)靖榕,而鳶尾花數(shù)據(jù),事實(shí)上是連續(xù)的顽铸。所以不見(jiàn)得所有特征都要做離散化