多项式回归、过拟合、模型正则化
目录
多项式回归

什么是多项式回归
从本质上讲,多项式回归模型是线性回归模型的一种。
实际应用中,我们遇到的数据并不总是线性的,这时如果我们还拿线性模型去拟合,模
型的效果就会大打折扣。不过不用担心,此时,仍然可以使用线性回归的方法来拟合非线性
的数据,只不过我们要先对输入数据做一些处理。这样就出现了所谓的“多项式回归”。
例如:
- 一元m次多项式回归方程为:
y^=b0+b1x+b2x2+...+bmxm
-
二元二次多项式回归方程为:
y^=b0+b1x1+b2x2+b3x12+b4x22+b5x1x2
在实际应用中,常常可以通过多项式回归扩展已有特征,从而解决非线性问题
sklearn实现多项式回归
在sklearn中实现多项式回归使用sklearn.preprocessing.PolynomialFeatures
在PolynomialFeatures(degree)中,degree参数代表多项式回归中特征的最高次数
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
X = np.arange(1,11).reshape((-1,2))
# 使用最高次为2次的多项式回归对象
poly = PolynomialFeatures(degree=2)
X2 = poly.fit_transform(X) # 拟合并添加新特征
# 观察X2特征
print(X2)
实战——多项式回归结合Pipeline管道机制

什么是Pipeline管道机制
管道机制在机器学习算法中得以应用的根源在于,重复使用某些固定操作。
管道机制实现了对全部步骤的流式化封装和管理(streaming workflows with pipelines)。
注意:
管道机制更像是编程技巧的创新,而非算法的创新。
sklearn实现管道机制
在sklearn中实现管道机制,使用的是sklearn.pipeline.Pipeline
import numpy as np
import matplotlib.pyplot as plt
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import PolynomialFeatures
# 构造数据集
x = np.random.uniform(-3,3,size=100)
X = x.reshape((-1,1))
y = 0.5 * x**2 + x + 2 + np.random.normal(size=100)
# 使用Pipeline封装多个重复操作
pipeline = Pipeline([
("poly",PolynomialFeatures(degree=2)), # 多项式回归操作
("std_scaler",StandardScaler()), # 特征标准化操作
("lin_reg",LinearRegression()) # 线性回归操作
])
pipeline.fit(X,y) # 分别经过管道的顺序操作
y_predict = pipeline.predict(X) # 预测
# 绘图
plt.scatter(x,y) # 原数据特征与标签绘制散点图
plt.plot(np.sort(x),y_predict[np.argsort(x)],color='r')
plt.show()
过拟合与欠拟合

什么是过拟合、欠拟合
- 过拟合:算法所训练的模型过多地表达了数据的噪音
- 欠拟合:算法所训练的模型不能完整表述数据关系

注意:
过拟合在训练集上表现良好,但在测试集上却表现较差
模型正则化(Regularization)

正则化( Regularization)的目的在于提高模型在未知测试数据上的泛化力,限制参数的大
小,减少泛化误差,是解决过拟合的一种重要方法。
范数、L1正则化与L2正则化
-
范数
假设x是一个向量,它的Lp范数定义
||x||p=(∑i|xi|p)1p
- L1正则惩罚项:对应于L1范数
||w||1=∑i|wi|
- L2正则惩罚项:对应于L2范数的平方
||w||22=∑iwi2
在目标函数后面添加一个“惩罚项”是正则化的常用方式,为了防止系数过大从而让模型变得复杂。在加了正则化项之后的目标函数为:
正则惩罚项J(w,b)=loss(w,b)+正则惩罚项
其中,J(w,b)是目标函数,loss(w,b)是损失函数
注意:
L1正则化能够使得损失函数中的许多参数变成0,可作为特征选择使用;
L2正则化更适用于防止模型过拟合
岭回归与Lasso回归

什么是岭回归与Lasso回归
- 岭回归与Lasso回归的出现是为了解决线性回归中出现的过拟合问题的
- 岭回归引入的是L2范数惩罚项,Lasso回归引入的是L1范数惩罚项
- Lasso回归能够使得损失函数中的许多θ均变成0,可作为特征选择使用
岭回归与Lasso回归的形式
- 线性回归的损失函数
J(θ)=12m∑i=1m(hθ(x(i))−y(i))2
- 岭回归的损失函数
J(θ)=12m∑i=1m(hθ(x(i))−y(i))2+λ∑j=1nθj2
- Lasso回归的损失函数
J(θ)=12m∑i=1m(hθ(x(i))−y(i))2+λ∑j=1n|θj|
其中,λ称为正则化参数,如果λ选取过大,会把所有参数θ均最小化,造成欠拟合,如果
λ选取过小,会导致对过拟合问题解决不当
解决过拟合问题的方法
- 降低模型的复杂度
- 降低“噪音”(去除无效样本和无效特征)
- 增加训练样本数
- 使用验证集(目的是调整最合适的超参数)
- 模型正则化
实战——岭回归的sklearn实现

sklearn中使用sklearn.linear_model.Ridge实现岭回归
可以使用Pipeline管道机制将岭回归封装到操作中
def ridge_regression(degree,alpha):
return Pipeline([
("poly",PolynomialFeatures(degree=degree)),
("std",StandardScaler()),
("ridge",Ridge(alpha=alpha)) # 岭回归使用Ridge实现
])
实战——LASSO回归的sklearn实现

sklearn中使用sklearn.linear_model.Lasso实现Lasso回归
可以使用Pipeline管道机制将岭回归封装到操作中
def LassoRegression(degree, alpha):
return Pipeline([
("poly", PolynomialFeatures(degree=degree)),
("std_scaler", StandardScaler()),
("lasso_reg", Lasso(alpha=alpha)) # Lasso回归使用Lasso实现
])
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)