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技术站