[英]precision_recall_fscore_support return the same value precision recall
[英]Precision and recall are the same within a model
我正在做一个多分类项目,我注意到无论我运行什么分类器,model 中的精度和召回率都是相同的。
分类问题具有三个不同的类别。 数据量偏小,13k 个实例分为测试(0.8)和训练(0.2)。
训练数据的形状为 (10608, 28),标签的形状为 (10608, 3)(二值化标签)。
分类不平衡:
我正在比较不同的分类器,以便稍后关注最有前途的分类器。 在计算每个 model 的精度和召回率时,我注意到它们在 model 中总是相同的。
由于准确率和召回率的计算方式,当假阴性预测的数量等于假阳性预测的数量FP = FN
时,它们可能是相同的。
例子:
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
并比较结果来验证这一点。
因此,您应该更好地使用macro
或weighted
平均来评估模型的精度和召回率。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.