2013-11-03 27 views
1

我試圖優化我的SVM,使用交叉驗證來估計我的性能。在python中更改SVM的C參數

看來,改變C參數什麼都不做 - 怎麼會出現?

from sklearn import cross_validation 
from sklearn import svm 
for C in [0.1, 0.5, 1.0, 2.0, 4.0]: 
    clf = svm.SVC(kernel='linear', C=C) 
    scores = cross_validation.cross_val_score(clf, X, y, cv=6, n_jobs = -1) 
    print C, scores 

結果是

> 0.1 [ 0.88188976 0.85826772 0.90118577 0.90909091 0.8972332 0.86561265] 
> 0.5 [ 0.88188976 0.85826772 0.90118577 0.90909091 0.8972332 0.86561265] 
> 1.0 [ 0.88188976 0.85826772 0.90118577 0.90909091 0.8972332 0.86561265] 
> 2.0 [ 0.88188976 0.85826772 0.90118577 0.90909091 0.8972332 0.86561265] 
> 4.0 [ 0.88188976 0.85826772 0.90118577 0.90909091 0.8972332 0.86561265] 
+0

喜!你有樣本X(和其他必要的)變量嗎?另外,如果你不使用'for',而是每次運行時都使用硬代碼C,你會看到相同的值嗎? (想知道在每個python會話中是否有奇怪的內存問題......) – arturomp

+0

特徵向量非常大(大約4000條),所以很難給出一個樣本X.我會嘗試用更簡單的方法重新創建問題模型也許。 – eran

+0

您應該使用GridSearchCV來處理您正在嘗試的操作。 http://scikit-learn.org/dev/modules/grid_search.html –

回答

3

這些似乎的方式在C值小的變化​​看到任何差別。嘗試了一套

C = [ 10**x for x in xrange(10) ] 

,以檢查是否一切工作正常,你應該打印模式,而不僅僅是結果。您的SVC對象包含有關支持向量的信息 - 只需打印它們即可查看,C中的更改確實會影響算法訓練SVM的方式。

對於線性內核可以打印:

print clf.coef_ 
print clf.intercept_ 

非線性內核:

print clf.dual_coef_ 
print clf.support_vectors_ 
print clf.intercept_ 
+0

我試過了(對於'多聚'內核,嘗試C = 1.0和C = 10,000,000.0),所有的結果和係數是相同的。看來C不會影響任何東西。 – eran

+0

您是否按照建議打印了係數? C **確實會改變一切:)但是在多核的情況下,它也與** d **的選擇有關(對於** d的某些值** ** ** C **中的變化可能確實是最小的)。 – lejlot