【机器学习】套索回归

上一节中,了解了什么是标准线性模型与什么是岭回归。并且也知道岭回归存在一种被叫做L2正则化的约束。

除了Ridge,还有一种正则化的线性回归是lasso。与岭回归相同,使用lassob也是约束系数使其接近于0.但用到的方法不同,叫作L1正则化。L1正则化的结果是,使用lasso某些系数刚好为0。这说明某些特征被模型完全忽略。这可以看作是一种自动化的特征选择。某些系数刚好为0,这样模型量多容易解释,也可以带刺模型最重要的特征。

lasso模块的使用在linear_model下的Lasso中。

# 在学习之前,先导入这些常用的模块
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import mglearn

套索回归 Lasso

接下来,我们将lasso应用在扩展的波士顿房价数据集上:

# 导入lasso模块
from sklearn.linear_model import Lasso
# 导入 train_test_split 模块 
from sklearn.model_selection import train_test_split

# 导入波士顿房价数据
X, y = mglearn.datasets.load_extended_boston()
# 将数据分为训练集与测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
# 实例化lasso对象,并对训练集数据进行训练
lasso = Lasso().fit(X_train, y_train)
print('lasso在训练集的评估分数:', lasso.score(X_train, y_train))
print('lasso在测试集的评估分数:', lasso.score(X_test, y_test))
print('lasso模型保存的特征数量:', np.sum(lasso.coef_ != 0))
lasso在训练集的评估分数: 0.29323768991114607
lasso在测试集的评估分数: 0.20937503255272294
lasso模型保存的特征数量: 4

结果显示,Lasso在训练集和测试集上的表现都不好,这说明这个模型存在欠拟合的现象。

当显示某数据的特征(斜率)是0的时候,表示是被模型忽略的。这里非0的特征数量只有4个,说明有过多的特征被忽略了。

为了降低欠拟合,需要降低alpha参数,也就是让模型显得“更复杂一点”。除了这么做,还需要增加max_iter参数,并适当修改它的值。该值表示运行迭代的最大次数。

# 降低alpha的值,增大max_iter的值
lasso001 = Lasso(alpha=0.01, max_iter=100000).fit(X_train, y_train)
print('lasso001在训练集的评估分数:', lasso001.score(X_train, y_train))
print('lasso001在测试集的评估分数:', lasso001.score(X_test, y_test))
print('lasso001模型保存的特征数量:', np.sum(lasso001.coef_ != 0))
lasso001在训练集的评估分数: 0.896506955975129
lasso001在测试集的评估分数: 0.7656489887843521
lasso001模型保存的特征数量: 33

由此可见,我调小了alpha的值,并加大了max_iter的值。模型的的评估结果表现变得好了许多,并且,使用到的特征数量也有所增加。

但需要注意的是,不能为了继续提高模型的泛化能力而将alpha的值改为0,这样该模型将与LinearRegression的结果类似,将出现过拟合的情况。

不信看下面:

# 让alpha的值接近于0
lasso00001 = Lasso(alpha=0.0001, max_iter=100000).fit(X_train, y_train)
print('lasso00001在训练集的评估分数:', lasso00001.score(X_train, y_train))
print('lasso00001在测试集的评估分数:', lasso00001.score(X_test, y_test))
print('lasso00001模型保存的特征数量:', np.sum(lasso00001.coef_ != 0))
lasso00001在训练集的评估分数: 0.9510610436181262
lasso00001在测试集的评估分数: 0.6403098994161569
lasso00001模型保存的特征数量: 94

这样的结果表明,模型在训练集表现相当优异,而在测试集的表现一般,这种现在是因为近拟合造成的,只能适配于训练的数据,而无法很好的适应于新的数据集。

接下来,就将alpha不同值情况下,模型的泛化能力结果图示化展示现在,以方便大家理解。

plt.plot(lasso.coef_, 's', label='Lasso alpha=1')
plt.plot(lasso001.coef_, '^', label='Lasso alpha=0.01')
plt.plot(lasso00001.coef_, 's', label='Lasso alpha=0.0001')

plt.legend(ncol=2, loc=(0, 1.05))
plt.ylim(-25, 25)
plt.xlabel('Coefficient index')
plt.ylabel('Coefficient magnitude')
plt.show()

从上图可以看出,当alpah的值越小时,将有越多的系数在0附近。

在实践中,岭回归套索回归首先岭回归。但是,如果特征特别多,而某些特征更重要,具有选择性,那就选择Lasso可能更好。

scikit-learn还提供了ElasticNet类,结合了LassoRidge的惩罚项。在实践中,这种结合的效果最好,不过代价是要调节两个参数:一个用于L1正则化,一个用于L2正则化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章