1. 程式人生 > >利用 sklearn SVM 分類器對 IRIS 資料集分類

利用 sklearn SVM 分類器對 IRIS 資料集分類

利用 sklearn SVM 分類器對 IRIS 資料集分類

支援向量機(SVM)是一種最大化分類間隔的線性分類器(如果不考慮核函式)。通過使用核函式可以用於非線性分類。SVM 是一種判別模型,既適用於分類也適用於迴歸問題,標準的 SVM 是二分類器,可以採用 “one vs one” 或 “one vs rest” 策略解決多分類問題。

相關原理推導參考:

https://blog.csdn.net/v_JULY_v/article/details/7624837
https://wizardforcel.gitbooks.io/dm-algo-top10/content/svm-1.html


https://charlesliuyx.github.io/2017/09/19/支援向量機SVM學習筆記/

sklearn 工具包提供了用於二分類或多分類以及迴歸的實現。參考:http://sklearn.apachecn.org/cn/0.19.0/modules/svm.html#svm-kernels

例如:

from sklearn import svm
clf = svm.SVC(attr_name1=value1, ...)
clf.fit(X,Y)
y_predict = clf.predict(y_test)

其中,構造器中常用的引數有:

C : 懲罰係數(預設為 1.0)

kernel : “rbf” | “linear” | “poly” | “sigmoid” | … (預設為“rbf”)

在這裡插入圖片描述

probability : Ture | False (預設為False)

decision_function_shape : “ovr” | “ovo” (預設為“ovr”)

分別採用 linear 和 rbf 核對 IRIS 資料集進行分類,採用“one vs one”策略。

# -*- coding: utf-8 -*-
from sklearn import datasets
from sklearn import svm
import numpy as np

if __name__ == '__main__':

    iris = datasets.load_iris(
) print(type(iris), dir(iris)) x = iris.get('data') y = iris.get('target') # 隨機劃分訓練集和測試集 num = x.shape[0] # 樣本總數 ratio = 7/3 # 劃分比例,訓練集數目:測試集數目 num_test = int(num/(1+ratio)) # 測試集樣本數目 num_train = num - num_test # 訓練集樣本數目 index = np.arange(num) # 產生樣本標號 np.random.shuffle(index) # 洗牌 x_test = x[index[:num_test],:] # 取出洗牌後前 num_test 作為測試集 y_test = y[index[:num_test]] x_train = x[index[num_test:],:] # 剩餘作為訓練集 y_train = y[index[num_test:]] clf_linear = svm.SVC(decision_function_shape="ovo", kernel="linear") clf_rbf = svm.SVC(decision_function_shape="ovo", kernel="rbf") clf_linear.fit(x_train, y_train) clf_rbf.fit(x_train, y_train) y_test_pre_linear = clf_linear.predict(x_test) y_test_pre_rbf = clf_rbf.predict(x_test) # 計算分類準確率 acc_linear = sum(y_test_pre_linear==y_test)/num_test print('linear kernel: The accuracy is', acc_linear) acc_rbf = sum(y_test_pre_rbf==y_test)/num_test print('rbf kernel: The accuracy is', acc_rbf)