簡體   English   中英

model 中的精度和召回率相同

[英]Precision and recall are the same within a model

我正在做一個多分類項目,我注意到無論我運行什么分類器,model 中的精度和召回率都是相同的。

分類問題具有三個不同的類別。 數據量偏小,13k 個實例分為測試(0.8)和訓練(0.2)。

訓練數據的形狀為 (10608, 28),標簽的形狀為 (10608, 3)(二值化標簽)。

分類不平衡:

  • label 0 代表所有標簽的 30%
  • label 1 代表所有標簽的 4%
  • label 2 代表所有標簽的 66%。

我正在比較不同的分類器,以便稍后關注最有前途的分類器。 在計算每個 model 的精度和召回率時,我注意到它們在 model 中總是相同的。

由於准確率和召回率的計算方式,當假陰性預測的數量等於假陽性預測的數量FP = FN時,它們可能是相同的。

在此處輸入圖像描述

例子:

SGD 分類器

sgd_clf = OneVsRestClassifier(SGDClassifier(random_state=42))
sgd_clf.fit(data_tr, labels_tr)
y_pred_sgd = cross_val_predict(sgd_clf, data_tr, labels_tr, cv=5) 
cm_sgd = confusion_matrix(labels_tr.argmax(axis=1), y_pred_sgd.argmax(axis=1))  

cm_sgd:
array([[1038,   19, 2084],
       [ 204,   22,  249],
       [ 931,   48, 6013]], dtype=int64)
precision_score(labels_tr.argmax(axis=1), y_pred_sgd.argmax(axis=1), average="micro")  
0.666760935143288
recall_score(labels_tr.argmax(axis=1), y_pred_sgd.argmax(axis=1), average="micro") 
0.666760935143288

FP=FN=3535

邏輯回歸

lr_clf = OneVsRestClassifier(LogisticRegression(random_state=42, max_iter=4000))
lr_clf.fit(data_tr, labels_tr)
y_pred_lr = cross_val_predict(lr_clf, data_tr, labels_tr, cv=5)
cm_lr = confusion_matrix(labels_tr.argmax(axis=1), y_pred_lr.argmax(axis=1))

cm_lr: 
array([[ 982,    1, 2158],
       [ 194,    7,  274],
       [ 774,    9, 6209]], dtype=int64)

precision_score(labels_tr.argmax(axis=1), y_pred_lr.argmax(axis=1), average="micro") 
0.6785444947209653
recall_score(labels_tr.argmax(axis=1), y_pred_lr.argmax(axis=1), average="micro") 
0.6785444947209653


FP=FN=3410

隨機森林

rf_clf = OneVsRestClassifier(RandomForestClassifier(random_state=42))
rf_clf.fit(data_tr, labels_tr)
y_pred_forest = cross_val_predict(rf_clf, data_tr, labels_tr, cv=5)
cm_forest = confusion_matrix(labels_tr.argmax(axis=1), y_pred_forest.argmax(axis=1)) 

cm_forest: 
array([[1576,   56, 1509],
      [ 237,   45,  193],
      [1282,   61, 5649]], dtype=int64)
precision_score(labels_tr.argmax(axis=1), y_pred_forest.argmax(axis=1), average="micro")
0.6853318250377074
recall_score(labels_tr.argmax(axis=1), y_pred_forest.argmax(axis=1), average="micro")  
0.6853318250377074

FP=FN=3338

所有模型在 model 中具有相同召回率和精度的可能性有多大? 我錯過了什么嗎?

發生這種情況是因為您正在計算分數的micro平均值。 在文檔中,它被描述為:

通過計算總的真陽性、假陰性和假陽性來全局計算指標。

現在有一個問題:在保證每個測試用例都被分配給一個 class 的分類任務中,計算一個micro平均值相當於計算准確度分數。 這就是為什么您在每個 model 中獲得相同的精度和召回結果的原因:您基本上是在計算所有情況下的精度。

您可以通過使用accuracy_score並比較結果來驗證這一點。

因此,您應該更好地使用macroweighted平均來評估模型的精度和召回率。

暫無
暫無

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

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