1. 程式人生 > 實用技巧 >mooc機器學習第七天-分類支援向量機svm.svc

mooc機器學習第七天-分類支援向量機svm.svc

1.函式簡介

sklearn.svm.SVC(C=1.0,kernel='rbf',degree=3,gamma='auto',coef0=0.0,shrinking=True,probability=False,

Tol=0.001,cache_size200,class_weight=None,verbose=False, max_iter=-1,

decision_function_shape=None,random_state=None)

引數:

1、C:C-SVC的懲罰引數C預設值是1.0,C越大,相當於懲罰鬆弛變數,希望鬆弛變數接近0,即對誤分類的懲罰增大,趨向於對訓練集全分對的情況,這樣對訓練集測試時準確率很高,但泛化能力弱。C值小,對誤分類的懲罰減小,允許容錯,將他們當成噪聲點,泛化能力較強。

C一般可以選擇為:0.0001 到10000,選擇的越大,表示對錯誤例懲罰程度越大,可能會導致模型過擬合

2、kernel:核函式,預設是rbf,可以是'linear', 'poly', 'rbf', 'sigmoid', 'precomputed'

  0 – 線性:u'v

   1 – 多項式:(gamma*u'*v + coef0)^degree

  2 – RBF函式:exp(-gamma|u-v|^2)

  3 –sigmoid:tanh(gamma*u'*v + coef0)

數學表示式:

3、degree:多項式poly函式的維度,預設是3,選擇其他核函式時會被忽略。建議設定為2;

4、gamma:'rbf','poly'和'sigmoid'的核係數。當前預設值為'auto',它使用1 / n_features,如果gamma='scale'傳遞,則使用1 /(n_features * X.std())作為gamma的值。當前預設的gamma''auto'將在版本0.22中更改為'scale'。

5、coef0:核函式的常數項。對於'poly'和 'sigmoid'有用。

6、probability:預設False。是否啟用概率估計。必須在呼叫fit之前啟用它,並且會減慢該方法的速度。

7、shrinking:預設為true,是否採用shrinking heuristic(收縮啟發式)方法

8、tol:預設為1e-3,停止訓練的誤差值大小,

9、cache_size:預設為200,核函式cache快取大小

10、class_weight:{dict,'balanced'}。將類i的引數C設定為SVC的class_weight [i] * C.如果沒有給出,所有類都應該有一個權重。"平衡"模式使用y的值自動調整與輸入資料中的類頻率成反比的權重n_samples/(n_classes*np.bincount(y))

11、verbose:預設False。啟用詳細輸出。請注意,此設定利用libsvm中的每程序執行時設定,如果啟用,則可能無法在多執行緒上下文中正常執行。

12、max_iter:最大迭代次數。-1為無限制。

13、decision_function_shape:'ovo', 'ovr' or None, default=None3

14、random_state:預設 無。偽隨機數生成器的種子在對資料進行混洗以用於概率估計時使用。如果是int,則random_state是隨機數生成器使用的種子;如果是RandomState例項,則random_state是隨機數生成器;如果沒有,隨機數生成器所使用的RandomState例項np.random。

主要調節的引數有:C、kernel、degree、gamma、coef0。

與核函式相對應的libsvm引數建議:

1)對於線性核函式,沒有專門需要設定的引數

2)對於多項式核函式,有三個引數。-d用來設定多項式核函式的最高此項次數,也就是公式中的d,預設值是3。-g用來設定核函式中的gamma引數設定,也就是公式中的第一個r(gamma),預設值是1/k(k是類別數)。-r用來設定核函式中的coef0,也就是公式中的第二個r,預設值是0。

3)對於RBF核函式,有一個引數。-g用來設定核函式中的gamma引數設定,也就是公式中的第一個r(gamma),預設值是1/k(k是類別數)。

4)對於sigmoid核函式,兩個引數g以及r:gamma一般可選1 2 3 4,coef0選0.2 0.4 0.60.8 1

屬性:

support_:支援向量索引。

support_vectors_:支援向量。

n_support_:每一類的支援向量數目

dual_coef_:決策函式中支援向量的係數

coef_:賦予特徵的權重(原始問題中的係數)。這僅適用於線性核心。

intercept_:決策函式中的常量。

2.mooc例項簡介

3.程式碼

import  numpy as np
import  pandas as pd
from sklearn import  svm
from sklearn import  cross_validation

data=pd.read_csv('。/stock/000777.csv',encoding='gbk',
                 parse_dates=[0],index_col=0)#讀取資料,一點預處理
# print(data.head())
data.sort_index(0,ascending=True,inplace=True)
# print(data.head())
dayfeature=150
featurenum=5*dayfeature
# print(data.shape[0])
x=np.zeros((data.shape[0]-dayfeature-dayfeature,featurenum+1))
# print(x.shape)
y=np.zeros((data.shape[0]-dayfeature-dayfeature))


# print(data)
#利用range遍歷花式索引取值判斷賦值
for i in range(0,x.shape[0]):
    x[i, 0:featurenum] = np.array(data[i:i + dayfeature] \
[[u'收盤價', u'最高價', u'最低價', u'開盤價', u'成交量']]).reshape((1, featurenum))
    x[i, featurenum] = data.ix[i + dayfeature][u'開盤價']

for i in range(x.shape[0]):
    if data.ix[i + dayfeature][u'收盤價'] >= data.ix[i + dayfeature][u'開盤價']:
        y[i] = 1
    else:
        y[i] = 0

#呼叫演算法,訓練
clf=svm.SVC(kernel='rbf')
result=[]
for i in range(5):
      x_train,x_test,y_train,y_test=cross_validation.train_test_split(x,y,test_size=0.2)
      clf.fit(x_train,y_train)
      result.append(np.mean(y_test==clf.predict(x_test)))
print("svm classifier accuacy:")
print(result)