[英]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 使用StratifiedKFold
或KFold
來構建折疊:
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.