4.Sklearn多项式回归

发布时间 2023-11-04 23:33:28作者: 乐池

1.多项式回归介绍

在一元回归分析中,如果依变量y与自变量X的关系为非线性的,但是又找不到适当的函数曲线来拟合,则可以采用一元多项式回归

多项式回归的最大优点就是可以通过增加X的高次项对实测点进行逼近,直至满意为止。

事实上,多项式回归可以处理相当一类非线性问题,它在回归分析中占有重要的地位,因为任一函数都可以分段用多项式来逼近。

2. 建立工程并导人sklean包

import matplotlib.pyplot as plt
import numpy as np

from sklearn import linear_model
from sklearn.preprocessing import PolynomialFeatures

sklearn中多项式回归:
这里的多项式回归实际上是先将变量X处理成多项式特征,然后使用线性模型学习多项式特征的参数,以达到多项式回归的目的。

例如: \(X =[x1, x2]\)
1.使用PolynomialFeatures构造X的二次多项式特征X_Poly

\[X\underline{}Poly = [x_1, x_2, x_1x_2, x_1^2,x_2^2] \]

2.使用linear_model学习X_Poly和y之间的映射关系,即参数$$w_{1} x_{1}+w_{2} x_{2}+w_{3} x_{1} x_{2}+w_{4} x_{1}^{2}+w_{5} x_{2}^{2}=y$$

3. 加载训练数据

# 建立datasets_X和datasets_Y用来存储数据中的房屋尺寸和房屋成交价格。
datasets_X = []
datasets_Y =[]
fr = open('prices.txt','r')
lines = fr.readlines()
for line in lines:
    items = line.strip().split(',')  # 去除数据文件中的逗号
    datasets_X.append(int(items[0]))
    datasets_Y.append(int(items[1]))
 
length = len(datasets_X)
datasets_X = np.array(datasets_X).reshape([length,1])  #将dataset_X转化为数组,并变为二维,以符合线性回归拟合函数输人参数要求。
datasets_Y = np.array(datasets_Y)

4. 建立回归方程

# 以数据datasets_X的最大值和最小值为范围,建立等差数列,方便后续画图。
minX = min(datasets_X)
maxX = max(datasets_X)
X = np.arange(minX,maxX).reshape([-1,1])

# degree=2表示建立datasets_X的二次多项式特征X_poly.然后创建线性回归,使用线性模型学习X_poly和datasets_Y之间的映射关系(即参数)
poly_reg = PolynomialFeatures(degree = 2)
X_poly = poly_reg.fit_transform(datasets_X)
lin_reg_2 = linear_model.LinearRegression()
lin_reg_2.fit(X_poly, datasets_Y)

PolynomialFeatures的用法:

poly = PolynomialFeatures(degree=2, interaction_only=False, include_bias=True)
  • degree(默认为2):指定多项式的阶数。例如,如果 degree=2,则会生成包括原始特征、其平方项和交互项的多项式特征。如果 degree=3,则还包括立方项。

  • interaction_only(默认为False):如果设置为True,只生成交互项,而不包括原始特征的平方项和高阶项。
    假设你有一个包含两个特征的输入特征矩阵 X:[[x1, x2],[y1, y2],[z1, z2]],则:

# degree = 2
[[1, x1, x2, x1^2, x1*x2, x2^2],
 [1, y1, y2, y1^2, y1*y2, y2^2],
 [1, z1, z2, z1^2, z1*z2, z2^2]]

# 如果 interaction_only=True,则只会生成交互项
[[1, x1*x2],
 [1, y1*y2],
 [1, z1*z2]]
  • include_bias(默认为True):如果设置为True,会添加一个偏置项(截距项)到生成的特征矩阵中,该项的值恒为1。如果设置为False,不会添加偏置项。

fit_transform多项式特征生成器poly来将原始特征矩阵 X 转换为多项式特征矩阵 X_poly。这将包括原始特征和它们的平方项。

示例:
如果 data 包含原始特征[[1],[2],[3]],那么 degree = 2 的 poly_reg.fit_transform(data) 将包括这些特征及它们的平方项:

[[1. 1. 1.]
 [1. 2. 4.]
 [1. 3. 9.]]

5. 可视化

plt.scatter(datasets_X, datasets_Y, color = 'red')
plt.plot(X,lin_reg_2.predict(poly_reg.fit_transform(X)),color ='blue')
plt.xlabel('Area')
plt.ylabel('Price')
plt.show()

6. 预测

y_pred = model.predict(poly.transform(X_test))

它首先将测试数据集 X_test 转换为多项式特征矩阵,然后使用训练好的线性回归模型 model 对多项式特征进行预测,得到预测值 y_pred。