gpt4 book ai didi

python - 精度和召回率在模型中相同

转载 作者:行者123 更新时间:2023-12-05 02:06:23 25 4
gpt4 key购买 nike

我正在从事一个多分类项目,我注意到无论我运行什么分类器,模型中的准确率和召回率都是相同的。

分类问题具有三个不同的类别。数据量偏小,有 13k 个实例,分为测试 (0.8) 和训练 (0.2)。

训练数据的形状为 (10608, 28),标签的形状为 (10608, 3)(二值化标签)。

分类不平衡:

  • 标签 0 代表所有标签的 30%
  • 标签 1 代表所有标签的 4%
  • 标签 2 占所有标签的 66%。

我正在比较不同的分类器,以便稍后关注最有希望的分类器。在计算每个模型的精度和召回率时,我注意到它们在一个模型中始终相同。

由于精确率和召回率的计算方式,当假阴性预测的数量等于假阳性预测的数量时,它们可能相同 FP = FN

enter image description here

例子:

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

所有模型在一个模型中具有相同召回率和精确率的可能性有多大?我错过了什么吗?

最佳答案

发生这种情况是因为您正在计算分数的 micro 平均值。在文档中,它被描述为:

Calculate metrics globally by counting the total true positives, false negatives and false positives.

现在问题来了:在保证每个测试用例都被分配到一个类的分类任务中,计算 micro 平均值等同于计算准确度分数。这就是为什么您在每个模型中得到相同精度和召回率的结果:您基本上是在计算所有情况下的精度。

您可以使用 accuracy_score 来验证这一点并比较结果。

因此,您应该使用 macroweighted 平均值来更好地评估模型的精度和召回率。

关于python - 精度和召回率在模型中相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62792001/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com