2017-09-24 353 views
0

我對機器學習是全新的,我試圖用scikit-learn用1個輸入變量(X)和一個二元結果(Y)來建立一個簡單的邏輯迴歸模型。我的數據包含325個樣本,39個成功和286個失敗。數據分成訓練和測試(30%)。如何確定sklearn邏輯迴歸的預測概率是否準確?

我的目標實際上是根據我的數據獲得任何給定X的預測成功概率,而不是爲了分類預測本身。也就是說,我將把預測的概率用於我正在構建的單獨模型中,並且不會將邏輯迴歸用作分類器。所以預測概率實際上適合數據很重要。

但是,我很難理解我的模型是否適合數據,或者如果計算的概率實際上是準確的。

我得到以下數據:

  • 分類精度:metrics.accuracy_score(Y_test,預測的) = 0.92。 我對這一指標的理解是,該模型有很高的機會做出正確的預測,所以它在我看來很像模型。

  • 登錄損失:cross_val_score(邏輯迴歸(),X,Y,得分= 'neg_log_loss',CV = 10) = -0.26 這可能是我最混亂的度量,顯然是最重要的它是預測概率的準確度。我知道越接近於零的分數越好 - 但距離足夠近?

  • AUC:metrics.roc_auc_score(Y_test,probs [:,1]) = 0.9。此外,這看起來不錯,因爲ROC分數越接近1越好。

  • 混淆矩陣:metrics.confusion_matrix(Y_test,預測) =

     [ 88, 0] 
          [8, 2] 
    

    在這裏,我的理解是,對角線給出設定所以這看起來不錯的訓練正確的預測數。

  • 報告:metrics.classification_report(Y_test,預測) =

      precision recall f1-score support 
    
    0.0  0.92  1.00  0.96  88 
    1.0  1.00  0.20  0.33  10 
    
    avg/total  0.93  0.92  0.89  98 
    

    根據這種分類報告顯示,該模型具有良好的精度所以它是一個不錯的選擇。 我不知道如何解釋召回,或者如果這個報告對我的模型來說是個壞消息 - sklearn文檔指出召回是一種能夠找到所有陽性樣本的模型 - 所以對於1的預測得分爲0.2意味着它只能在20%的時間內找到正數?這聽起來像是一個非常不適合的數據。

我真的很感激,如果有人可以澄清,我interpeting這些指標以正確的方式 - 也許闡明我的模型是否是好還是假的一些情況。另外,如果還有其他測試可以做,以確定計算出的概率是否準確,請讓我知道。

如果這些都不是很好的公制分數,我真的很感謝下一步的改進方向。

謝謝!

回答

4

您的數據集處於不平衡狀態,因爲失敗的成功率遠高於成功率。一個只能猜測失敗的分類器會獲得86%的分數,所以92%的精度並不令人印象深刻。

然後混淆矩陣顯示發生了什麼。 88次正確預測失敗,8次錯誤預測失敗。它只有兩次才能真正預測成功。

精度是它所做出的猜測數量是正確的:所以(88 + 2)/ 98 = 0.92%。成功召回只有(8 + 2)次成功(或20%)中的2次。

所以這個模型並不適合。有很多方法可以處理不平衡的數據集,如加權示例或在預測之前應用。混淆矩陣是查看真實情況的好方法。

2

您的數據患有類不平衡問題。您在訓練分類器時沒有指定處理它的任何方式。但是,即使您的準確度很高,也可能是因爲失敗樣本的數量非常大,因此您的測試集也可能會被填充。

要處理它,您可以使用Stratified split in sklearn來洗牌和拆分數據,以解決類別不平衡問題。

您還可以嘗試使用其他技術來改善分類,例如GridSearch。你可以閱讀更多關於模型評估here in this link。對於模型特定的交叉驗證技術,請檢查this section in sklearn.

你可以做的還有一件事,就是不用精確度作爲訓練分類器的指標,你可以專注於回憶和精確度(甚至在你的案例中甚至是真正的正確率)。您將需要使用make_scorer in sklearn。一個例子可以發現herehere。您也可能想要結賬F1分數或F_beta分數。

您還可以結帳this Github repository各種採樣技術來解決sklearn中的類不平衡問題。

您還可以結賬this answer以及更多技術。