当前位置: 首页 > 知识库问答 >
问题:

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

党宇定
2023-03-14

我正在使用linear_model。来自scikit的线性回归学习作为预测模型。它很有效,也很完美。我无法使用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

共有3个答案

顾烨磊
2023-03-14

问题在于,真正的 y 是二进制的(零和一),而你的预测不是。您可能生成了概率而不是预测,因此结果:)相反,尝试生成类成员资格,它应该可以工作!

丌官积厚
2023-03-14

accuracy_score是分类度量,不能用于回归问题。

您可以在文档中查看可用的回归指标。

羊舌炯
2023-03-14

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

就像大多数性能指标一样,准确度会逐个进行比较(即真正的标签为0/1,预测值再次为0/1);因此,当您要求函数将二进制真标签(apples)与连续预测(oranges)进行比较时,您会得到一个预期的错误,其中的消息从计算的角度准确地告诉您问题是什么:

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

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

我对这里的所有其他答案(包括接受的答案)感到非常惊讶

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

还将这种情况与最近的SO问题进行比较,其中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个模型工作正常,而所有其他(注释掉)模型给出相同的错误。到现在为止,您应该能够说服自己,所有注释掉的模型都是回归(而不是分类)模型,因此是合理的错误。

最后一个重要的提示:有人声称:

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

实际上,这一点已经在其他几个回答中暗示过了,不管是含蓄的还是不含蓄的;同样,这是一个无效的方法(事实上,你有负面的预测应该已经提醒你,它们不能被解释为概率)。吴恩达在他在Coursera上的热门机器学习课程中解释了为什么这是一个坏主意——参见他在Youtube上的讲座6.1 -逻辑回归|分类(解释从大约3:00开始),以及4.2节为什么不是线性回归[用于分类]?由Hastie,Tibshirani和他的同事编写的《统计学习入门》(强烈推荐,免费提供)...

 类似资料:
  • 我想用来解决多类分类问题。的值为1-热编码,例如: ValueError:分类度量不能处理多标签指示器和二进制目标的混合 当我编写或而不是时,我无法编译模型。

  • 我正在通过AWS-EC2上的Binance api从Binance获取OHLCV数据。但有时(几天一次)会出现错误“104,‘EconReset’”,程序停止。 该程序是用Python3.7.3编写的,在AWS-EC2上运行 代码如下。但此代码无法继续。 我想在出现任何api或连接错误时继续运行程序。 我应该如何处理这个错误? 所有错误质量如下所示。 Traceback(最近一次调用最后):Fil

  • 我正在使用maven项目运行selenium测试,但是当我运行测试文件时,我收到了错误:无法连接到二进制FirefoxBinary(C:\Program Files(x86)\Mozilla Firefox\Firefox)。在端口7055上。它打开FF an的空白页,然后测试结果抛出错误: 这些是我的文件: 我有FireFox 51.0和selenium-java 2.45.0(jar)。

  • 本文向大家介绍GO语言标准错误处理机制error用法实例,包括了GO语言标准错误处理机制error用法实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了GO语言标准错误处理机制error用法。分享给大家供大家参考。具体分析如下: 在 Golang 中,错误处理机制一般是函数返回时使用的,是对外的接口,而异常处理机制 panic-recover 一般用在函数内部。 error 类型介绍 e

  • 问题内容: 我有一个排序的数组,想要对它进行二进制搜索。 所以我想问一下Swift库中是否已有诸如sort等的东西?还是有类型独立版本可用? 当然,我可以自己编写它,但是我想避免再次发明轮子。 问题答案: 这是使用二进制搜索的通用方法:

  • 在我的spring integration应用程序中,我有一个异步网关方法,它指定了errorChannel。 On Error-我希望通过向ErrorChannel注册集成流来处理错误(我能够成功地做到这一点)。 一旦错误被处理和处理,我可能需要有条件地发送到另一个通道进行进一步处理,并在最后回复回网关。实现这一点的最佳方法是什么? 示例-> 我如何做到这一点?