ML 監(jiān)督學(xué)習(xí) 分類 支持向量機(jī)

SVM最初被用來解決線性分類問題濒持,加入核方法之后能有效解決非線性問題织咧。

分類學(xué)習(xí)基本思想:
基于訓(xùn)練集在樣本空間中找到一個(gè)劃分超平面张弛,將不同類別的樣本分開.

選擇最優(yōu)超平面的依據(jù):
1.無法找到其他繪制方法使得到兩條虛線之間的距離更大
2.最優(yōu)超平面到與兩種類型距其最近的點(diǎn)有相等的距離



支持向量(support.vector)就是離分隔超平面最近的那些點(diǎn)缤骨。

SVM

硬間隔(Hard Margin)
嚴(yán)格地規(guī)定所有的數(shù)據(jù)都必須劃分正確列林,即所有數(shù)據(jù)都在虛線兩邊


Hard Margin

軟間隔(Soft Margin)
允許一些樣本落在間隔內(nèi)(兩條虛線中間)舍败,防止出現(xiàn)過度擬合威沫。


Soft Margin

這種情況下我們要盡可能正確地分類訓(xùn)練數(shù)據(jù)帽衙,間隔要盡可能大。
C值大纸巷,間隔小江醇。C值小,間隔大何暇。
可用交叉驗(yàn)證確定C值。
如果SVM模型過擬合凛驮,可以嘗試通過減小超參數(shù)C去調(diào)整.

線性不可分問題

任何有限維度的非線性問題在更高維度的空間里總可以變化成線性可分問題裆站。
SVM使用拉格朗日乘子法(Lagrange Multiplier)實(shí)現(xiàn)對超平面求解問題的升維。


Non-Linear
核函數(shù)

SVM其實(shí)并不需要真正的向量,可以用它們的數(shù)量積來進(jìn)行分類宏胯。這意味著可以避免計(jì)算資源的耗費(fèi)了羽嫡。這就是核函數(shù)的技巧,它可以減少大量的計(jì)算資源的需求肩袍。通常杭棵,內(nèi)核是線性的,所以可得到一個(gè)非線性的分類器:只需改變點(diǎn)積為我們想要的空間氛赐。

在不知道特征映射的形狀時(shí)魂爪,我們并不知道什么樣的核函數(shù)是合適的,于是“核函數(shù)選擇”成為支持向量機(jī)的最大變數(shù)艰管。

線性核(linear)

多項(xiàng)式核(polynomial)

c=1時(shí)退化為線性核

高斯徑向基核(Gaussian radial basis function)

Sigmoid核

decision_function()函數(shù)可以返回輸入的數(shù)據(jù)集與模型超平面之間的距離滓侍,用正負(fù)關(guān)系表示在超平面的哪一側(cè)。該距離的絕對值越大則分類的可靠性越高牲芋。

非線性
import numpy as np 
import matplotlib.pyplot as plt 
from sklearn.datasets import make_circles 
from mpl_toolkits.mplot3d import Axes3D 
  
# generating data 
X, Y = make_circles(n_samples = 500, noise = 0.05) 
  
# visualizing data 
plt.scatter(X[:, 0], X[:, 1], c = Y, marker = '.') 
plt.show() 

# adding a new dimension to X 
X1 = X[:, 0].reshape((-1, 1)) 
X2 = X[:, 1].reshape((-1, 1)) 
X3 = (X1**2 + X2**2) 
X = np.hstack((X, X3)) 

# visualizing data in higher dimension 
fig = plt.figure() 
axes = fig.add_subplot(111, projection = '3d') 
axes.scatter(X1, X2, X1**2 + X2**2, c = Y, depthshade = True) 
plt.show() 

# consider a grid search with an SVM and different kernels 
import multiprocessing
import warnings               
warnings.filterwarnings('ignore')

from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC
from sklearn.model_selection import cross_val_score

param_grid = [ {'kernel': ['linear', 'rbf', 'poly', 'sigmoid'],
                'C': [ 0.1, 0.2, 0.4, 0.5, 1.0, 1.5, 1.8, 2.0, 2.5, 3.0 ]
} ]
gs = GridSearchCV(estimator=SVC(), param_grid=param_grid, 
                  scoring='accuracy', cv=10)
gs.fit(X, Y)

GridSearchCV(cv=10, error_score='raise', 
             estimator=SVC(C=1.0, kernel='rbf', max_iter=-1),
             param_grid=[{'kernel': ['linear', 'rbf', 'poly', 'sigmoid'], 
             'C': [0.1, 0.2, 0.4, 0.5, 1.0, 1.5, 1.8, 2.0, 2.5, 3.0 ]}],
             scoring='accuracy')

print(gs.best_estimator_)
print(gs.best_score_)             

