2014-02-05 72 views
4

我正在使用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?

回答

1

事實上,你可以反轉你的預測,這就是爲什麼你的AUROCs是< 0.5。這通常不是問題,它可能只意味着classifier.fitroc_curve錯誤地解釋了您傳遞的classVector。相反,修復它可能更好 - 閱讀他們的文檔以瞭解他們期望的數據。特別是,您沒有指定哪些標籤是正面的。請參閱pos_label參數roc_curve並確保y_true已正確指定。

然而,有些令人擔憂的是,你的AUROCs在訓練集上大於0.5,而且大部分都接近它。它可能意味着你的分類器表現不如隨機更好。

+0

嗨,非常感謝您的回覆。我嘗試使用pos_label,但它不能解決問題。如果我使用pos_label = 1,我會得到上面顯示的輸出。如果我使用pos_label = 0,我會得到反轉輸出(即顯示1值),這是我所期望的。我的y_true全部爲0或1,並與正確的事件相關聯。有沒有另外一種方法可能讓svm感到困惑?我已經通過文檔,但找不到任何跡象表明有辦法讓roc_auc <0.5。我知道分類器在一般情況下表現不佳,我只是試圖確保我理解這個工具包... – user3276811

+0

可能是數據的奇怪關聯到非最佳內核的使用。不可能說沒有最小可重現的代碼。 – Calimo

+0

@ user3276811我遇到了LogisticRegression類似的問題。你有沒有找到AUC <0.5來自哪裏? – jibounet