Python中的LinearRegression给出不正确的结果?

时间:2018-12-01 17:58:18

标签: python pandas linear-regression sklearn-pandas

我有一个用逗号分隔的CSV文件,其中有两个数字列-输入和输出。它们以(或多或少的线性函数)相关,请参见下文。我的样本很小。

下面是我使用sklearn编写的Python代码以预测值。不知何故,它没有给我正确的值(合理的预测)。我对此很陌生,所以请多包涵。

import pandas as pd

data = pd.read_csv("data.csv", header=None, names=['kg', 'cm'])
labels = data['kg']
train1 = data.drop(['kg'], axis=1) # In all honesty, I don't understand this.

from sklearn.cross_validation import train_test_split

x_train, x_test, y_train, y_test = train_test_split(train1, labels, test_size=0.10, random_state=2)

from sklearn.linear_model import LinearRegression

reg = LinearRegression()
reg.fit(x_train, y_train)
reg.score(x_test, y_test)
reg.predict(80) # Gives an incorrect value of about 108.

数据。

89,155
86,161
82.5,168
79.25,174
76.25,182
73,189
70,198
66.66,207
63.5,218
60.25,229
57,241
54,257
51,259

3 个答案:

答案 0 :(得分:2)

实际上,您在理解自己的代码时遇到问题。

import pandas as pd

data = pd.read_csv("data.csv", header=None, names=['kg', 'cm'])
labels = data['kg']
train1 = data.drop(['kg'], axis=1) # In all honesty, I don't understand this.

直到这里您所做的就是已经加载了数据框。之后,将X和y从数据集中分离出来。

标签代表y值。
train1 代表x值。

自从您写完后,您将无法理解:- train1 = data.drop(['kg'],axis = 1)
让我解释一下。这是从包含“ kg”和“ cm”列的数据框中得出的。它删除“ kg”列(轴= 1表示列,轴= 0表示行)。因此,仅剩下“ cm”,即您的x。

from sklearn.cross_validation import train_test_split

x_train, x_test, y_train, y_test = train_test_split(train1, labels, test_size=0.10, random_state=2)

from sklearn.linear_model import LinearRegression

reg = LinearRegression()
reg.fit(x_train, y_train)
reg.score(x_test, y_test)
reg.predict(80) # Gives an incorrect value of about 108.

现在,您可以在代表“ cm”的x值和代表“ kg”的y值上训练模型。

当您预测(80)时,发生的事情是您输入的“ cm”值为80。让我只绘制“ cm”对“ kg”作为训练数据。

enter image description here

当您输入高度80时,这意味着您比图更左,甚至更左。因此,您可以看到x减小y增大。这意味着“厘米”减少意味着“公斤”增加。因此产量是110,甚至更高。

答案 1 :(得分:1)

from io import StringIO
input_data=StringIO("""89,155\n
86,161\n
82.5,168\n
79.25,174\n
76.25,182\n
73,189\n
70,198\n
66.66,207\n
63.5,218\n
60.25,229\n
57,241\n
54,257\n
51,259""")


import pandas as pd

data = pd.read_csv(input_data, header=None, names=['kg', 'cm'])
labels = data['cm']
train1 = data.drop(['cm'], axis=1) #This is similar to selecting the kg column

from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(train1, labels, test_size=0.10, random_state=2)

from sklearn.linear_model import LinearRegression

reg = LinearRegression()
reg.fit(x_train, y_train)
reg.score(x_test, y_test)

import numpy as np
reg.predict(np.array([80]).reshape(-1, 1)) # 172.65013306.

答案 2 :(得分:-1)

我认为您在小数据量方面遇到了问题。代码流对我来说看起来很正常,我建议您尝试查找输入输出的p值。这将告诉您从线性回归中发现的相关性是否显着(p值<0.05)。

您可以使用以下方法找到p值:

 from scipy.stats import linregress
 print(linregress(input, output))

要使用scikit查找p值,请学习您可能需要使用公式来查找p值。祝你好运。