svm 交叉验证 python_【python机器学习笔记】SVM实例:有毒蘑菇预测
假如我手上有一個未知的蘑菇,我知道它的一系列特征(傘蓋形狀、發現地點、顏色、氣味等等),但是僅僅依靠個人的經驗判斷能不能吃難免會翻車,這就要用到更多的經驗。大數據就很好地解決了這個個人經驗缺乏的問題:如果你已經閱盡了10000個蘑菇,那么你就能做出更加準確的判斷了。
SVM支持向量機
SVM是機器學習中的一種方法,在2011年前后深度學習爆發之前曾統治機器學習數十年。它實現簡單,在很多情況下表現優秀,需要的數據量小,因此成為機器學習的經典方法之一。
SVM定位:線性分類器,也就是用一條直線劃分二維平面上的數據(或用n-1維的不彎曲物體劃分n維的數據),另一個著名的線性分類器是邏輯回歸模型(區別可以自行百度)。
假設處理二維的數據,數據有一個變量x,一個預測值y。在平面中的分割直線則設為kx+b=0。如果找到一條直線,它離兩個類別中的點距離最大,則為最好的直線。有了這樣一條分割線,就可以計算坐標中的點是在這條線的哪一邊,也就是屬于哪一類。
如何找到這條直線:畫與這條直線距離相等的兩條平行線(讓這條直線它又長又寬),使它們與平面上的點有接觸(也可以理解成這條直線寬到與平面上的點接觸),兩邊首次接觸到的平行直線之間的中線就是最佳的直線。兩條平行直線接觸到的至少3個點為支持向量。
為什么是3個點:兩條平行直線分別通過兩個不同的點并不能確定它們的斜率,而一條直線通過兩個點、另一條直線通過另一個點且與之平行就能確定兩條直線的位置。
但是在實際情況中,數據的類別之間并不是分的那么明顯,有可能有極端情況,也就是一個標號為A類別的數據實際上離B類別的樣本更近,卻與A類別相差大。那么這里就引進了一個松弛參數C。它可以調整對極端值的懲罰力度,控制兩條線之間間隔大小。再根據交叉驗證可以找到效果最好的C。
實例:SVM建模——藍瘦香菇到底有沒有毒
數據集:8000多條蘑菇的數據,有23個特征。其中是否有毒是因變量,其余特征為自變量。Mushroom Data Set
特征舉例
{傘蓋形狀:鐘形/平面/圓錐/凸出/圓球/凹進};
{氣味:杏仁味/魚腥味/臭味/泥土味/無味/刺鼻/辣味};
{地點:草地/樹葉/牧場/道路/城市/垃圾場/樹木}
……
數據預處理
import pandas as pd
import numpy as np
%matplotlib inline
import numpy as np
from scipy import stats
mush_df = pd.read_csv('mushrooms.csv')
mush_df_encoded = pd.get_dummies(mush_df)
把分類特征轉化為one-hot表示,這樣雖然特征數量增加了幾倍,但是保證每個特征對應的值為0或1。用pandas包里的get_dummies(data)可以很輕松地實現。
這樣特征維度就從23變成了119,其中因變量(有毒/無毒)也被拆分為兩個特征,第一列是'無毒',1表示無毒,0表示有毒;第二列只是反過來表示。因此在后續訓練的時候自變量只有119-2=117個,因變量依然是一個。
# 將特征和類別標簽分別賦值給 X 和 y,因變量y選擇第二列(1有毒,0無毒)
X_mush = mush_df_encoded.iloc[:,2:]#所有行、第三列及往后
y_mush = mush_df_encoded.iloc[:,1]#所有行、第二列(第二列是‘有毒’,1表示有毒,0表示無毒)
訓練SVM
from sklearn.svm import SVC
from sklearn.decomposition import PCA
from sklearn.pipeline import make_pipeline
pca = PCA(n_components=117, whiten=True, random_state=42)
n_components可將數據壓縮為n維向量,發現在這個案例中n最多取117(自變量的維度數量)。這個降維功能多用于上萬維度的向量,可以壓縮為千維簡便計算。但是如果在這個案例中設置n=2,壓縮為2維,準確率下降較大。
考慮到這個數據維度也不是很大,完全可以不降維。因此n_components=117。
svc = SVC(kernel='linear', class_weight='balanced')
kernel設置為線性可分(而非核函數,核函數是一個類別的數據被另一個類別包圍,而蘑菇數據一般不會這樣)
建立模型:
model = make_pipeline(pca, svc)
劃分訓練數據和測試數據。隨機數種子用來確保每一次建立的訓練集/測試集數據固定:
from sklearn.model_selection import train_test_split
Xtrain, Xtest, ytrain, ytest = train_test_split(X_mush, y_mush, random_state=41)
調參:通過交叉驗證尋找最佳的松弛參數C
from sklearn.model_selection import GridSearchCV
param_grid = {'svc__C':[1,2,5,10]}#設置的C可能的值是1,2,5,10,可以自由設置
grid = GridSearchCV(model,param_grid)
%time grid.fit(Xtrain, ytrain)
print(grid.best_params_)
print結果是1,也就是說C=1的時候訓練效果最好,分割最高效
model=grid.best_estimator_
因此把model參數設置為C=1
訓練好的svm儲存在model里,那么這個訓練好的模型到底好不好用呢?
現在把它調用來做預測:
yfit=model.predict(Xtest)
預測過程就相當于遮住測試集蘑菇的真實情況(有毒/無毒),只看117個自變量特征,預測這個蘑菇是不是有毒,然后和真實情況做對比。
預測結果怎樣?生成報告:
from sklearn.metrics import classification_report
print(classification_report(ytest, yfit))
結果是100%正確!0代表無毒蘑菇,1047個全都預測出來了;1代表有毒蘑菇,984個也全都預測出來了。而且機器沒有把一個有毒蘑菇的當成無毒的。可以放心地食用啦!
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的svm 交叉验证 python_【python机器学习笔记】SVM实例:有毒蘑菇预测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: map 长度_Python实用教程系列—
- 下一篇: lottie动画_神器基于Lottie的