# create support vector classifier using a linear kernel 
from sklearn import svm 
  
svc = svm.SVC(kernel = 'linear') 
svc.fit(X, Y) 
w=svc.coef_
b=svc.intercept_ 
  
# plotting the separating hyperplane 
x1 = X[:, 0].reshape((-1, 1)) 
x2 = X[:, 1].reshape((-1, 1)) 
x1, x2 = np.meshgrid(x1, x2) 
x3 = -(w[0][0]*x1 + w[0][1]*x2 + b) / w[0][2] 
  
fig = plt.figure() 
axes2 = fig.add_subplot(111, projection = '3d') 
axes2.scatter(X1, X2, X1**2 + X2**2, c = Y, depthshade = True) 
axes1 = fig.gca(projection = '3d') 
axes1.plot_surface(x1, x2, x3, alpha = 0.01) 
plt.show() 

在noise=0.05時(shí)撩笆,輸出結(jié)果顯示最好的核是rbf,且準(zhǔn)確率達(dá)到了98%。
在noise=0.1時(shí)缸浦,最好的核是linear,準(zhǔn)確率為85.6%

人臉識別
from sklearn.datasets import fetch_lfw_people 
faces = fetch_lfw_people(min_faces_per_person=60)
print(faces.target_names)
print(faces.images.shape) 

from sklearn.svm import SVC
from sklearn.decomposition import PCA
from sklearn.pipeline import make_pipeline 
 
pca = PCA(n_components=150, whiten=True, random_state=19)
svc = SVC(kernel='rbf', class_weight='balanced')
model = make_pipeline(pca, svc)

from sklearn.model_selection import train_test_split
Xtrain, Xtest, ytrain, ytest = train_test_split(faces.data, faces.target,random_state=19)

#用網(wǎng)格搜索交叉檢驗(yàn)來尋找最優(yōu)參數(shù)組合
from sklearn.model_selection import GridSearchCV
param_grid =[{'kernel':['rbf','poly'],
              'C': [1, 5, 10, 50],                      # C:控制邊界線的硬度
              'gamma': [0.0001, 0.0005, 0.001, 0.005]}] #gamma:控制徑向基函數(shù)核的大小

grid = GridSearchCV(estimator=SVC(), param_grid=param_grid,
                    scoring='accuracy',cv=8) 
grid.fit(faces.data,faces.target)

GridSearchCV(cv=8, error_score='raise', 
             estimator=SVC(C=1.0, kernel='rbf', max_iter=-1),
             param_grid=[{'kernel': [ 'rbf', 'poly'], 
                          'C': [0.1, 0.5, 1.0, 1.5],
                          'gamma':[0.0001, 0.0005, 0.001, 0.005]}],
             scoring='accuracy')

print(grid.best_estimator_)
print(grid.best_score_)     

model = grid.best_estimator_ 
yfit = model.predict(Xtest)

#from sklearn.metrics import classification_report
#print(classification_report(ytest, yfit, target_names=faces.target_names)) 
手寫數(shù)字識別

from sklearn.datasets import load_digits
digits = load_digits()
跟上個(gè)例子一樣可以用網(wǎng)格搜索的方法夕冲,只需改成digits.data, digits.target

總結(jié)
Conclusion
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市裂逐,隨后出現(xiàn)的幾起案子歹鱼,更是在濱河造成了極大的恐慌,老刑警劉巖絮姆,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件醉冤,死亡現(xiàn)場離奇詭異,居然都是意外死亡篙悯,警方通過查閱死者的電腦和手機(jī)蚁阳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鸽照,“玉大人螺捐,你說我怎么就攤上這事“牵” “怎么了定血?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長诞外。 經(jīng)常有香客問我澜沟,道長,這世上最難降的妖魔是什么峡谊? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任茫虽,我火速辦了婚禮刊苍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘濒析。我一直安慰自己正什,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布号杏。 她就那樣靜靜地躺著婴氮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盾致。 梳的紋絲不亂的頭發(fā)上主经,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機(jī)與錄音绰上,去河邊找鬼旨怠。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蜈块,可吹牛的內(nèi)容都是我干的鉴腻。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼百揭,長吁一口氣:“原來是場噩夢啊……” “哼爽哎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起器一,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤课锌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后祈秕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渺贤,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年请毛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了志鞍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,814評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡方仿,死狀恐怖固棚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情仙蚜,我是刑警寧澤此洲,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站委粉,受9級特大地震影響呜师,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贾节,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一匣掸、第九天 我趴在偏房一處隱蔽的房頂上張望趟紊。 院中可真熱鬧,春花似錦碰酝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至暖释,卻和暖如春袭厂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背球匕。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工纹磺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人亮曹。 一個(gè)月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓橄杨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親照卦。 傳聞我的和親對象是個(gè)殘疾皇子式矫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容