склеарн полиномиальная регрессия - PullRequest
0 голосов
/ 24 сентября 2018

Я работаю через свою первую нелинейную регрессию в Python, и есть несколько вещей, которые я, очевидно, не совсем понимаю.

Вот пример данных:

X 8.66.2 6.4 4 8.4 7.4 8.2 5 2 4 8.6 6.2 6.4 4 8.4 7.4 8.2 5 2 4

y 87 61 75 72 85 73 83 63 21 70 87 70 64 64 85 73 83 61 21 50

Вот мой код:

#import libraries
import pandas as pd
from sklearn import linear_model
import seaborn as sns
import matplotlib.pyplot as plt
sns.set()


#variables
r = 100

#import dataframe
df = pd.read_csv('Book1.csv')


#Assign X & y
X = df.iloc[:, 4:5]
y = df.iloc[:, 2]

#import PolynomialFeatures and create X_poly
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(2)
X_poly = poly.fit_transform(X)

#fit regressor
reg = linear_model.LinearRegression()
reg.fit(X_poly, y)

#get R2 score
score = round(reg.score(X_poly, y), 4)

#get coefficients
coef = reg.coef_
intercept = reg.intercept_

#plot
pred = reg.predict(X_poly)
plt.scatter(X, y, color='blue', s=1)
plt.plot(X, pred, color='red')
plt.show()

Когда я запускаю этот код, я получаю диаграмму, которая выглядит следующим образом: chart from above code

Первое, что язаметил, что переменные X находятся на вертикальной оси, а не на горизонтальной плоскости, которую я ожидал (и обычно вижу)

Следующее, что я заметил, это то, что есть несколько красных линий, когда я действительно ожидал, что одна кривая представляетбиномиальное уравнение для данных.

Наконец, когда я смотрю на коэффициенты, они не такие, как я ожидаю.Чтобы проверить это, я выполнил регрессию с использованием тех же данных в Excel, а затем подтвердил правильный ответ, подставив числа для X.

Коэффициенты, которые я получаю в Excel, равны y = -1.0305x ^ 2 + 19.156x -5.9868 со значением R в квадрате 0,8221.

В Python моя модель предоставляет коэффициент [0, -0,0383131, 0,00126994] с перехватом 2,4339 и значением R в квадрате 0,8352.

Пытаясь изучить этот материал, я в основном пытался адаптировать фрагменты кода, которые я видел и смотрел видео на YouTube.Я также просмотрел обмен стека, но не могу найти ответы на свои вопросы, поэтому прибегнул к просьбе о помощи, хотя знал, что ответы, вероятно, действительно очевидны для тех, кто знает, что они делают.

Я быдействительно ценю, что кто-то нашел время, чтобы объяснить некоторые из основ, которые мне явно не хватает.

Спасибо

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Проблема состояла в том, что ваши значения x были не отсортированы, и поэтому вы видите странную сетку из красных линий, потому что линии соединяют точку в порядке значений x.Я отсортировал ваш фрейм данных, используя X, и получил желаемый вывод

X = np.array([8.6, 6.2, 6.4, 4, 8.4, 7.4, 8.2, 5, 2, 4, 8.6, 6.2, 6.4, 4, 8.4, 7.4, 8.2, 5, 2, 4])
y = np.array([87, 61, 75, 72, 85, 73, 83, 63, 21, 70, 87, 70, 64, 64, 85, 73, 83, 61, 21, 50])

df = pd.DataFrame({'X':X, 'y':y})
df = df.sort_values('X')
X = df.iloc[:, 0:1]
y = df.iloc[:, 1]

Вывод

enter image description here

0 голосов
/ 24 сентября 2018

Почему бы просто не использовать numpy, чтобы соответствовать полиномиальной функции степени 3.

import numpy as np

import matplotlib.pyplot as plt

x = np.array([8.6, 6.2, 6.4, 4, 8.4, 7.4, 8.2, 5, 2, 4, 8.6, 6.2, 6.4, 4,
              8.4, 7.4, 8.2, 5, 2, 4])
y = np.array([87, 61, 75, 72, 85, 73, 83, 63, 21, 70, 87, 70,
              64, 64, 85, 73, 83, 61, 21, 50])

z = np.polyfit(x, y, 3)

p = np.poly1d(z)

xp = np.linspace(x.min(), x.max(), 100)

plt.plot(x, y, '.', xp, p(xp), '-')
plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...