Python scikit学习中预测和评分的工作原理

Python scikit学习中预测和评分的工作原理,python,machine-learning,scikit-learn,linear-regression,Python,Machine Learning,Scikit Learn,Linear Regression,我试图根据一组输入,使用线性回归预测产出,如下所示: import numpy as np from sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split X = [[1, 1, 1, 1], [1, 1, 1, 1], [1, 2, 1, 1], [1, 3, 1, 1], [1, 4, 1, 1],

我试图根据一组输入,使用线性回归预测产出,如下所示:

import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

X = [[1, 1, 1, 1],
     [1, 1, 1, 1],
     [1, 2, 1, 1],
     [1, 3, 1, 1],
     [1, 4, 1, 1],
     [1, 2, 1, 1],
     [1, 3, 1, 1],
     [2, 4, 1, 1],
     [1, 1, 1, 1],
     [2, 1, 1, 1],
     [2, 4, 1, 1],
     [1, 5, 1, 1],
     [1, 1, 1, 1],
     [1, 1, 1, 1]]
y = [
    [1],
    [1],
    [1],
    [3],
    [2],
    [1],
    [3],
    [2],
    [1],
    [1],
    [2],
    [1],
    [1],
    [1],
   ]


# Split X and y into X_
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=1)

regression_model = LinearRegression()
regression_model.fit(X_train, y_train)

print(regression_model.score(X_test, y_test)) # -1.1817143658810325
print(regression_model.predict([[1, 1, 1, 1]]) # [[0.9694444444444441]]
我已将X值作为输入传递,并期望y作为输出

它将分数显示为负值,并将预测输出显示为[[0.96944441]],我预计为1


如何解决这个问题?

线性回归试图用最优超平面最小化均方误差。大多数数据(包括你的数据)不是完全线性的,因此预测也不是完美的。然而,考虑到线性约束,它们将具有尽可能低的误差。在您的示例中,0.97和1.00之间的差别不大

考虑以下几个维度中的线性回归,以使可视化更容易。回归所做的就是选择最适合数据的行。这并不意味着它贯穿每一点。当你用这条线做预测时,它会有一点偏离。

负分数(直接来自文档)意味着模型的性能比只预测数据的平均值的情况差。模型可以任意表现得很差。在您的案例中,由于线性回归能够学习这样一个常数模型,这表明过度拟合了训练集(可能是由于样本量小)。如果你给你的火车数据打分,你应该得到一个非否定的答案,也许是肯定的


更仔细地检查一下您的模型,您会注意到,由于大的类不平衡性(您拥有的1的数量几乎是其他所有加在一起的数量的两倍),真实值为1的任何对象都可以相对准确地进行预测。2的预测更糟,3的预测更可怕。一个线性模型有一个艰难的时间,使巨大的跳跃从1和2到3的只是几个点停留在其余的点云。为什么你认为负分数和预测输出是不正确的?谢谢@Hans Musgrave的详细解释。你认为有没有其他模型可以适合我的数据,或者仅仅增加数据集的大小就可以解决这个问题。这最好作为另一个问题来处理,这取决于你的目标。这里的两个重要思想是插值和回归。前者精确匹配您的数据(因此将具有完美的训练精度),而后者尝试最小化某种错误(例如,您尝试的线性回归)。虽然插值可以解决您的问题,但它通常缺乏泛化能力,考虑到使用训练/测试分割,这似乎是您关心的问题。大多数机器学习模型并不完美,所以我不会太担心。增加数据集的大小至少可以解决负分数问题。对于这个问题,我希望有足够数据的线性回归的分数在0.4左右,这样你就不会过度适应训练集了。谢谢你的建议@Hans Musgrave。我试着使用GaussianNB,它似乎对几乎所有的记录都给出了1.0分,除了一个或两个0.5分的记录。如果你喜欢其他算法,请让我知道我会试试。因为数据太少,没有域信息,我真的没有最喜欢的算法。但有一点需要指出,由于重复的[1,2,1,1]具有不同的y值,您将永远无法达到完美的精度。此外,所有预测能力都存在于第二个坐标中。您可以在不降低精度的情况下删除第一、第三和第四坐标。