准确性得分ValueError:无法处理二进制目标和连续目标的混合
machine-learning
python
scikit-learn
4
0

我正在使用来自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:无法处理二进制目标和连续目标的混合

帮帮我 ?谢谢。

参考资料:
Stack Overflow
收藏
评论
共 5 个回答
高赞 时间 活跃

编辑(注释后):以下内容将解决编码问题,但强烈建议不要使用此方法,因为线性回归模型的分类器非常差,很可能无法正确分离类。

阅读@desertnaut在下面写得很好的答案,解释为什么此错误暗示着机器学习方法中的某些错误,而不是您必须“修复”的某些错误。

accuracy_score(y_true, y_pred.round(), normalize=False)
收藏
评论

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

收藏
评论

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

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

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

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

我对这里的所有其他答案(包括公认的且被高度推崇的答案)感到非常惊讶,这有效地建议您操纵预测结果以简单地摆脱错误;的确,一旦我们得到一组数字,我们当然可以开始以各种方式(舍入,阈值等)将它们混合在一起,以使我们的代码行事,但这当然并不意味着我们的数字操作是在我们要解决的ML问题的特定上下文中有意义

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

将情况与最近的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

前六个模型工作正常,而其余所有(注释掉)的模型给出相同的错误。到现在为止,您应该能够使自己确信所有注释掉的模型都是回归模型(而不是分类模型),因此是有道理的错误。

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

可以,但是我想使用线性回归,然后仅对输出进行四舍五入,将预测有效地视为“概率”,从而将模型转换为分类器

实际上,这已经在其他一些答案中得到了暗示,无论是否隐含。再次,这是一种无效的方法(并且您的负面预测这一事实早已提醒您不能将其解释为概率)。吴安德(Andrew Ng)在Coursera受欢迎的机器学习课程中解释了为什么这是一个坏主意-请参阅他的第6.1讲-Logistic回归|在YouTube上进行分类 (解释从〜3:00开始),以及第4.2为何不进行线性回归(用于分类)? Hastie,Tibshirani和他的同事(强烈推荐和免费获得)教科书《统计学习入门》中 ...

收藏
评论

precision_score是一个分类指标,您不能将其用于回归问题。

您可以在此处查看可用的回归指标

收藏
评论

sklearn.metrics。 accuracy_score(y_true,y_pred)方法定义y_pred为:

y_pred :类似于1d数组,或标签指示符数组/稀疏矩阵。 预测标签 ,由分类器返回。

这意味着y_pred必须为1或0的数组(谓词标签)。他们不应该是概率。

谓词标记(1和0)和/或预测的概率可以分别使用LinearRegression()模型的方法predict()和predict_proba()生成。

1.生成预测标签:

LR = linear_model.LinearRegression()
y_preds=LR.predict(X_test)
print(y_preds)

输出:

[1 1 0 1]

'y_preds'现在可以用于precision_score()方法: accuracy_score(y_true, y_pred)

2.生成标签的概率:

诸如“ precision_recall_curve(y_true,probas_pred)”之类的某些指标需要概率,可以按如下方式生成:

LR = linear_model.LinearRegression()
y_preds=LR.predict_proba(X_test)
print(y_preds)

输出:

[0.87812372 0.77490434 0.30319547 0.84999743]

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号