sklearn多项式回归

时间:2018-09-24 01:16:30

标签: python matplotlib scikit-learn non-linear-regression

我正在使用python进行第一个非线性回归,显然有些事情我做得不太正确。

以下是示例数据:

X 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 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中,我的模型提供的coef_为[0,-0.0383131,0.00126994],截距为2.4339,r平方得分为0.8352。

在尝试学习这些东西时,我在很大程度上尝试了改编我所看到和观看的youtube视频的代码。我也查看了堆栈交换,但是找不到问题的答案,因此尽管知道答案对知道自己在做什么的人来说确实很明显,但还是寻求帮助。

我真的很感激有人花时间解释我显然缺少的一些基础知识。

谢谢

2 个答案:

答案 0 :(得分:1)

为什么不简单地使用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

答案 1 :(得分:1)

问题是您的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