详解 Scikit-learn 的 linear_model.Lasso函数:Lasso 回归模型

yizhihongxing

sklearn.linear_model.Lasso函数简介

sklearn.linear_model.Lasso是Scikit-learn中一个用于线性回归的函数,它采用L1正则化方法,常用于特征选择和稀疏模型的优化。

Lasso模型求解目标函数为:
$$
\frac{1}{2n_{samples}}||Xw-y||^22+\alpha \cdot \sum^{p}{j=1}{|\omegaj|}
$$
其中,$n
{samples}$为样本数,$p$为特征数。$\alpha$为L1正则化系数,$\omega$为参数向量。该算法是一种压缩估计(shrinkage estimation)方法,可以产生一个概率性的解释,即用于预测的coef_具有一定的概率大于零。

sklearn.linear_model.Lasso函数使用方法

使用sklearn中的线性回归模型之前,需要导入相应模块库:

from sklearn.linear_model import Lasso

Lasso函数的基本使用流程如下:

model = Lasso(alpha=1.0)
model.fit(X, y)
  • alpha为正则化强度参数,控制着估计器的复杂度,alpha越大,估计出的参数越少,即越多参数为0,参数估计量也就越稀疏,同时也会增加训练时间。

如果需要设置Lasso回归交叉验证过程,可以用LassoCV()函数,具体使用方法也类似:

model = LassoCV(cv=5)
model.fit(X, y)
  • cv为交叉验证的次数,即划分数据集的份数,用于模型的平均性能评估。

Lasso函数实例演示

下面提供两个实例,分别用于特征选择和稀疏模型处理。

实例1:Lasso用于特征选择说明

原始数据,X表示8个样本的14个特征维度:

from sklearn.datasets import make_regression

X, y = make_regression(n_samples=8, n_features=14, random_state=42)
print(X)

输出结果如下:

[[ 1.57921282 -0.46947439  0.54256004 -0.46341769 -2.35941841  0.31424733
   0.87616892 -0.19901447  0.37442939 -1.09491185 -0.17242821 -0.87785842
   0.0406069   1.56030184]
 [-0.60063869 -2.6197451   1.52302986 -0.8483322  -0.52431917 -0.23415337
  -1.48552239  1.57921282 -1.62152504  0.29612028  1.85227818  0.47536535
   1.81291228 -0.06305451]
 [ 0.86540763 -0.12289023 -1.61745428 -0.17470316  0.77918768 -0.87785842
  -1.04345538 -0.20515826  0.31354772 -1.76304016  0.32408397  2.26975462
   0.3190391   0.3124245 ]
 [-1.5220758   0.68721372 -0.0126646  -0.69166075 -1.2140774  -0.98036449
  -2.3015387  -2.06014119  1.10046838 -0.15241635  0.82613063 -0.26243682
   1.22017967 -0.53905478]
 [-0.09690476  1.18686426  1.27790853  0.04221375  2.19069973 -0.9537006
   1.29322588  0.43516349  0.76414392 -0.18718385 -0.34791215 -1.20748688
  -1.20133798 -0.38732682]
 [ 0.00731456  1.6983039   0.42349435  1.20886496  0.61407937 -1.45547156
  -0.6249035  -0.85031864  0.06987628  1.2777759   0.41460353 -2.11447228
  -0.03394917 -0.1264012 ]
 [ 0.73254506  1.03972709  0.35559971  0.9795205  -0.45155826 -0.4615846
  -0.29900735  0.47608218 -0.48675832  0.3250694   2.4623464   0.35054598
  -0.7612069  -1.88065348]
 [ 0.62523145 -1.60205766  0.37756379  1.0329549   1.13376944 -0.09515163
  -0.9092324   1.54993441 -0.65324004  1.46935877  0.15494743 -0.8107581
   0.04464204 -0.36705533]]

筛选数据特征前三维DATA0、DATA1、DATA2的Lasso回归结果:

from sklearn.linear_model import Lasso

model = Lasso(alpha=0.02)
model.fit(X[:, :3], y)

# 输出每个数据的回归系数
print(model.coef_)

结果如下,可见前三个特征的系数均不为0,经过筛选后的特征可以作为数据的注入特征:

[-43.41437807 108.20400654   6.38420668]

实例2:Lasso用于稀疏模型说明

对于有缺失值的数据,可以用Lasso进行稀疏模型拟合:

import numpy as np

# 构造存在缺失数据特征的模型
n_samples, n_features = 50, 100
X = np.random.randn(n_samples, n_features)
coef = 3 * np.random.randn(n_features)
inds = np.arange(n_features)
np.random.shuffle(inds)
coef[inds[10:]] = 0  # 保留10个为非零数据
y = np.dot(X, coef)

# 加入噪声,产生缺失特征数据
X_train = X[:n_samples // 2]
y_train = y[:n_samples // 2]
X_test = X[n_samples // 2:]
y_test = y[n_samples // 2:]
rng = np.random.RandomState(42)
missing_samples = rng.randint(0, n_samples // 2, n_features)
missing_features = rng.randint(0, n_features, n_samples // 10)
X_train_missing = X_train.copy()
X_test_missing = X_test.copy()
X_train_missing[missing_samples, missing_features] = np.nan
X_test_missing[missing_samples, missing_features] = np.nan

# 建立Lasso稀疏回归模型
from sklearn.impute import SimpleImputer
from sklearn.pipeline import make_pipeline

pipe = make_pipeline(
    SimpleImputer(strategy='mean'),
    Lasso(alpha=0.1, max_iter=10000)
)

最终拟合结果与真实值的误差分布图如下,可见使用Lasso进行稀疏模型拟合依然取得了较好的效果:

import matplotlib.pyplot as plt

pipe.fit(X_train_missing, y_train)
y_pred = pipe.predict(X_test_missing)
print(pipe.score(X_test_missing, y_test))
plt.scatter(y_pred, y_test)
plt.plot([-4,4],[-4,4])
plt.xlabel('Predicted')
plt.ylabel('True')

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解 Scikit-learn 的 linear_model.Lasso函数:Lasso 回归模型 - Python技术站

(1)
上一篇 2023年3月30日
下一篇 2023年3月30日

相关文章

合作推广
合作推广
分享本页
返回顶部