本文为数据茶水间群友原创,经授权在本公众号发表。
关于作者:JunLiang,一个热爱挖掘的数据从业者,勤学好问、动手达人,期待与大家一起交流探讨机器学习相关内容~
0x00 前言
我们在《特征工程系列:特征筛选的原理与实现(上)》中介绍了特征选择的分类,并详细介绍了过滤式特征筛选的原理与实现。本篇继续介绍封装式和嵌入式特征筛选的原理与实现。
0x01 特征选择实现方法三:线性模型与正则化
1.主要思想
当所有特征在相同尺度上时,最重要的特征应该在模型中具有最高系数,而与输出变量不相关的特征应该具有接近零的系数值。即使使用简单的线性回归模型,当数据不是很嘈杂(或者有大量数据与特征数量相比)并且特征(相对)独立时,这种方法也能很好地工作。
2.正则化模型
正则化就是把额外的约束或者惩罚项加到已有模型(损失函数)上,以防止过拟合并提高泛化能力。损失函数由原来的E(X,Y)变为E(X,Y)+alpha||w||,w是模型系数组成的向量(有些地方也叫参数parameter,coefficients),||·||一般是L1或者L2范数,alpha是一个可调的参数,控制着正则化的强度。当用在线性模型上时,L1正则化和L2正则化也称为Lasso和Ridge。
1)L1正则化/Lasso regression
L1正则化将系数w的l1范数作为惩罚项加到损失函数上,由于正则项非零,这就迫使那些弱的特征所对应的系数变成0。因此L1正则化往往会使学到的模型很稀疏(系数w经常为0),这个特性使得L1正则化成为一种很好的特征选择方法。
Lasso能够挑出一些优质特征,同时让其他特征的系数趋于0。当如需要减少特征数的时候它很有用,但是对于数据理解来说不是很好用。
2)L2正则化/Ridge regression
L2正则化将系数向量的L2范数添加到了损失函数中。
由于L2惩罚项中系数是二次方的,这使得L2和L1有着诸多差异,最明显的一点就是,L2正则化会让系数的取值变得平均。
对于关联特征,这意味着他们能够获得更相近的对应系数。
Ridge将回归系数均匀的分摊到各个关联变量上。
L2正则化对于特征选择来说一种稳定的模型,不像L1正则化那样,系数会因为细微的数据变化而波动。所以L2正则化和L1正则化提供的价值是不同的,L2正则化对于特征理解来说更加有用:表示能力强的特征对应的系数是非零。
3.原理介绍
多元线性回归,具有n个特征值,预测公式如下。
多元线性回归方程演变成求θ。
每个特征都有对应的权重系数coef,特征的权重系数的正负值代表特征与目标值是正相关还是负相关,特征的权重系数的绝对值代表重要性。
sklearn中 中LinearRegression的fit()方法就是通过训练集求出θ,LinearRegression的两个属性intercept和coef分别对应θ0和θ1-θn。
4.代码实现
1)普通线性模型
#获取boston数据boston=datasets.load_boston()x=boston.datay=boston.target#过滤掉异常值x=x[y<50]y=y[y<50]reg=LinearRegression()reg.fit(x,y)#求排序后的coefcoefSort=reg.coef_.argsort()#featureNameSort: 按对标记值的影响,从小到大的各特征值名称#featureCoefSore:按对标记值的影响,从小到大的coef_featureNameSort=boston.feature_names[coefSort]featureCoefSore=reg.coef_[coefSort]print("featureNameSort:", featureNameSort)print("featureCoefSore:", featureCoefSore)# 输出:featureNameSort: ['NOX' 'DIS' 'PTRATIO' 'LSTAT' 'CRIM' 'INDUS' 'AGE' 'TAX' 'B' 'ZN' 'RAD' 'CHAS' 'RM']featureCoefSore: [-1.24268073e+01 -1.21088069e+00 -8.38888137e-01 -3.50952134e-01 -1.05574295e-01 -4.35179251e-02 -2.36116881e-02 -1.37702943e-02 7.93577159e-033.52748549e-02 2.50740082e-01 4.55