机器学习模型正则化与岭回归、LASSO回归

模型正则化

为了解决机器学习中方差过大问题,常用的手段是模型正则化,其原理是限制多项式模型中特征系数 θ \theta θ,不让其过大,导致过拟合。
在线性回归模型中,目标是使得损失函数尽可能小
J ( θ ) = ∑ i = 1 m ( y ( i ) − θ 0 − θ 1 X 1 ( i ) − … … − θ n X n ( i ) ) 2 J(\theta)=\sum_{i=1}^m (y^{(i)}-\theta_0-\theta_1X^{(i)}_1-……-\theta_nX_n^{(i)})^2 J(θ)=i=1m(y(i)θ0θ1X1(i)θnXn(i))2
当模型过拟合时, θ \theta θ就会非常大,当损失函数 J ( θ ) J(\theta) J(θ)加上
α 1 2 ∑ i = 1 n θ i 2 \alpha \frac{1}{2} \sum_{i=1}^n \theta^2_i α21i=1nθi2
此时要使得损失函数尽可能小,就要考虑到 θ \theta θ 尽可能小,损失函数加上了 α 1 2 ∑ i = 1 n θ i 2 \alpha \frac{1}{2} \sum_{i=1}^n \theta^2_i α21i=1nθi2 即为加入正则化项。

岭回归

损失函数加正则化模型 α 1 2 ∑ i = 1 n θ i 2 \alpha \frac{1}{2} \sum_{i=1}^n \theta^2_i α21i=1nθi2 的方式,这种模型称为岭回归。

使用多项式回归模型

import numpy as np
import matplotlib.pyplot as plt
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler

x = np.random.uniform(-3,3,size=100)
y = 0.5*x +3 +np.random.normal(0,1,size=100)
X = x.reshape(-1,1)

plt.scatter(x,y)

x_train,x_test,y_train,y_test = train_test_split(X,y)

def plt_model(model):
    plt_x = np.linspace(-3,3,100).reshape(100,1)
    y_predict = model.predict(plt_x)
    plt.scatter(x,y)
    plt.plot(plt_x[:,0],y_predict)
    plt.show()
    
def PolynomialDegression(degree):
    return Pipeline([
    ("poly_reg",PolynomialFeatures(degree)),
    ("std",StandardScaler()),
    ("liner_reg",LinearRegression())
    ])

poly_reg = PolynomialDegression(degree=20)
poly_reg.fit(x_train,y_train)
plt_model(poly_reg)

在这里插入图片描述

使用岭回归模型

import numpy as np
import matplotlib.pyplot as plt
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import Ridge

x = np.random.uniform(-3,3,size=100)
y = 0.5*x +3 +np.random.normal(0,1,size=100)
X = x.reshape(-1,1)

plt.scatter(x,y)

x_train,x_test,y_train,y_test = train_test_split(X,y)

def plt_model(model):
    plt_x = np.linspace(-3,3,100).reshape(100,1)
    y_predict = model.predict(plt_x)
    plt.scatter(x,y)
    plt.plot(plt_x[:,0],y_predict)
    plt.show()
    
def RidgeRegression(degree,aplpha):
    return Pipeline([
    ("poly_reg",PolynomialFeatures(degree)),
    ("std",StandardScaler()),
    ("ridge",Ridge())
    ])

ridge = RidgeRegression(20,10000)
ridge.fit(x_train,y_train)
plt_model(ridge)

在这里插入图片描述
从结果可以看出,使用岭回归模型训练,超参数 a l p h a alpha alpha取值非常重要,当 a l p h a alpha alpha取适合的值时,能非常有效的降低方差。

LASSO回归

LASSO回归与岭回归不同点是使得下面的目标函数尽可能小
J ( θ ) = ∑ i = 1 m ( y ( i ) − θ 0 − θ 1 X 1 ( i ) − … … − θ n X n ( i ) ) 2 + α ∑ i = 1 n ∣ θ ∣ J(\theta)=\sum_{i=1}^m (y^{(i)}-\theta_0-\theta_1X^{(i)}_1-……-\theta_nX_n^{(i)})^2 + \alpha \sum_{i=1}^n |\theta| J(θ)=i=1m(y(i)θ0θ1X1(i)θnXn(i))2+αi=1nθ

import numpy as np
import matplotlib.pyplot as plt
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import Lasso

x = np.random.uniform(-3,3,size=100)
y = 0.5*x +3 +np.random.normal(0,1,size=100)
X = x.reshape(-1,1)

x_train,x_test,y_train,y_test = train_test_split(X,y)

def plt_model(model):
    plt_x = np.linspace(-3,3,100).reshape(100,1)
    y_predict = model.predict(plt_x)
    plt.scatter(x,y)
    plt.plot(plt_x[:,0],y_predict,color='r')
    plt.show()
    
def LassoRegression(degree,alpha):
    return Pipeline([
    ("poly_reg",PolynomialFeatures(degree)),
    ("std",StandardScaler()),
    ("lasso",Lasso(alpha=alpha))
    ])

lasso = LassoRegression(20,0.1)
lasso.fit(x_train,y_train)
plt_model(lasso)

在这里插入图片描述

岭回归与LASSO回归区别

  • 岭回归训练得到的模型很难得到一条直线,始终是保持弯曲的形状,而LASSO回归,更趋向是一条直线
  • 岭回归是使得每个 θ \theta θ趋于0,但不等于0,所以岭回归训练得到的模型始终保持弯曲形状;LASSO趋向于使得一部分的 θ \theta θ值为0,所以LASSO训练出来的模型趋向于一条直线
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

德乌大青蛙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值