SVM 可用于離散因變量的分類和連續(xù)因變量的預(yù)測(cè),相對(duì)于單一的分類算法(Logistic、決策樹、KNN。樸素貝葉斯等)有更好的預(yù)測(cè)準(zhǔn)確率,因?yàn)樗梢詫⒌途S線性不可分的空間轉(zhuǎn)換為高維的線性可分空間。
基礎(chǔ)思想:支持向量機(jī)把分類問題轉(zhuǎn)化為尋找分類平面的問題,并通過最大化分類邊界點(diǎn)距離分類平面的距離來實(shí)現(xiàn)分類。
主要思想是利用某些支持向量所構(gòu)成的“超平面”,將不同類別的樣本點(diǎn)劃分,無論樣本點(diǎn)線性可分、近似線性可分或者非線性可分,都可以利用“超平面”將樣本點(diǎn)以較高的準(zhǔn)確度切割開來。
顯著優(yōu)點(diǎn):魯棒性(增加或刪除非支持向量的樣本點(diǎn),不會(huì)改變分類器的效果)
避免”維度災(zāi)難“的發(fā)生(模型不會(huì)隨數(shù)據(jù)維度提升而提高計(jì)算的復(fù)雜度)
避免過擬合,具有很好地泛化能力
解決小樣本下機(jī)器學(xué)習(xí)問題;
解決非線性問題;
無局部極小值問題(相對(duì)于神經(jīng)網(wǎng)絡(luò)等算法);
明顯缺點(diǎn):模型不適合大樣本的分類或預(yù)測(cè),內(nèi)存消耗大,會(huì)消耗大量的計(jì)算資源和
時(shí)間
對(duì)缺失樣本很敏感,建模之前清洗好,logistic Regression(邏輯回歸)
也對(duì)缺失值敏感
對(duì)參數(shù)調(diào)節(jié)和核函數(shù)的選擇敏感,原始分類器不加修改僅適用于處理二類
問題;
是黑盒模型,對(duì)計(jì)算得到的結(jié)果無法解釋
對(duì)于核函數(shù)的高維映射解釋力不強(qiáng),尤其是徑向基函數(shù);
應(yīng)用領(lǐng)域:文本分類、圖像識(shí)別、主要二分類領(lǐng)域。
分隔帶越寬,模型能將樣本點(diǎn)劃分的越清晰,模型泛化能力越強(qiáng),分類可信度越高。
SVM就是在努力尋找這個(gè)最寬的“帶”。
此數(shù)據(jù)集是當(dāng)一個(gè)用戶在設(shè)備中寫入某個(gè)字母時(shí),該設(shè)備需要準(zhǔn)確地識(shí)別并返回寫入字母的實(shí)際值,即根據(jù)字母的信息(寬度,高度,邊際)判斷屬于哪一種字母。
因?yàn)槟P蜕婕暗綉土P系數(shù)C(松弛因子的系數(shù))的影響,因此采用交叉驗(yàn)證的方法。
# 導(dǎo)入第三方模塊
from sklearn import svm
import pandas as pd
from sklearn import model_selection
from sklearn import metrics
# 讀取外部數(shù)據(jù)
letters = pd.read_csv(r'F:\letterdata.csv')
# 數(shù)據(jù)前5行
letters.head()

第一列l(wèi)etter為因變量
# 將數(shù)據(jù)拆分為訓(xùn)練集和測(cè)試集
predictors = letters.columns[1:]
X_train,X_test,y_train,y_test = model_selection.train_test_split(letters[predictors], letters.letter,
test_size = 0.25, random_state = 1234)
# 使用網(wǎng)格搜索法,選擇線性可分SVM“類”中的最佳C值
C=[0.05,0.1,0.5,1,2,5]
parameters = {'C':C}
parameters

grid_linear_svc = model_selection.GridSearchCV(estimator = svm.LinearSVC(),param_grid =parameters,scoring='accuracy',cv=5,verbose =1)
grid_linear_svc

# 模型在訓(xùn)練數(shù)據(jù)集上的擬合
grid_linear_svc.fit(X_train,y_train)
# 返回交叉驗(yàn)證后的最佳參數(shù)值
grid_linear_svc.best_params_, grid_linear_svc.best_score_

# 模型在測(cè)試集上的預(yù)測(cè)
pred_ linear_svc = grid_linear_svc.predict(X_test)
# 模型的預(yù)測(cè)準(zhǔn)確率
metrics.accuracy_score(y_test, pred_linear_svc)

經(jīng)過5重交叉驗(yàn)證,最佳懲罰系數(shù)為0.1,在訓(xùn)練數(shù)據(jù)集上的平均準(zhǔn)確率只有69.2%,在測(cè)試數(shù)據(jù)集上的預(yù)測(cè)準(zhǔn)確率也不足72%,說明線性可分SVM模型不太適合改數(shù)據(jù)集的擬合和預(yù)測(cè),使用非線性SVM重新建模。
# 使用網(wǎng)格搜索法,選擇非線性SVM“類”中的最佳C值
kernel=['rbf','linear','poly','sigmoid']
C=[0.1,0.5,1,2,5]
parameters = {'kernel':kernel,'C':C}
grid_svc = model_selection.GridSearchCV(estimator = svm.SVC(),param_grid =parameters,scoring='accuracy',cv=5,verbose =1)
# 模型在訓(xùn)練數(shù)據(jù)集上的擬合
grid_svc.fit(X_train,y_train)
# 返回交叉驗(yàn)證后的最佳參數(shù)值
grid_svc.best_params_, grid_svc.best_score_

# 模型在測(cè)試集上的預(yù)測(cè)
pred_svc = grid_svc.predict(X_test)
# 模型的預(yù)測(cè)準(zhǔn)確率
metrics.accuracy_score(y_test,pred_svc)

經(jīng)過5重交叉驗(yàn)證,最佳懲罰系數(shù)C為5,最佳核函數(shù)為徑向基核函數(shù),平均準(zhǔn)確率分別為97.34%,97.86%,說明非線性SVM模型更加理想。