我正在使用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()
我注意到的第一件事是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视频的代码。我也查看了堆栈交换,但是找不到问题的答案,因此尽管知道答案对知道自己在做什么的人来说确实很明显,但还是寻求帮助。
我真的很感激有人花时间解释我显然缺少的一些基础知识。
谢谢
答案 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()
答案 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]
输出