【机器学习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(θ)=2m1 i=1∑m (hθ (x(i))−y(i))2+λ∥θ∥1 =2m1 i=1∑m (hθ (x(i))−y(i))2+λj=1∑n ∣θj ∣
说明：λ>0
L1范数：向量中的各个元素绝对值之和，即 ∥ θ ∥ 1 = ∑ j = 1 n ∣ θ j ∣ {\left\| \theta \right\|_1} = \sum\limits_{j = 1}^n {\left| {{\theta _j}} \right|} ∥θ∥1 =j=1∑n ∣θj ∣
正则强度λ(惩罚因子)越大，曲线的拟合度越低，忽略异常样本(噪音)的效果越好
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(θ)=2m1 i=1∑m (hθ (x(i))−y(i))2+λ(ρ∥θ∥1 +(1−ρ)∥θ∥22 )=2m1 i=1∑m (hθ (x(i))−y(i))2+λ(ρj=1∑n ∣θj ∣+(1−ρ)j=1∑n θj2 )
说明：λ>0，0≤ρ≤1(权重占比)
L1范数：向量中的各个元素绝对值之和
L2范数：向量中的各个元素平方之和的开平方
正则强度λ(惩罚因子)越大，曲线的拟合度越低，忽略异常样本(噪音)的效果越好
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)