文章目录
- 简介
- 原理
- 代码
- 过拟合
简介
多项式回归(Polynomial Regression)顾名思义是包含多个自变量的回归算法,也叫多元线性回归,多数时候利用一元线性回归(一条直线)不能很好拟合数据时,就需要用曲线,而多项式回归就是求解这条曲线。
也就是说一元回归方程是y=wx b
而多元回归方程是
比如二元就是y=ax^2 bx c ,三元就是y=ax^3 bx^2 cx d
但是并不是元数越多越好,可能存在过拟合问题,在最后一节介绍。
一元线性回归可参考另一篇博客:回归-线性回归算法(房价预测项目)
原理
多元线性回归很复杂,特别是当特征数多元数多的时候,可视化难以想象。
用向量矩阵的来表达:
,
比如一个特征量二元回归方程:k=1,n=2:
再如两个特征量二元回归方程:k=2,n=2:
可以看出计算量其实是很大的。
使用最小二乘法作为损失函数,并选择优化算法:正规方程或梯度下降。
可参考:浅谈梯度下降算法(模拟退火实战)
代码
多元线性回归与一元线性回归其实只是x的维度不同,也就是说通过设置x的维度,调用线性模型LinearRegression
即可进行求解,即对数据进行预处理,需要几次方即升到几维,如下2种方法。
- 使用
hstack()
或hstack()
叠加 如果维数低,我们可以手动添加即可。
import numpy as np
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
print("水平方向叠加:", np.hstack((a, b)))
print("垂直方向叠加:", np.vstack((a, b)))
- 使用
PolynomialFeatures()
对特征预处理 如果维度多,可以用该函数计算生成x。 包括参数: degree:默认2,多项式特征的次数; interaction_only:默认default=False,若为True,则不含自己和自己相结合的特征项; include_bias:默认True,若为True,则包含一列为1的偏差项; order:默认‘C’,若为’F’则计算更快,但是后续的拟合慢。 包括属性: powers_:n维幂运算数组,根据degree的值而确定行,根据属性个数而确定列。 n_input_features_:输入特征的总数,即幂运算矩阵的列; n_output_features_:输出特征的总数,即幂运算矩阵的行。
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
x = np.arange(6).reshape(3, 2)
print(x)
poly = PolynomialFeatures(degree=2)
poly.fit(x)
print(poly.powers_)
print("输入特征:", poly.n_input_features_)
print("输出特征:", poly.n_output_features_)
x = poly.transform(x)
print(x)
代码语言:javascript复制(
插播反爬信息)博主CSDN地址:https://wzlodq.blog.csdn.net/
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
# 生成数据
X = np.linspace(-5, 5, 100)
Y = 2 * X ** 2 3 * X 5 np.random.randn(100) * 5
x = X.reshape(-1, 1)
# 数据预处理
# 法一、使用hstack直接添加x方
x1 = np.hstack([x, x ** 2])
# 法二、使用PolynomialFeatures计算二次方
poly = PolynomialFeatures()
poly.fit(x)
x2 = poly.transform(x)
model1 = LinearRegression() # 创建模型1
model1.fit(x1, Y) # 训练模型1
y_pred1 = model1.predict(x1) # 测试1
plt.figure(figsize=(8, 4))
plt.subplot(1, 2, 1) # 可视化1
plt.scatter(X, Y)
plt.plot(x, y_pred1, color='red')
plt.title("使用hstack()")
model2 = LinearRegression() # 创建模型2
model2.fit(x2, Y) # 训练模型2
y_pred2 = model2.predict(x2) # 测试2
plt.subplot(1, 2, 2) # 可视化2
plt.scatter(X, Y)
plt.plot(x, y_pred2, color='gold')
plt.title("使用PolynomialFeatures()")
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.show()
过拟合
正如前面所说的一样,多项式的幂次并不是越高越好,过高可能出现过拟合情况,导致泛化能力低,过低可能出现欠拟合情况,导致预测结果差,如下图所示。
代码语言:javascript复制import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
# 生成数据
np.random.seed(20221005)
X = np.linspace(-np.pi, np.pi, 100)
Y = np.sin(X) np.random.randn(100) * 0.4
x = X.reshape(-1, 1)
plt.scatter(x, Y, color="lightblue")
for idx, degree in enumerate([1, 3, 30, 100]):
print(degree)
poly = PolynomialFeatures(degree=degree)
poly.fit(x)
x1 = poly.transform(x)
model = LinearRegression()
model.fit(x1, Y)
y_pred = model.predict(x1)
plt.plot(x, y_pred, label=("%d次方" % degree))
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.legend()
plt.show()
可见并不是幂次越高越好,一般遵循“奥卡姆剃刀”定律,也就是简单平滑的曲线即可。当然了,也有很多方法度量和避免欠拟合与过拟合。
原创不易,请勿转载(
本不富裕的访问量雪上加霜) 博主首页:https://wzlodq.blog.csdn.net/ 来都来了,不评论两句吗