日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

svm 交叉验证 python_【python机器学习笔记】SVM实例:有毒蘑菇预测

發布時間:2025/3/19 python 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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实例:有毒蘑菇预测的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。