2015-05-08 35 views
1

我對scikit學習中的精度和召回值有疑問。我正在使用功能SGDClassifier來分類我的數據。 爲了評估性能,我使用了精度和召回函數precision_recall_fscore_support,但是每次運行程序時,我在精度和召回矩陣中都有不同的值。我怎樣才能擁有真正的價值? 我的代碼是:Scikit學習SGDClassifier:精度和召回每次更改值

scalerI = preprocessing.StandardScaler() 
X_train = scalerI.fit_transform(InputT) 
X_test = scalerI.transform(InputCross) 
clf = SGDClassifier(loss="log", penalty="elasticnet",n_iter=70) 
y_rbf = clf.fit(X_train,TargetT) 
y_hat=clf.predict(X_test) 
a= clf.predict_proba(X_test) 
p_and_rec=precision_recall_fscore_support(TargetCross,y_hat,beta=1) 

謝謝

回答

1

docs SGDClassifier有random_state PARAM被初始化爲None,這是用於隨機數生成的種子值。您需要修改這個值,因此結果是可重複這樣設置random_state=0或者你想

clf = SGDClassifier(loss="log", penalty="elasticnet",n_iter=70, random_state=0) 

應產生相同的結果每次運行

從文檔什麼最喜歡的數字:

random_state :int seed,RandomState實例或None(默認值)當隨機數數據混洗時使用的僞隨機數生成器的種子。

+0

哦,謝謝你!我不明白隨機狀態的含義。所以現在的問題可能是如何選擇最好的數字來獲得最好的結果 – PSan

+0

不用擔心,請測試,如果它解決了您的問題,請記住接受我的答案,我的答案左上角會有一個空的刻度標記。這會捕獲很多人,包括我自己,總是檢查分類器的構造函數是否具有'random_state'參數。 – EdChum

+0

只是檢查,它的工作原理!謝謝 – PSan

0

我遇到了同樣的問題,除非在params網格上使用GridSearchCV運行SGDClassifier。我甚至在SGDClassifier上設置了random_state。我注意到,如果我多次運行網格搜索,那麼從運行到運行的參數組合的平均得分並不那麼微妙。我甚至將warm_start = False設置爲確保每個參數組合運行都是乾淨的初始化。

+0

所以我想出了導致GridSearchCV中隨機化的原因。如果交叉驗證參數未傳遞到網格搜索中,並且您有多個類,則網格搜索默認使用分層kfolds,並使用它自己的隨機數據混排。如果使用一組random_state初始化一個KFolds,並將其傳遞到網格搜索中,則多次網格搜索運行的變化量將降至1.00E-05 – Turbo