簡體   English   中英

cross_val_score與scoring ='roc_auc'和roc_auc_score有什么區別?

[英]What is the difference between cross_val_score with scoring='roc_auc' and roc_auc_score?

我對cross_val_score評分指標'roc_auc'和我可以直接導入和調用的roc_auc_score之間的區別感到困惑。

文檔( http://scikit-learn.org/stable/modules/model_evaluation.html#scoring-parameter )表明指定scoring ='roc_auc'將使用sklearn.metrics.roc_auc_score。 但是,當我使用scoring ='roc_auc'實現GridSearchCV或cross_val_score時,我會收到非常不同的數字,當我直接調用roc_auc_score時。

這是我的代碼,以幫助演示我所看到的:

# score the model using cross_val_score

rf = RandomForestClassifier(n_estimators=150,
                            min_samples_leaf=4,
                            min_samples_split=3,
                            n_jobs=-1)

scores = cross_val_score(rf, X, y, cv=3, scoring='roc_auc')

print scores
array([ 0.9649023 ,  0.96242235,  0.9503313 ])

# do a train_test_split, fit the model, and score with roc_auc_score

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)
rf.fit(X_train, y_train)

print roc_auc_score(y_test, rf.predict(X_test))
0.84634039111363313 # quite a bit different than the scores above!

我覺得我在這里遺漏了一些非常簡單的東西 - 很可能是我如何實施/解釋其中一個評分指標的錯誤。

任何人都可以解釋兩個得分指標之間差異的原因嗎?

這是因為你提供了預測的y而不是roc_auc_score中的概率。 此功能采用分數,而不是分類標簽。 請嘗試改為:

print roc_auc_score(y_test, rf.predict_proba(X_test)[:,1])

它應該給出與cross_val_score的先前結果類似的結果。 有關詳細信息,請參閱此帖子

我只是碰到了類似的問題在這里 關鍵的一點是, cross_val_score使用KFold策略和默認參數來進行訓練測試分裂,這意味着分成連續的塊而不是混亂。 另一方面, train_test_split進行了train_test_split分割。

解決方案是明確拆分策略並指定混洗,如下所示:

shuffle = cross_validation.KFold(len(X), n_folds=3, shuffle=True)
scores = cross_val_score(rf, X, y, cv=shuffle, scoring='roc_auc')

自己陷入這個問題,挖了一下就找到了答案。 分享愛情。

實際上有兩個半問題。

  1. 你需要使用相同的Kfold來比較分數(火車/測試的相同分割);
  2. 您需要將概率提供給roc_auc_score (使用predict_proba()方法)。 但是,一些估算器(如SVC)沒有predict_proba()方法,然后使用decision_function()方法。

這是一個完整的例子:

# Let's use the Digit dataset
digits = load_digits(n_class=4)
X,y = digits.data, digits.target
y[y==2] = 0 # Increase problem dificulty
y[y==3] = 1 # even more

使用兩個估算器

LR = LogisticRegression()
SVM = LinearSVC()

拆分火車/測試裝置。 但是將它保存到我們可以重用的變量中。

fourfold = StratifiedKFold(n_splits=4, random_state=4)

將其輸入GridSearchCV並保存分數。 請注意,我們通過了fourfold

gs = GridSearchCV(LR, param_grid={}, cv=fourfold, scoring='roc_auc', return_train_score=True)
gs.fit(X,y)
gs_scores = np.array([gs.cv_results_[k][0] for k in gskeys])

將其輸入cross_val_score並保存分數。

 cv_scores = cross_val_score(LR, X, y, cv=fourfold, scoring='roc_auc')

有時候,你想循環並計算幾個不同的分數,所以這就是你使用的。

loop_scores = list()
for idx_train, idx_test in fourfold.split(X, y):
  X_train, y_train, X_test, y_test = X[idx_train], y[idx_train], X[idx_test], y[idx_test]
  LR.fit(X_train, y_train)
  y_prob = LR.predict_proba(X_test)
  auc = roc_auc_score(y_test, y_prob[:,1])
  loop_scores.append(auc)

我們是否全面擁有相同的分數?

print [((a==b) and (b==c)) for a,b,c in zip(gs_scores,cv_scores,loop_scores)]
>>> [True, True, True, True]


但是,有時我們的估算器沒有predict_proba()方法。 所以,根據這個例子 ,我們這樣做:

 for idx_train, idx_test in fourfold.split(X, y): X_train, y_train, X_test, y_test = X[idx_train], y[idx_train], X[idx_test], y[idx_test] SVM.fit(X_train, y_train) y_prob = SVM.decision_function(X_test) prob_pos = (y_prob - y_prob.min()) / (y_prob.max() - y_prob.min()) auc = roc_auc_score(y_test, prob_pos) 

暫無
暫無

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

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