運行環境
Python: 3.7.1
庫: sklearn (Python的機器學習工具箱)
目的:
根據鳶尾花的四個特征,對三種鳶尾花進行分類
數據(共150行,這里截取前6行,完整數據以及代碼的下載鏈接見文末):
方法:調用內部SVM庫進行鳶尾花分類
特征1 | 特征2 | 特征3 | 特征4 | 鳶尾花類型 |
---|---|---|---|---|
5.1 | 3.5 | 1.4 | 0.2 | Iris-setosa |
4.9 | 3 | 1.4 | 0.2 | Iris-setosa |
4.7 | 3.2 | 1.3 | 0.2 | Iris-setosa |
4.6 | 3.1 | 1.5 | 0.2 | Iris-setosa |
5 | 3.6 | 1.4 | 0.2 | Iris-setosa |
5.4 | 3.9 | 1.7 | 0.4 | Iris-setosa |
代碼如下:
from sklearn.model_selection import train_test_split
from sklearn import svm
data_Set = []
data_Set_x = []
data_Set_y = []
#打開數據集,字符串前加r表示raw string,防止路徑字符串中存在的反斜杠帶來的轉義
data_file = open(r"D:\\Coding\\Py\\Machine-Learning\\SVM_OLD\\Data_SVM.csv")
#拆分數據集,取前四列為x,第五列為y
for line in data_file.readlines():
lineArr = line.strip().split(',')
data_Set.append(lineArr)
data_Set_x.append(lineArr[0:4])
data_Set_y.append(lineArr[4])
#按照7:3的比例分割訓練集和測試集
data_train_x, data_test_x = train_test_split(data_Set_x,
test_size=0.3,
random_state=55)
data_train_y, data_test_y = train_test_split(data_Set_y,
test_size=0.3,
random_state=55)
"""
分別利用四種核函數進行訓練,這些核函數都可以設置參數,例如
decision_function_shape='ovr'時,為one v rest,即一個類別與其他類別進行划分,
decision_function_shape='ovo'時,為one v one,即將類別兩兩之間進行划分,用二分類的方法模擬多分類的結果。
不設置的話會使用默認參數設置
"""
#使用linear線性核函數,C越大分類效果越好,但是可能過擬合
clf1 = svm.SVC(C=1, kernel='linear',
decision_function_shape='ovr').fit(data_train_x, data_train_y)
#使用rbf徑向基核函數,gamma值越小,分類界面越連續;gamma值越大,分類界面越“散”,分類效果越好,但有可能會過擬合。
clf2 = svm.SVC(C=1, kernel='rbf', gamma=1).fit(data_train_x, data_train_y)
#使用poly多項式核函數
clf3 = svm.SVC(kernel='poly').fit(data_train_x, data_train_y)
#使用sigmoid神經元激活核函數
clf4 = svm.SVC(kernel='sigmoid').fit(data_train_x, data_train_y)
#打印使用不同核函數進行分類時,訓練集和測試集分類的准確率
print("linear線性核函數-訓練集:", clf1.score(data_train_x, data_train_y))
print("linear線性核函數-測試集:", clf1.score(data_test_x, data_test_y))
print("rbf徑向基核函數-訓練集:", clf2.score(data_train_x, data_train_y))
print("rbf徑向基函數-測試集:", clf2.score(data_test_x, data_test_y))
print("poly多項式核函數-訓練集:", clf3.score(data_train_x, data_train_y))
print("poly多項式核函數-測試集:", clf3.score(data_test_x, data_test_y))
print("sigmoid神經元激活核函數-訓練集:", clf4.score(data_train_x, data_train_y))
print("sigmoid神經元激活核函數-測試集:", clf4.score(data_test_x, data_test_y))
# 使用decision_function()可以查看決策函數
print(clf1.decision_function(data_train_x))
# 使用predict()可以查看預測結果
print(clf1.predict(data_train_x))
運行結果:
- 分類准確率
linear線性核函數-訓練集: 1.0
linear線性核函數-測試集: 0.9555555555555556
rbf徑向基核函數-訓練集: 0.9904761904761905
rbf徑向基函數-測試集: 0.9555555555555556
poly多項式核函數-訓練集: 1.0
poly多項式核函數-測試集: 0.9333333333333333
sigmoid神經元激活核函數-訓練集: 0.34285714285714286
sigmoid神經元激活核函數-測試集: 0.3111111111111111
- 決策函數(僅截取部分,每一列的值代表到各類別的舉例)
[[-0.18006398 1.06550708 2.1145569 ]
[-0.2266221 1.07558987 2.15103223]
[-0.16806693 1.08720057 2.08086637]
[ 2.07795355 1.29285195 -0.3708055 ]
[-0.18840558 1.05553666 2.13286892]
[-0.20384 1.10258546 2.10125453]
- 分類結果(僅截取部分)
['Iris-virginica' 'Iris-virginica' 'Iris-virginica' 'Iris-setosa'
'Iris-virginica' 'Iris-virginica' 'Iris-setosa' 'Iris-versicolor'
'Iris-virginica' 'Iris-versicolor' 'Iris-setosa' 'Iris-setosa'
代碼以及數據集下載:
鏈接:https://pan.baidu.com/s/1iZo472Ynvav0mQK3VvpJFQ
提取碼:ovri
參考文章: