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)