当前位置: 代码迷 >> python >> sklearn多项式回归输出之字形曲线
  详细解决方案

sklearn多项式回归输出之字形曲线

热度:89   发布时间:2023-07-14 08:42:56.0

我正在用 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 视频的一些代码。 我还查看了堆栈交换,但找不到我的问题的答案,因此尽管知道答案对于知道自己在做什么的人来说可能非常明显,但还是求助于帮助。

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

谢谢

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

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

输出