【机器学习】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)=2m1i=1m[(yixiTw)2+λj=1nwj]

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)=2m1i=1m[(yixiTw)2+λ1j=1nwj+λ2j=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.

你可能感兴趣的:(python,机器学习,人工智能,算法)