Python 准确度评分值错误:Can';t处理二进制和连续目标的混合
我正在使用scikit学习中的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
线性模型。线性回归
作为预测模型。它很好用,很完美。我在使用准确度评分
指标评估预测结果时遇到问题
这是我真实的数据:
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的数据类型是不同的。确保两者的数据类型相同。
线性回归
产生数值预测,而不是概率;该问题是由于试图在回归设置中使用精度,而