1.套索回归的原理:
和岭回归一样,套索回归也会将系数限制在非常接近0的范围内,但是它限制的方式稍微有些不同,我们称之为L1正则化。与L2正则化不同的是,L1正则化会导致在使用套索回归的时候,有一部分特征的系数会正好等于0.也就是说,有一部分特征会彻底被模型忽略掉,这也可以看成是模型对特征进行自动选择的一种方式。把一部分系数变成0有助于让模型更容易理解,而且可以突出体现模型中最重要的那些特征。
2.套索回归实战:
import numpy as np
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
X,y=load_diabetes().data,load_diabetes().target
X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=1)
from sklearn.linear_model import Lasso
lasso=Lasso().fit(X_train,y_train)
print('训练集得分:{}'.format(lasso.score(X_train,y_train)))
print('测试集得分:{}'.format(lasso.score(X_test,y_test)))
print('套索回归使用的特征数量:{}'.format(np.sum(lasso.coef_!=0)))
结果分析: 这里我们看到,套索回归在训练数据集和测试数据集的得分都相当糟糕。这意味着我们的模型发生了欠拟合的问题,而且你会发现,在十个特征里,套索回归只用了其中的2个。与岭回归类似,套索回归也有一个正则化参数alpha,用来控制特征变量系数被约束到0的强度。
3.套索回归的参数调节:
在上面的例子里,我们使用了alpha参数的默认值1,为了降低欠拟合的程度,我们可以试着降低alpha的值,与此同时,我们还需要增加最大迭代次数(max——iter)的默认设置。
import numpy as np
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
X,y=load_diabetes().data,load_diabetes().target
X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=1)
from sklearn.linear_model import Lasso
lasso=Lasso(alpha=0.1,max_iter=100000).fit(X_train,y_train)
print('训练集得分:{}'.format(lasso.score(X_train,y_train)))
print('测试集得分:{}'.format(lasso.score(X_test,y_test)))
print('套索回归使用的特征数量:{}'.format(np.sum(lasso.coef_!=0)))
结果分析: 从结果上来看,降低alpha值可以拟合出更复杂的模型,从而在训练数据集和测试数据集都难获得良好的表现,相对岭回归,套索回归的表现还要更好一些,而且它只用了10个特征中的7个,这一点也会使模型更容易被人理解。 但是,如果我们把alpha设置的太低,就等于把正则化的效果去处了,那么模型就可能会像线性回归一样,出现过拟合的问题。
4.总结
在实践当中,岭回归往往是这两个模型中的优选。但是如果你的数据特征过多,而且其中只有一小部分是真正重要的,那么套索回归就是更好的选择。同样如果你需要对模型进行解释的话,那么套索回归会让你的模型更容易被人理解,因为它只使用了输入的特征值中的一部分。
ps:sklearn中还提供了一种模型,称为弹性网模型,弹性网模型综合了套索回归和岭回归的惩罚因子。在实践当中,这两个模型的组合是效果最好的,然而代价是用户需要调节两个参数,一个是L1正则化参数,另一个是L2正则化参数。
|