Scikit F-score 度量误差

Posted

技术标签:

【中文标题】Scikit F-score 度量误差【英文标题】:Scikit F-score metric error 【发布时间】:2015-10-19 01:30:20 【问题描述】:

我正在尝试使用 Logistic Regression from SciKit. 预测一组标签 我的数据确实不平衡(“0”标签比“1”标签多)所以我必须在交叉验证步骤中使用 F1 score metric来“平衡”结果。

[Input]
X_training, y_training, X_test, y_test = generate_datasets(df_X, df_y, 0.6)
logistic = LogisticRegressionCV(
    Cs=50,
    cv=4,
    penalty='l2', 
    fit_intercept=True,
    scoring='f1'
)
logistic.fit(X_training, y_training)
print('Predicted: %s' % str(logistic.predict(X_test)))
print('F1-score: %f'% f1_score(y_test, logistic.predict(X_test)))
print('Accuracy score: %f'% logistic.score(X_test, y_test))

[Output]
>> Predicted: [0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0]
>> Actual:    [0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 1 1]
>> F1-score: 0.285714
>> Accuracy score: 0.782609
>> C:\Anaconda3\lib\site-packages\sklearn\metrics\classification.py:958:  
   UndefinedMetricWarning:
   F-score is ill-defined and being set to 0.0 due to no predicted samples.

我当然知道问题与我的数据集有关:它太小(它只是真实数据的一个样本)。但是,任何人都可以解释我看到的“UndefinedMetricWarning”警告的含义吗?幕后究竟发生了什么?

【问题讨论】:

附带说明,如果您的数据集真的不平衡(例如 100000 个“0”和只有 20 个“1”),您可能希望从分类任务转向异常检测方法。对于极度偏斜的情况,它会工作得更好。详情:scikit-learn.org/stable/modules/outlier_detection.html 这里的不平衡大约是 70-30%,所以我认为仍然适合使用经典分类器。但是,您的评论对于那些在真正偏斜的数据集上苦苦挣扎的人可能非常有价值,所以无论如何感谢您的提示:) 【参考方案1】:

这似乎是一个已知的错误here 已修复,我想你应该尝试更新 sklearn。

【讨论】:

我在 scikit-learn 0.17 中收到此错误消息。关于这个问题的任何更新?我的课程几乎是平衡的。【参考方案2】:

但是,任何人都可以解释我看到的“UndefinedMetricWarning”警告的含义吗?幕后究竟发生了什么?

https://***.com/a/34758800/1587329 对此进行了很好的描述:

https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/metrics/classification.py

F1 = 2 * (精度 * 召回率) / (精度 + 召回率)

precision = TP/(TP+FP) 正如你刚才所说,如果预测器没有 完全预测正类 - 精度为 0。

recall = TP/(TP+FN),如果预测器没有预测为正 类 - TP 为 0 - 召回率为 0。

所以现在你正在划分 0/0。

要解决权重问题(分类器很容易(几乎)总是预测更普遍的类别),您可以使用class_weight="balanced"

logistic = LogisticRegressionCV(
    Cs=50,
    cv=4,
    penalty='l2', 
    fit_intercept=True,
    scoring='f1',
    class_weight="balanced"
)

LogisticRegressionCV 说:

“平衡”模式使用 y 的值自动调整权重,与输入数据中的类频率成反比,如 n_samples / (n_classes * np.bincount(y))

【讨论】:

以上是关于Scikit F-score 度量误差的主要内容,如果未能解决你的问题,请参考以下文章

sklearn 度量单位的准确性,平均绝对误差,回归问题的均方误差?

机器学习笔记1——经验误差模型评估方法和性能度量

如何获取 Scikit-learn 的 svm 中的训练误差?

使用 scikit 学习重构误差分析的快速 ICA

scikit-learn 中的负平均绝对误差是多少?

[数值计算-3]:误差的种类误差传播误差分析