LinearRegression в Python дает неверные результаты? - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть CSV-файл, разделенный запятыми, с двумя числовыми столбцами - входы и выходы.Они коррелированы в (более или менее линейной функции), см. Ниже.У меня очень маленький пример.

Ниже приведен код Python, который я написал, используя sklearn для прогнозирования значений.Почему-то это не дает мне правильные значения (разумные прогнозы).Я новичок в этом, поэтому, пожалуйста, потерпите меня.

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 голосов
/ 01 декабря 2018

На самом деле у вас проблемы с пониманием вашего собственного кода.

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)
Позвольте мне объяснить это.Это происходит из кадра данных, который состоит из столбцов «кг» и «см».Он удаляет столбец «кг» (ось = 1 означает столбец, ось = 0 означает строку).Следовательно, остается только «см», который является вашим х.

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.

Теперь вы тренируете модель по значениям x, которые представляют «см», и значениям y, которые представляют «кг».

Когда вы прогнозируете (80), что происходит, вы вводитеЗначение cm должно составлять 80. Позвольте мне построить график «cm» против «kg» для тренировочных данных.

enter image description here

Когда вы вводите рост как80 это означает, что вы идете больше слева, даже больше, чем ваш сюжет.Следовательно, как вы можете видеть, x уменьшает y, увеличивается.Это означает, что уменьшение «см» означает увеличение «кг».Следовательно, выходной сигнал равен 110, что больше.

0 голосов
/ 01 декабря 2018
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.
0 голосов
/ 01 декабря 2018

Я думаю, у вас проблемы с маленьким размером данных.Поток кода выглядит нормально для меня, я бы посоветовал вам попытаться найти значение p для ввода-вывода.Это скажет вам, является ли корреляция, найденная по вашей линейной регрессии, значимой или нет (значение р <0,05).</p>

Вы можете найти p-значение, используя:

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

Чтобы найти p-значение с помощью scikit learn, вам, вероятно, нужно использовать формулу, чтобы найти p-значение.Удачи.

...