我使用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:无法处理二进制和连续目标的混合
帮助?谢谢。
答案 0 :(得分:25)
阅读@desertnaut下面写得很好的答案,解释为什么这个错误在机器学习方法中有一些错误,而不是你需要修复的东西。
accuracy_score(y_true, y_pred.round(), normalize=False)
答案 1 :(得分:18)
尽管这里有很多错误的答案,试图通过数值操纵预测来规避错误,但错误的根本原因是理论而不是计算问题:您正在尝试使用<回归(即数值预测)模型(LinearRegression
)中的em> classification 度量(准确性),毫无意义。
就像大多数性能指标一样,准确性将苹果与苹果进行了比较(即,真实标签为0/1,而预测值再次为0/1);因此,当您要求函数将真实的二进制标签(苹果)与连续的预测(橙色)进行比较时,您会得到预期的错误,该错误会从 computational 点告诉您问题出在哪里查看:
Classification metrics can't handle a mix of binary and continuous target
尽管该消息并没有直接告诉您您正在尝试计算对您的问题无效的指标(并且我们实际上不应期望它走得那么远),但scikit无疑是一件好事-learn至少会给您直接和明确的警告,表示您尝试做错事;在其他框架中并不一定是这种情况-例如,在behavior of Keras in a very similar situation中,您根本没有得到任何警告,而最终只是抱怨在回归设置中“准确性”低...
我对所有其他答案(包括已被接受并被高度评价的答案)感到非常惊讶,这有效地建议您操纵预测以简单地摆脱错误;的确,一旦我们得到一组数字,我们当然可以开始以各种方式(舍入,阈值等)将它们混合在一起,以使我们的代码行事,但这当然并不意味着我们的数字操作是在我们要解决的ML问题的特定上下文中有意义。
最后,总结:问题在于您正在为模型(LinearRegression
)应用不适当的指标(准确性):如果您处于分类设置中,您应该更改模型(例如改用LogisticRegression
);如果您使用的是回归分析(即数字预测)设置,则应更改指标。检查list of metrics available in scikit-learn,您可以在其中确认准确性仅用于分类。
还可以通过recent 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个模型正常工作,而其余所有(注释掉)的模型给出相同的错误。到现在为止,您应该能够使自己确信所有注释掉的模型都是回归模型(而不是分类模型),因此是有道理的错误。
最后一个重要说明:有人认为这听起来合情合理
好的,但是我想使用线性回归,然后 对输出进行舍入/阈值处理,将预测有效地视为 “概率”,从而将模型转换为分类器
实际上,这已经在这里的其他一些答案中得到了暗示(无论是否隐含);同样,这是一种无效方法(而且您的预测为负数的事实应该已经警告您不能将其解释为概率)。 Ng的安德鲁·伍(Andrew Ng)在Coursera受欢迎的机器学习课程中解释了这是一个坏主意的原因-请参阅他在YouTube上的Lecture 6.1 - Logistic Regression | Classification(解释从3:00开始)以及 4.2为什么不线性是[高度推荐和免费提供的]教科书An Introduction to Statistical Learning的回归[分类]? ...
答案 2 :(得分:4)
sklearn.metrics。 accuracy_score (y_true,y_pred)方法将y_pred定义为:
y_pred :1d类似数组,或标签指示符数组/稀疏矩阵。 预测标签 ,由分类器返回。
这意味着y_pred必须是1或0(谓词标签)的数组。它们不应该是概率。
可以使用LinearRegression()模型的方法predict()和predict_proba()分别生成谓词标签(1&0; s和0&#39; s)和/或预测概率。
<强> 1。生成预测标签:
LR = linear_model.LinearRegression()
y_preds=LR.predict(X_test)
print(y_preds)
输出:
[1 1 0 1]
&#39; y_preds&#39;现在可以用于accuracy_score()方法:accuracy_score(y_true, y_pred)
<强> 2。生成标签的概率:
某些指标,例如&#39; precision_recall_curve(y_true,probas_pred)&#39;需要概率,可以按如下方式生成:
LR = linear_model.LinearRegression()
y_preds=LR.predict_proba(X_test)
print(y_preds)
输出:
[0.87812372 0.77490434 0.30319547 0.84999743]
答案 3 :(得分:2)
accuracy_score是一种分类指标,您不能将其用于回归问题。
答案 4 :(得分:1)
也许这可以帮助找到这个问题的人:
正如JohnnyQ已经指出的那样,问题是你的for /F "usebackq delims=" %%A in ("%~1") do set "CS_VALUES=%%A"
中有非二进制(不是0和1)值,i。即添加时
y_pred
您将在输出中看到print(((y_pred != 0.) & (y_pred != 1.)).any())
。 (该命令查明是否存在任何非0或1的值。)
您可以使用以下方式查看非二进制值:
True
print语句可以输出上述派生变量。
最后,此函数可以清除所有非二进制条目的数据:
non_binary_values = y_pred[(y_pred['score'] != 1) & (y_pred['score'] != 0)]
non_binary_idxs = y_pred[(y_pred['score'] != 1) & (y_pred['score'] != 0)].index
答案 5 :(得分:1)
答案 6 :(得分:0)
问题是真正的y是二进制(零和1),而你的预测不是。您可能生成了概率而不是预测,因此结果:) 请尝试生成类成员资格,它应该可以工作!
答案 7 :(得分:0)
accuracy_score
是分类指标,不能用于回归问题。
使用这种方式:
accuracy_score(y_true, np.round(abs(y_pred)), normalize=False)
答案 8 :(得分:-1)
该错误是因为y_pred和y_true的数据类型不同。 y_true可能是数据帧,而y_pred是arraylist。如果将它们都转换为数组,则问题将得到解决。
答案 9 :(得分:-1)
只需使用
y_pred = (y_pred > 0.5)
accuracy_score(y_true, y_pred, normalize=False)
答案 10 :(得分:-2)
以防在使用Orange库时出现此错误(在后台使用sklearn)。
我通过其他一些python软件包安装了numpy == 1.14.5。解决方案是将numpy手动更新为1.16.4:
pip install -U numpy=1.16.4