我正在使用sklearn v 0.13.1 svm來試圖解決二進制分類問題。我使用kfold交叉驗證並計算roc曲線下的面積(roc_auc)來測試我的模型的質量。但是,對於某些摺疊,即使對於訓練數據,roc_auc也小於0.5。這不應該是不可能的嗎?算法總是不可能總是能夠達到0.5的數據呢?ROC下的sklearn svm面積小於0.5的訓練數據
這裏是我的代碼:
classifier = svm.SVC(kernel='poly', degree=3, probability=True, max_iter=100000)
kf = cross_validation.KFold(len(myData), n_folds=3, indices=False)
for train, test in kf:
Fit = classifier.fit(myData[train], classVector[train])
probas_ = Fit.predict_proba(myData[test])
fpr, tpr, thresholds = roc_curve(classVector[test], probas_[:,1])
roc_auc = auc(fpr, tpr)
probas_ = Fit.predict_proba(myData[train])
fpr2, tpr2, thresholds2 = roc_curve(classVector[train], probas_[:,1])
roc_auc2 = auc(fpr2, tpr2)
print "Training auc: ", roc_auc2, " Testing auc: ", roc_auc
輸出看起來是這樣的:
Training auc: 0.423920939062 Testing auc: 0.388436883629
Training auc: 0.525472613736 Testing auc: 0.565581854043
Training auc: 0.470917930528 Testing auc: 0.259344660194
是區域的曲線下的結果小於0.5有意義?原則上,如果列車和測試值均爲< 0.5,那麼我可以將每個點的預測顛倒過來,但我擔心某些事情會出錯。我認爲即使我完全給出了隨機數據,該算法在訓練數據上應該達到0.5?
嗨,非常感謝您的回覆。我嘗試使用pos_label,但它不能解決問題。如果我使用pos_label = 1,我會得到上面顯示的輸出。如果我使用pos_label = 0,我會得到反轉輸出(即顯示1值),這是我所期望的。我的y_true全部爲0或1,並與正確的事件相關聯。有沒有另外一種方法可能讓svm感到困惑?我已經通過文檔,但找不到任何跡象表明有辦法讓roc_auc <0.5。我知道分類器在一般情況下表現不佳,我只是試圖確保我理解這個工具包... – user3276811
可能是數據的奇怪關聯到非最佳內核的使用。不可能說沒有最小可重現的代碼。 – Calimo
@ user3276811我遇到了LogisticRegression類似的問題。你有沒有找到AUC <0.5來自哪裏? – jibounet