【机器学习】LASSO回归、弹性网络回归(附python代码)
LASSO回归
LASSO是由1996年Robert Tibshirani首次提出,该方法是一种压缩估计。与岭回归类似,LASSO也是通过构造一个惩罚函数得到一个性能更好的模型。相比于岭回归,LASSO更极端。它通过惩罚函数压缩回归系数,使得这些回归系数绝对值之和小于某个固定值,甚至将一些重复的没必要的参数直接缩减为0。因此LASSO保留了子集收缩的优点,达到提取有用特征的作用,是一种处理具有复共线性数据的有偏估计。
LASSO回归与岭回归的模型的区别在于岭回归使用的是L2正则,而LASSO回归使用的是L1正则,其目标函数:
f ( w ) = 1 2 m ∑ i = 1 m [ ( y i − x i T w ) 2 + λ ∑ j = 1 n ∣ w j ∣ ] f(w) = \frac{1}{2m}\sum_{i=1}^{m}[(y_{i}-x_{i}^{T}w)^{2}+\lambda \sum_{j=1}^{n}\left |w_{j} \right |] f(w)=2m1∑i=1m[(yi−xiTw)2+λ∑j=1n∣wj∣]
LASSO算法可以达到变量选择的效果,将不显著的变量系数压缩至0。对于经过数据处理后的变量矩阵,其中有的变量是可以忽略,甚至会影响整体模型效果,因此采用LASSO作为集成模型的基模型很适合。
弹性网络回归
弹性网络回归ElasticNet是LASSO回归和岭回归的混合体,是一种同时使用L1和L2先验作为正则化矩阵的线性回归模型。ElasticNet回归适用于存在多个不显著变量的数据,同时还能保持正则化属性。当多个变量与某一变量存在相关关系时,ElasticNet回归模型效果就会比较好。它既能像LASSO回归删除无效变量,同时又能保持岭回归的稳定性。
ElasticNet回归的目标函数同时包含L1和L2正则项:
f ( w ) = 1 2 m ∑ i = 1 m [ ( y i − x i T w ) 2 + λ 1 ∑ j = 1 n ∣ w j ∣ + λ 2 ∑ j = 1 n w j 2 ] f(w) = \frac{1}{2m}\sum_{i=1}^{m}[(y_{i}-x_{i}^{T}w)^{2}+\lambda _{1}\sum_{j=1}^{n}\left |w_{j} \right |+\lambda _{2}\sum_{j=1}^{n}w_{j}^{2}] f(w)=2m1∑i=1m[(yi−xiTw)2+λ1∑j=1n∣wj∣+λ2∑j=1nwj2]
python代码实现
import numpy as np
import pandas as pd
import os
'''
导入数据
'''
file = os.path.abspath(os.path.join(os.getcwd(), ".."))
data_file = os.path.join(file, 'data/train.csv')
train = pd.read_csv(data_file)
data_file = os.path.join(file, 'data/test.csv')
test = pd.read_csv(data_file)
target_variable = train["y"].values
del train["y"]from sklearn.model_selection import KFold, cross_val_score
from sklearn.pipeline import make_pipeline
from sklearn.linear_model import ElasticNet, Lasso
from sklearn.preprocessing import RobustScaler
'''
建模
'''
# 定义一个交叉评估函数 Validation function
n_folds = 5
def rmsle_cv(model):kf = KFold(n_folds, shuffle=True, random_state=42).get_n_splits(train.values)rmse= np.sqrt(-cross_val_score(model, train.values, target_variable, scoring="neg_mean_squared_error", cv = kf))return(rmse)# LASSO回归(LASSO Regression) Lasso score: 0.1101 (0.0058)
lasso = make_pipeline(RobustScaler(), Lasso(alpha =0.0005, random_state=1))
score = rmsle_cv(lasso)
print("\nLasso score: {:.4f} ({:.4f})\n".format(score.mean(), score.std()))# 弹性网络回归(Elastic Net Regression) Lasso score: 0.1100 (0.0059)
ENet = make_pipeline(RobustScaler(), ElasticNet(alpha=0.0005, l1_ratio=.9, random_state=3))
score = rmsle_cv(ENet)
print("\nLasso score: {:.4f} ({:.4f})\n".format(score.mean(), score.std()))
'''
预测
'''
y_train = target_variable
x_train = train.values
lasso .fit(x_train,y_train)
y = lasso .predict(test.values)
引用
[1]: Tibshirani R . Regression shrinkage and selection via the lasso: a retrospective[J]. Journal of the Royal Statistical Society: Series B (Statistical Methodology), 2011, 73(3):267-288.
[2]: Durbin R , Willshaw D . An analogue approach to the travelling salesman problem using an elastic net method[J]. Nature, 1987, 326(6114):689-691.
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
