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

LinearRegression in Python giving incorrect results?

我有一个以逗号分隔的 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

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

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

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

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

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

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' 列(axis = 1 表示列,axis = 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'。

当您将高度输入为 80 时,这意味着您将向左移动,甚至比您的情节更左。因此,如您所见,x 减少 y 增加。这意味着 'cm' 减少意味着 'kg' 增加。因此输出是 110,这更多。

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.