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

5 LASSO回归

5.1 简介

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

成本函数:

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

说明:λ>0

  1. L1范数:向量中的各个元素绝对值之和
  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范数正则化,以限制模型参数对异常样本的匹配程度,进而提高模型面对多数正常样本的拟合精度,解决过拟合问题

成本函数:

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

说明:λ>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)
青葱年少的头像青葱年少普通用户
上一篇 2022年5月8日
下一篇 2022年5月8日

相关推荐