1. 程式人生 > >sklearn_svm_SVC方法簽名——程式碼

sklearn_svm_SVC方法簽名——程式碼

Sklearn中SVM方法詳解
1、SVM 在 sklearn 中採用 sklearn.svm.SVC 設定引數:
SVC函式的訓練時間是隨訓練樣本平方級增長,所以不適合超過10000的樣本。
多分類問題,SVC採用的是one-vs-one投票機制,需要兩兩類別建立分類器, 
訓練時間可能比較長。 
1.1 sklearn.svm.SVC 方法
sklearn.svm.SVC(
                C=1.0,  
                kernel='rbf',  
                degree=3, 
                gamma='auto'
, coef0=0.0, shrinking=True, probability=False, tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, decision_function_shape=None, random_state=None
)
1.2 主要調節的引數 (加粗的文字)
引數名稱 簡介 備註
C C-SVC的懲罰引數C,預設值是1.0 C是懲罰係數,即對誤差的寬容度。c越高,說 明越不能容忍出現誤差,容易過擬合。C越小, 容易欠擬合。
kernel 核函式,預設是rbf,可以是‘linear’,‘poly’,‘rbf’,‘sigmoid’,‘precomputed’ 0 – 線性:u’v 1 – 多項式;2 – RBF函式;3 –sigmoid;
probability 是否採用shrinking heuristic方法 預設為true
shrinking 是否採用shrinking heuristic方法 預設為true
degree 多項式poly函式的維度,預設是3,選擇其他核函式時會被忽略。
gamma ‘rbf’ , ‘poly’ 和‘sigmoid’的核函式引數。 預設是’auto’ ,則會選擇1/n_features, gamma越大,支援向量越少,gamma值越 小,支援向量越多。支援向量的個數影響訓 練與預測的速度
coef0 核函式的常數項。 常用於‘poly’和 ‘sigmoid’核函式
tol 停止訓練的誤差值大小 預設為1e-3
cache_size 核函式cache快取大小 預設為200
class_weight 類別的權重,字典形式傳遞 設定第幾類的引數C為weight*C(C-SVC中的C)
verbose 允許冗餘輸出
max_iter 最大迭代次數。 -1為無限制
decision_func tion_shape ‘ovo’ , ‘ovr’ or None default=None3
random_state 資料洗牌時的種子值,int值
2 使用多項式核模擬svm
from sklearn.svm import SVC
import matplotlib.pyplot as plt
import numpy as np 

X=np.array([[1,1],[1,2],[1,3],[1,4],[2,1],[2,2],[3,1],[4,1],[5,1],
[5,2],[6,1],[6,2],[6,3],[6,4],[3,3],[3,4],[3,5],[4,3],[4,4],[4,5]]) 
Y=np.array([1]*14+[-1]*6)
T=np.array([[0.5,0.5],[1.5,1.5],[3.5,3.5],[4,5.5]]) 
 #X為訓練樣本,Y為訓練樣本標籤(1和-1),T為測試樣本 

svc=SVC(
    kernel='poly',
    degree=2,
    gamma=1,
    coef0=0)

svc.fit(X,Y)
pre=svc.predict(T)
print("輸出預測結果:",pre)
print("輸出正類和負類支援向量總個數:",svc.n_support_)
print("輸出正類和負類支援向量索引:",svc.support_)
print("輸出正類和負類支援向量:","\n",svc.support_vectors_)

輸出預測結果: [ 1  1 -1 -1]
輸出正類和負類支援向量總個數: [2 3]
輸出正類和負類支援向量索引: [14 17  3  5 13]
輸出正類和負類支援向量: 
 [[3. 3.]
 [4. 3.]
 [1. 4.]
 [2. 2.]
 [6. 4.]]
3 基於RBF核方法對異或(XOR)問題的分類
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm 

xx, yy = np.meshgrid(np.linspace(-3, 3, 500),
                     np.linspace(-3, 3, 500))
np.random.seed(0)
X = np.random.randn(300, 2)
Y = np.logical_xor(X[:, 0] > 0, X[:, 1] > 0)

# fit the model
clf = svm.NuSVC()
clf.fit(X, Y) 

# plot the decision function for each datapoint on the grid
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

plt.imshow(Z, interpolation='nearest',
           extent=(xx.min(), xx.max(), yy.min(), yy.max()), 
           aspect='auto',
           origin='lower', 
           cmap=plt.cm.PuOr_r)

contours = plt.contour(xx, yy, Z, levels=[0], 
                       linewidths=2,linetypes='-')
plt.scatter(X[:, 0], X[:, 1], s=30, c=Y, 
            cmap=plt.cm.Paired,edgecolors='k')
plt.xticks(())
plt.yticks(())
plt.axis([-3, 3, -3, 3])
plt.show()

效果圖:

這裡寫圖片描述
4 使用 GridSearchCV 優化模型引數
from sklearn.svm import SVC 
from sklearn import model_selection            #拆分資料集
from sklearn.datasets import load_iris         #鳶尾花資料集
from sklearn.grid_search import GridSearchCV   #網格搜尋方法

from sklearn.metrics import confusion_matrix   #混淆矩陣
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score
from sklearn.metrics import f1_score
from sklearn.metrics import accuracy_score
from sklearn.metrics import classification_report 
iris=load_iris()
x=iris.data
y=iris.target 


X_train,X_test,y_train,y_test=model_selection\
                              .train_test_split(x,y,test_size=0.3,random_state=123456) 

parameters={
            'C':[0.001,0.01,0.1,1,10,100],
            'kernel':['linear','poly','rbf','sigmoid'],
            'gamma':[0.0001,0.001]
           }
svm=SVC()
grid_search=GridSearchCV(svm,parameters,scoring='accuracy',cv=5)
grid_search.fit(x,y)            # 檢視 GridSearchCV 方法引數 

grid_search.best_estimator_     # 檢視 SVC 方法最佳引數 

grid_search.best_score_         # 正確率 
grid_search.best_params_        # 最佳組合
svm=SVC(C=1,gamma=0.0001,kernel='linear')
svm.fit(X_train,y_train)        # 使用最佳引數訓練模型 

pred=svm.predict(X_test)        # 模型預測
print(classification_report(y_test,pred))