簡體   English   中英

為什么實施類權重會使模型變得更糟

[英]Why does implementing class weights make the model worse

我正在嘗試進行二進制分類,一個類(0)大約是另一個類(1)的三分之一。 當我通過正常的前饋神經網絡運行原始數據時,准確度約為 0.78。 但是,當我實現 class_weights 時,准確度下降到大約 0.49。 如果沒有 class_weights,roc 曲線似乎也做得更好。 為什么會發生這種情況,我該如何解決?

II 已經嘗試過改變模型,實現正則化,dropouts 等,但似乎沒有改變整體准確率

這就是我獲得權重的方式: class_weights = class_weight.compute_class_weight('balanced', np.unique(y_train), y_train) class_weight_dict = dict(enumerate(class_weights))

這是沒有權重的結果:

在此處輸入圖像描述 在此處輸入圖像描述 在此處輸入圖像描述

這是權重:

在此處輸入圖像描述 在此處輸入圖像描述 在此處輸入圖像描述

我希望使用 class_weights 的結果會更好,但事實恰恰相反。 即使是 roc 似乎也沒有在重量方面做得更好。

由於類不平衡,始終選擇多數類的非常弱的基線將獲得大約 75% 的准確度。

在沒有類權重的情況下訓練的網絡的驗證曲線似乎表明它正在選擇一個接近於總是選擇多數類的解決方案。 從網絡中可以看出這一點並沒有比它在第一個 epoch 中獲得的驗證准確度提高太多。

我建議查看混淆矩陣、精度和召回指標,以獲取有關哪種模型更好的更多信息。

這個答案似乎為時已晚,但我希望它無論如何都會有所幫助。 我只想補充四點:

  • 由於您的數據比例是少數:25% 和多數:75%,因此准確度計算為:

accuracy = True positive + true negative / (true positive + true negative + false positive + false negative)

因此,如果您將准確度視為一個指標,那么任何模型很可能通過簡單地一直預測多數類來實現大約 75% 的准確度。 這就是為什么在驗證集上,模型無法正確預測。

  • 雖然使用類權重,學習曲線並不平滑,但模型實際上開始學習,並且在驗證集上不時失敗。

  • 如前所述,也許改變 F1 分數等指標會有所幫助。 我看到你正在實現 tensorflow,tensorflow 在他們的插件上有度量 F1 分數,你可以在他們文檔中找到它。 對我來說,我查看了 scikit learn 中的分類報告,假設您想查看模型在驗證集 (X_val, y_val) 上的表現:

from sklearn.metrics import classification_report
y_predict = model.predict(X_val, batch_size=64, verbose=1
print(classification_report(y_val, y_predict))
  • 您可能想要嘗試的其他技術(例如同時實現上采樣和下采樣)或 SMOTE 會有所幫助。

祝你好運!

暫無
暫無

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

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