准确度分数 ValueError:无法处理二进制和连续目标的混合

新手上路,请多包涵

我正在使用来自 scikit-learn 的 linear_model.LinearRegression 作为预测模型。它有效而且很完美。我在使用 accuracy_score 指标评估预测结果时遇到问题。

这是我的真实数据:

 array([1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0])

我的预测数据:

 array([ 0.07094605,  0.1994941 ,  0.19270157,  0.13379635,  0.04654469,
    0.09212494,  0.19952108,  0.12884365,  0.15685076, -0.01274453,
    0.32167554,  0.32167554, -0.10023553,  0.09819648, -0.06755516,
    0.25390082,  0.17248324])

我的代码:

 accuracy_score(y_true, y_pred, normalize=False)

错误信息:

 ValueError: Can't handle mix of binary and continuous target

原文由 Arij SEDIRI 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
1 个回答

尽管这里有过多的错误答案试图通过数字操作预测来规避错误,但错误的根本原因是 理论 而非计算问题:您试图在回归(即数字)中使用 分类 指标(准确性)预测)模型( LinearRegression ),这是 没有意义 的。

就像大多数性能指标一样,准确性将苹果与苹果进行比较(即真实标签为 0/1,预测再次为 0/1);因此,当您要求函数将二进制真实标签(苹果)与连续预测(橘子)进行比较时,您会得到一个预期的错误,该消息从 计算 的角度准确地告诉您问题出在哪里:

 Classification metrics can't handle a mix of binary and continuous target

尽管该消息没有直接告诉您您正在尝试计算一个对您的问题无效的指标(我们实际上不应该期望它走那么远),但 scikit-learn 在至少给你一个直接和明确的警告,告诉你你正在尝试做错事;其他框架不一定是这种情况——例如 ,在非常相似的情况下,请参阅 Keras 的行为,在这种情况 下你根本没有收到任何警告,而最终只是抱怨回归设置中的“准确性”低……

我对这里的所有其他答案(包括已接受和高度赞成的答案)感到非常惊讶,这些答案有效地建议操纵预测以简单地消除错误;确实,一旦我们得到一组数字,我们当然可以开始以各种方式(舍入、阈值等)与它们混合,以使我们的代码正常运行,但这当然并不意味着我们的数字操作是在我们试图解决的 ML 问题的特定上下文中 _有意义_。

因此,总结一下:问题是您应用的指标(准确性) 适合您的模型( LinearRegression ):如果您处于分类设置中,则应更改模型(例如使用 LogisticRegression 代替);如果您处于回归(即数字预测)设置中,则应更改指标。检查 scikit-learn 中可用的指标列表,您可以在其中确认准确性仅用于分类。

还将情况与 最近的 SO question 进行比较,其中 OP 试图获得模型列表的准确性:

 models = []
models.append(('SVM', svm.SVC()))
models.append(('LR', LogisticRegression()))
models.append(('LDA', LinearDiscriminantAnalysis()))
models.append(('KNN', KNeighborsClassifier()))
models.append(('CART', DecisionTreeClassifier()))
models.append(('NB', GaussianNB()))
#models.append(('SGDRegressor', linear_model.SGDRegressor())) #ValueError: Classification metrics can't handle a mix of binary and continuous targets
#models.append(('BayesianRidge', linear_model.BayesianRidge())) #ValueError: Classification metrics can't handle a mix of binary and continuous targets
#models.append(('LassoLars', linear_model.LassoLars())) #ValueError: Classification metrics can't handle a mix of binary and continuous targets
#models.append(('ARDRegression', linear_model.ARDRegression())) #ValueError: Classification metrics can't handle a mix of binary and continuous targets
#models.append(('PassiveAggressiveRegressor', linear_model.PassiveAggressiveRegressor())) #ValueError: Classification metrics can't handle a mix of binary and continuous targets
#models.append(('TheilSenRegressor', linear_model.TheilSenRegressor())) #ValueError: Classification metrics can't handle a mix of binary and continuous targets
#models.append(('LinearRegression', linear_model.LinearRegression())) #ValueError: Classification metrics can't handle a mix of binary and continuous targets

前 6 个模型工作正常,而其余所有(注释掉的)模型都给出相同的错误。到目前为止,您应该能够说服自己所有注释掉的模型都是回归(而不是分类)模型,因此是合理的错误。

最后一个重要说明:有人声称:

好的,但我想使用线性回归,然后对输出进行舍入/阈值处理,有效地将预测视为“概率”,从而将模型转换为分类器

实际上,这已经在这里的其他几个答案中暗示或不暗示;同样,这是一种 无效 的方法(你有负面预测的事实应该已经提醒你它们不能被解释为概率)。 Andrew Ng 在他在 Coursera 上广受欢迎的机器学习课程中解释了为什么这是一个坏主意 - 请参阅他的 讲座 6.1 - 逻辑回归 | Youtube 上的 分类(解释从 ~ 3:00 开始),以及第 4.2 节为什么不是线性回归 [用于分类]? 由 Hastie、Tibshirani 和同事编写的(强烈推荐和免费提供的)教科书 统计学习简介……

原文由 desertnaut 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题