机器学习------多项式回归算法
1. 算法概述
1.1 基本概念
多项式回归(Polynomial Regression)是线性回归的扩展形式,通过引入自变量的高次项来建模非线性关系。其核心思想是通过增加多项式特征,使线性模型能够拟合复杂的曲线数据。
与线性回归的关系:
-
本质仍是线性模型,因为权重参数\\beta是线性的
-
特征空间从一维扩展到高维,如:
x \\rightarrow \[x, x\^2, x\^3\]
1.2 数学形式
标准多项式回归模型:
y = \\beta_0 + \\beta_1x + \\beta_2x\^2 + \\cdots + \\beta_nx\^n + \\epsilon
其中:
-
n为多项式度数(Degree)
-
\\epsilon为误差项
-
\\beta_i为待求系数
2. 算法原理
2.1 模型构建流程
- 特征扩展:将原始特征x转换为多项式特征矩阵
X_{poly} = \[1, x, x\^2, ..., x\^n\]
-
参数估计:使用最小二乘法求解最优系数\\beta
-
模型评估:通过MSE、R²等指标评估拟合效果
2.2 损失函数
采用均方误差(MSE)作为损失函数:
MSE = \\frac{1}{n}\\sum_{i=1}\^{n}(y_i - \\hat{y_i})\^2
梯度下降更新公式:
\\begin{aligned} dw \&= \\frac{2}{n}X\^T(\\hat{y} - y) \\\\ db \&= \\frac{2}{n}\\sum(\\hat{y} - y) \\end{aligned}
2.3 参数估计方法
方法1:正规方程 ,原理:解析解:
\\beta = (X\^TX)\^{-1}X\^Ty
适用场景:小规模数据(特征数<10000) 方法2:梯度下降, 原理:迭代更新参数:
\\beta_j := \\beta_j - \\alpha\\frac{\\partial}{\\partial\\beta_j}J(\\beta)
适用场景:大规模数据/高维特征 方法3:SVD分解 , 原理:解决矩阵不可逆问题:
\\beta = V\\Sigma\^{-1}U\^Ty
适用场景:病态矩阵处理
3. 关键技术实现
3.1 特征工程
使用PolynomialFeatures
生成多项式特征:
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=3)
X_poly = poly.fit_transform(X)
生成结果示例(degree=2):
原始特征: [[2], [3]] → 转换后: [[1, 2, 4], [1, 3, 9]]
3.2 正则化处理
为防止过拟合,可引入正则化项:
-
L2正则化(岭回归):损失函数+\\lambda\\sum\\beta_i\^2
-
L1正则化(Lasso):损失函数+\\lambda\\sum\|\\beta_i\|
-
ElasticNet:结合L1和L2正则化
3.3 模型评估指标
指标1:MSE
公式:
\\frac{1}{n}\\sum\\_{i=1}\^n (y\\_i - \\hat{y}\\_i)\^2
特点:明确求和范围
指标2:R²
公式:
1 - \\frac{SS\\_{res}}{SS\\_{tot}}
特点:标准化写法
指标3:Adjusted R²
公式:
1 - (1-R\^2)\\frac{n-1}{n-p-1}
特点:完整表达式
4. 完整代码示例
4.1 使用Numpy实现
import numpy as np
import matplotlib.pyplot as plt
# 生成非线性数据
np.random.seed(42)
X = 6 * np.random.rand(100, 1) - 3
y = 0.5 * X**2 + X + 2 + np.random.randn(100, 1)
# 多项式特征转换
def poly_features(X, degree):
X_poly = np.ones((len(X), degree+1))
for i in range(1, degree+1):
X_poly[:,i] = X[:,0]**i
return X_poly
# 梯度下降优化
def gradient_descent(X, y, lr=0.01, epochs=1000):
w = np.random.randn(X.shape[1], 1)
b = np.random.randn()
for epoch in range(epochs):
y_pred = X.dot(w) + b
dw = (2/len(y)) * X.T.dot(y_pred - y)
db = (2/len(y)) * np.sum(y_pred - y)
w -= lr * dw
b -= lr * db
return w, b
# 训练二次多项式模型
X_poly = poly_features(X, 2)
w, b = gradient_descent(X_poly, y)
# 可视化结果
plt.scatter(X, y)
plt.plot(np.sort(X, axis=0), (X_poly.dot(w)+b)[np.argsort(X[:,0])], 'r-')
plt.show()
4.2 使用Scikit-learn实现
from sklearn.pipeline import Pipeline
from sklearn.metrics import mean_squared_error
# 构建管道
model = Pipeline([
('poly', PolynomialFeatures(degree=4)),
('reg', LinearRegression())
])
# 拟合模型
model.fit(X, y)
# 评估模型
y_pred = model.predict(X)
mse = mean_squared_error(y, y_pred)
print(f"MSE: {mse:.4f}")
5. 实际案例:员工薪资预测
5.1 数据集特征
职位等级 | 薪资(万美元) |
---|---|
1 | 4.5 |
2 | 5.5 |
... | ... |
10 | 99.0 |
5.2 不同度数对比
degrees = [1, 2, 3, 4]
plt.figure(figsize=(12,8))
plt.scatter(X, y)
for d in degrees:
poly = PolynomialFeatures(degree=d)
X_poly = poly.fit_transform(X)
lr = LinearRegression().fit(X_poly, y)
plt.plot(X, lr.predict(X_poly), label=f'degree {d}')
plt.legend()
plt.show()
结果分析:
-
degree=1:线性拟合(R²=0.669)
-
degree=4:完美拟合但存在过拟合风险
-
degree=2/3:最佳平衡点
6. 算法优化方向
6.1 过拟合处理策略
-
交叉验证选择最佳度数
-
引入正则化项(L1/L2)
-
早停法(Early Stopping)
-
增加训练数据量
6.2 计算优化
技术 | 实现方式 | 效果 |
---|---|---|
特征缩放 | 对多项式特征标准化 | 加速梯度下降收敛 |
增量学习 | 分批处理大数据 | 降低内存消耗 |
GPU加速 | 使用CUDA并行计算 | 提升10-100倍速度 |
7. 应用场景与限制
7.1 适用场景
-
物理/经济学中的非线性关系建模(如价格-销量曲线)
-
传感器数据校准(温度-电阻特性)
-
时间序列趋势预测
7.2 局限性
-
高次项易导致过拟合
-
外推预测能力差
-
计算复杂度随度数指数增长
-
对异常值敏感