Python 准确度评分值错误:Can';t处理二进制和连续目标的混合

Python 准确度评分值错误:Can';t处理二进制和连续目标的混合,python,machine-learning,scikit-learn,linear-regression,prediction,Python,Machine Learning,Scikit Learn,Linear Regression,Prediction,我正在使用scikit学习中的线性模型。线性回归作为预测模型。它很好用,很完美。我在使用准确度评分指标评估预测结果时遇到问题 这是我真实的数据: 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.12884

我正在使用scikit学习中的
线性模型。线性回归
作为预测模型。它很好用,很完美。我在使用
准确度评分
指标评估预测结果时遇到问题

这是我真实的数据:

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
我的代码:

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
错误消息:

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

问题是真正的y是二进制的(0和1),而你的预测不是。您可能生成了概率,而不是预测,因此结果:)
尝试生成类成员资格,它应该会起作用

准确度\分数是一种分类指标,不能用于回归问题


sklearn.metrics.Accurance\u得分(y\u true,y\u pred)方法将
y\u pred定义为

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

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

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

1。生成预测标签:

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
LR=linear_model.LinearRegression()
y_preds=LR.预测(X_检验)
打印(y_preds)
输出:

[1 1 0 1]
y\u preds
现在可以用于
accurity\u score()
方法:
accurity\u score(y\u true,y\u pred)

2。为标签生成概率:

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
一些指标,如“精度-回忆-曲线(y\u-true,probas\u-pred)”要求概率,可按如下方式生成:

LR=linear_model.LinearRegression()
y_preds=LR.预测概率(X_检验)
打印(y_preds)
输出:

[0.87812372 0.77490434 0.30319547 0.84999743]

尽管这里有过多的错误答案试图通过数字操纵预测来规避错误,但错误的根本原因是理论问题而非计算问题:您试图在回归(即数字预测)模型中使用分类度量(精度)(
线性回归
),这是毫无意义的

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

Classification metrics can't handle a mix of binary and continuous target
尽管消息没有直接告诉您,您正在尝试计算一个对您的问题无效的度量(我们实际上不应该期望它走那么远),但scikit learn至少给您一个直接和明确的警告,表明您正在尝试错误的东西,这当然是一件好事;其他框架不一定如此——例如,请参阅,您根本没有收到任何警告,而有人最终抱怨回归设置中的“准确性”较低

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

因此,总结一下:问题是您正在为您的模型应用不合适的度量(精度)(
LinearRegression
):如果您处于分类设置中,您应该更改您的模型(例如,改为使用
LogisticRegression
);如果您处于回归(即数值预测)设置中,则应更改度量。检查,您可以确认精度仅用于分类

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

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

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


事实上,这已经在这里的其他几个答案中暗示过了,无论是否暗示;同样,这是一种无效的方法(你有负面预测的事实应该已经提醒你,它们不能被解释为概率)。安得烈NG在Coursera流行的机器学习课程中,解释了为什么这是一个坏主意——在YouTube上看到他(解释在凌晨3点开始),以及章节“强>4.2”为什么不是Hastie的(高度推荐和免费提供)教科书的线性回归[分类] < <强> >Tibshirani及其同事…

错误是因为y_pred和y_true的数据类型不同。y_true可能是dataframe,y_pred可能是arraylist。若您将两者都转换为数组,那个么问题将得到解决。

只需使用

y_pred = (y_pred > 0.5)
accuracy_score(y_true, y_pred, normalize=False)

我也面临同样的问题。y_测试和y_pred的数据类型是不同的。确保两者的数据类型相同。
线性回归
产生数值预测,而不是概率;该问题是由于试图在回归设置中使用精度,而