【机器学习05】LASSO回归与ElasticNet(弹性网)

5 LASSO回归

5.1 简介

LASSO回归:在模型迭代过程所依据的代价函数中增加了正则惩罚项(L1范数正则化),以限制模型参数对异常样本的匹配程度,进而提高模型面对多数正常样本的拟合精度,解决过拟合问题

代价函数

J ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ∥ θ ∥ 1 = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ∑ j = 1 n ∣ θ j ∣ J(\theta)=\frac{1}{2m}\sum\limits_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})^2+\lambda \left\|\theta\right\|_1=\frac{1}{2m}\sum\limits_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})^2+\lambda\sum\limits_{j=1}^n\left|{{\theta _j}}\right| J(θ)=2m1i=1m(hθ(x(i))y(i))2+λθ1=2m1i=1m(hθ(x(i))y(i))2+λj=1nθj

说明:λ>0

  1. L1范数:向量中的各个元素绝对值之和,即 ∥ θ ∥ 1 = ∑ j = 1 n ∣ θ j ∣ {\left\| \theta \right\|_1} = \sum\limits_{j = 1}^n {\left| {{\theta _j}} \right|} θ1=j=1nθj
  2. 正则强度λ(惩罚因子)越大,曲线的拟合度越低,忽略异常样本(噪音)的效果越好

5.2 Sklearn之LASSO回归

LASSO回归相关API:

# sklearn库
import sklearn.linear_model as lm

# 创建模型
model=lm.Lasso(正则强度,fit_intercept=是否训练截距,max_iter=最大迭代次数,normalize=是否特征归一化)
# 训练模型
# 输入:一个二维数组表示的样本矩阵
# 输出:每个样本最终的结果
model.fit(输入,输出)
# 预测输出
# 输入array是一个二维数组,每一行是一个样本,每一列是一个特征
result=model.predict(array)

案例:加载abnormal.txt文件中的数据,基于LASSO回归算法训练回归模型

import numpy as np
import matplotlib.pyplot as plt
# sklearn库
import sklearn.linear_model as lm

# 加载数据:读文本
def loaddata():
    # x,y=np.loadtxt("data/abnormal.txt",delimiter=",",unpack=True)
    data=np.loadtxt("data/abnormal.txt",delimiter=",")
    cols=data.shape[1]    # data.shape[1]:列数
    x=data[:,0:cols-1] 
    y=data[:,-1].reshape(-1,1)          # data[:,-1]:获取所有行的最后一列
    return x,y

x,y=loaddata()

## LASSO回归
model=lm.Lasso(0.01,fit_intercept=True,max_iter=1000,normalize=True)  # 模型构建
model.fit(x,y)  # 模型训练 
print("\n")
print("系数:",model.coef_)
print("截距:",model.intercept_)
pred_y=model.predict(x)     # 模型预测
plt.title("modelLASSO Regression")
plt.scatter(x,y)
plt.plot(x,pred_y)

6 ElasticNet(弹性网)

6.1 简介

ElasticNet(弹性网):在模型迭代过程所依据的代价函数中结合了L1范数正则化与L2范数正则化,以限制模型参数对异常样本的匹配程度,进而提高模型面对多数正常样本的拟合精度,解决过拟合问题

代价函数

J ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ( ρ ∥ θ ∥ 1 + ( 1 − ρ ) ∥ θ ∥ 2 2 ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ( ρ ∑ j = 1 n ∣ θ j ∣ + ( 1 − ρ ) ∑ j = 1 n θ j 2 ) J(\theta)=\frac{1}{2m}\sum\limits_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})^2+\lambda \left( {\rho {{\left\| \theta \right\|}_1} + \left( {1 - \rho } \right)\left\| \theta \right\|_2^2} \right)=\frac{1}{2m}\sum\limits_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})^2+\lambda \left( {\rho \sum\limits_{j = 1}^n {\left| {{\theta _j}} \right|} + \left( {1 - \rho } \right)\sum\limits_{j = 1}^n {\theta _j^2} } \right) J(θ)=2m1i=1m(hθ(x(i))y(i))2+λ(ρθ1+(1ρ)θ22)=2m1i=1m(hθ(x(i))y(i))2+λ(ρj=1nθj+(1ρ)j=1nθj2)

说明:λ>0,0≤ρ≤1(权重占比)

  1. L1范数:向量中的各个元素绝对值之和
  2. L2范数:向量中的各个元素平方之和的开平方
  3. 正则强度λ(惩罚因子)越大,曲线的拟合度越低,忽略异常样本(噪音)的效果越好

5.2 Sklearn之ElasticNet

ElasticNet相关API:

# sklearn库
import sklearn.linear_model as lm

# 创建模型
model=lm.ElasticNet(正则强度,l1_ratio=L1正则惩罚项权重占比,fit_intercept=是否训练截距,max_iter=最大迭代次数,normalize=是否特征归一化)
# 训练模型
# 输入:一个二维数组表示的样本矩阵
# 输出:每个样本最终的结果
model.fit(输入,输出)
# 预测输出
# 输入array是一个二维数组,每一行是一个样本,每一列是一个特征
result=model.predict(array)

案例:加载abnormal.txt文件中的数据,基于ElasticNet训练回归模型

import numpy as np
import matplotlib.pyplot as plt
# sklearn库
import sklearn.linear_model as lm

# 加载数据:读文本
def loaddata():
    # x,y=np.loadtxt("data/abnormal.txt",delimiter=",",unpack=True)
    data=np.loadtxt("data/abnormal.txt",delimiter=",")
    cols=data.shape[1]    # data.shape[1]:列数
    x=data[:,0:cols-1] 
    y=data[:,-1].reshape(-1,1)          # data[:,-1]:获取所有行的最后一列
    return x,y

x,y=loaddata()

## ElasticNet(弹性网)
model4=lm.ElasticNet(0.01,l1_ratio=0.2,fit_intercept=True,max_iter=1000,normalize=True)  # 模型构建
model4.fit(x,y)  # 模型训练 
print("\n")
print("系数:",model4.coef_)
print("截距:",model4.intercept_)
pred_y=model4.predict(x)     # 模型预测
plt.title("ElasticNet")
plt.scatter(x,y)
plt.plot(x,pred_y)
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值