簡體   English   中英

cross_val_score 與 sklearn 中的不同分類器的行為不同

[英]cross_val_score behaves differently with different classifiers in sklearn

我在sklearn中的cross_val_score()遇到了一些困難。

我已經使用以下代碼實例化了一個KNeighborsClassifier

clf = KNeighborsClassifier(n_neighbors=28)

然后,我使用交叉驗證來了解此分類器在我的特征 ( x ) 和目標系列 ( y ) 的df上的准確性,具體如下:

cv_score_av = np.mean(cross_val_score(clf, x, y, cv=5))

每次運行腳本時,我都希望獲得不同的結果,但是沒有設置random_state=None的選項,例如RandomForestClassifier() 有沒有辦法在每次運行時獲得不同的結果,或者在我的KNeighborsClassifier model 上運行cross_val_score之前,我必須手動隨機打亂我的數據。

從您的角度來看,這里似乎存在一些誤解; 隨機森林中的random_state參數是指算法本身,而不是交叉驗證部分。 這樣的論點在這里是必要的,因為 RF 確實在 model 構建中包含了一些隨機性(實際上,很多隨機性,正如算法名稱所暗示的那樣); 但相比之下,knn 是一種確定性算法,因此原則上它不需要使用任何random_state

也就是說,您的問題確實有效; 我過去曾評論cross_val_score中缺少洗牌參數的這種煩人且不便的情況。 深入研究文檔,我們看到 function 使用StratifiedKFoldKFold來構建折疊:

cv: int,交叉驗證生成器或可迭代的,可選

對於整數/無輸入,如果估計器是分類器並且y是二元或多類,則使用StratifiedKFold 在所有其他情況下,使用KFold

正如您從鏈接的文檔頁面中可以輕松看到的那樣,這兩個函數都使用shuffle=False作為默認值。

無論如何,解決方案很簡單,只包含一行額外的代碼; 您只需將cv=5替換為調用先前定義的StratifiedKFold object 和shuffle=True

from sklearn.model_selection import StratifiedKFold

skf = StratifiedKFold(n_splits=5, shuffle=True)
cv_score_av = np.mean(cross_val_score(ml_10_knn, x, y, cv=skf))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM