Python/Scikit-Learn - 无法处理多类别和连续值混合

49

我正在尝试将SGDRegressor拟合到我的数据上,然后检查准确性。拟合工作正常,但是预测结果与原始目标数据不是相同的数据类型(?), 我得到了以下错误:

ValueError: Can't handle mix of multiclass and continuous

当调用 print "Accuracy:", ms.accuracy_score(y_test,predictions) 时。

数据长这样(只有20万多行):

Product_id/Date/product_group1/Price/Net price/Purchase price/Hour/Quantity/product_group2
0   107 12/31/2012  10  300 236 220 10  1   108

代码如下:
from sklearn.preprocessing import StandardScaler
import numpy as np
from sklearn.linear_model import SGDRegressor
import numpy as np
from sklearn import metrics as ms

msk = np.random.rand(len(beers)) < 0.8

train = beers[msk]
test = beers[~msk]

X = train [['Price', 'Net price', 'Purchase price','Hour','Product_id','product_group2']]
y = train[['Quantity']]
y = y.as_matrix().ravel()

X_test = test [['Price', 'Net price', 'Purchase price','Hour','Product_id','product_group2']]
y_test = test[['Quantity']]
y_test = y_test.as_matrix().ravel()

clf = SGDRegressor(n_iter=2000)
clf.fit(X, y)
predictions = clf.predict(X_test)
print "Accuracy:", ms.accuracy_score(y_test,predictions)

我应该有什么不同的做法吗?谢谢!


1
您可以考虑通过使用 round 函数将连续值四舍五入为最接近的整数,将连续值转换为离散值。请参考此链接(https://dev59.com/sFoT5IYBdhLWcg3w8S61), 由natbusa回答类似问题。 - Dutse I
Dutse 是正确的。或者你可以使用 y_preds = y_preds > 0.5 来转换为离散值。在这里,你可以设置自己的阈值。 - Shark Deng
1
@SharkDeng,你错了,前面的评论也错了;问题的根本原因已经在下面的答案中指出(链接的答案也是错误的)。 - desertnaut
2个回答

81

准确率是一种分类指标。在回归中不能使用它。有关各种指标的信息,请参见文档


那么我该如何使用我的模型进行预测呢?我的意思是,如果 clf.predict(X_test) 的输出与原始数据不同,我该如何使用它呢?这让我感到困惑。 - lte__
4
通常情况下,您不能期望从回归模型中得到完全正确的结果。您所希望的是,您的预测整体上接近真实值。为了判断它们是否足够接近,您需要使用不同的评估指标(回归指标之一)。请参阅我提供的文档链接,其中解释了许多指标。 - BrenBarn

32

准确率只适用于分类问题。对于回归问题,您可以使用:R2得分、MSE(均方误差)、RMSE(均方根误差)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接