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=1∑m(hθ(x(i))−y(i))2+λ∥θ∥1=2m1i=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(θ)=2m1i=1∑m(hθ(x(i))−y(i))2+λ(ρ∥θ∥1+(1−ρ)∥θ∥22)=2m1i=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)