特征选择
一、概念
1.1 数据集
数据集由数据对象(Data Objects)组成,一个数据的集合,通常以表格形式出现。
数据行对应数据对象,一个数据对象代表一个实体(Entity),数据对象又称为样本、实例、数据点、对象。
数据列对应属性(或者称为特征、字段、指标等)。
1.2 属性
1.2.1 分类属性
- 定类: 属性值仅仅是区分彼此的标志,没有序次关系。如颜色、性别等。
- 定序: 属性表示个体在某个有序状态中处的位置。如学历、等级等。
1.2.2 数值属性
- 定距: 区间属性的值有序,可以评估值之间的差,不能评估倍数。如温度等。
- 定比: 值有序,可以评估值之间的差,也可以说一个值是另一个值的倍数。如重量、高度、长度等。
1.3 特征来源
- 来源一: 业务已经整理好各种特征数据,即业务指标,有时称为属性,我们需要去找出适合我们问题需要的特征。该类特征通常是业务专家指出,通常是挖掘遇到的最初数据来源,是已有特征,也称原始特征。
- 来源二: 从业务特征中自己去寻找高级数据特征,如若干原始特征的组合后形成一个新特征,即特征衍生。
在特征选择范畴下,属性的概念等同于特征的概念。
1.4 定义
- 特征选择(feature selection)也被称为变量选择、属性选择或属性子集选择。它是为了构建模型而选择相关特征子集的过程。
- 特征选择是指从原始特征中挑选出一组最有代表性、分类性能好的特征。
- 没有确定的步骤,更多是工程上的经验和权衡,一般需要耗费较多的时间和精力,掌握常用的经验和权衡方法,可以极大提高挖掘建模的效率和效果。
- 给定不同的挖掘任务,需要的特征组合可能不同。
现实中大数据挖掘任务,往往特征属性过多,而一个普遍存在的事实是,大数据集带来的关键信息只聚集在部分或少数特征上,因此需要:
- 从中选择出重要的特征使得后续的建模过程只在一部分的特征上构建,减少维数灾难出现的可能。
- 去除不相关的特征,留下关键因素,降低学习任务难度,更容易挖掘数据本身带有的规律;同时在特征选择的过程中,会对数据特征的理解更加充分。
1.5 原则
当数据预处理完成后,需要选择有意义的特征进行模型训练。通常来说,从三个方面考虑:
- 特征是否发散:如果一个特征不发散,例如方差接近于0,也就是说样本在这个特征上基本上没有差异,这个特征对于样本的区分作用不明显,区分度不高。
- 特征之间的相关性:特征与特征之间的线性相关性,去除相关性比较高的特征。
- 特征与目标的相关性:与目标相关性高的特征,应当优先选择
1.6 方法
特征选择方法有很多,主要包含特征减少和特征扩增。
1.6.1 特征减少
单变量特征选择方法
- Filter(过滤法)
- 过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。
基于模型的特征选择方法
- Wrapper(包装法)
- 包装法,根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征。
- Embedded(嵌入法)
- 嵌入法,先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。类似于Filter方法,但是是通过训练来确定特征的优劣。
其他方法
1.6.2 特征扩增
二、
F
i
l
t
e
r
Filter
Filter
2.1 概念
Filter是一种启发式方法,基本思想是:制定一个准则,用来衡量每个特征对目标属性的重要性,以此对所有特征/属性进行排序,或优选操作,特征选择的过程和后续的学习器无关(区别另外两个方法)。
- 过滤法是一类单变量特征选择的方法,独立地衡量每个特征与响应变量之间的关系,根据某一准则来判断哪些指标重要,剔除那些不重要的指标。
- 这种方法比较简单,易于运行,易于理解,通常对于理解数据有较好的效果,是特征选择最初会使用的方法,但对特征优化、提高泛化能力来说效果不能保证。
2.2 方差选择法
2.2.1 概念
- 方差选择法是一种最简单的选择技术,基本思想是:方差越大的特征,对于分析目标影响越大,就越有用。如果方差较小,比如小于1,那么这个特征可能对算法作用比较小。最极端的,如果某个特征方差为0,即所有的样本该特征的取值都是一样的,那么对模型训练没有任何作用,可以直接舍弃。
- 只适用于连续变量。
- 在实际应用中指定一个方差的阈值,当方差小于这个阈值的特征会被去除。
2.2.2 实现
以Boston 房价预测为例
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_boston
from sklearn.feature_selection import VarianceThreshold
data = load_boston()
X = data.data
y = data.target
X = pd.DataFrame(X)
X.std()
0 8.601545
1 23.322453
2 6.860353
3 0.253994
4 0.115878
5 0.702617
6 28.148861
7 2.105710
8 8.707259
9 168.537116
10 2.164946
11 91.294864
12 7.141062
dtype: float64
vt = VarianceThreshold(threshold=5)
xx = vt.fit_transform(X)
xx.shape
(506, 8)
2.3 相关系数法
2.3.1 概念
适用于特征类型均为数值特征的情况。
也称为Pearson相关系数,是一种最简单的,能帮助理解特征和响应变量之间关系的方法,该方法衡量的是变量之间的线性相关性,结果的取值区间为[-1,1],-1表示完全的负相关,+1表示完全的正相关,0表示没有线性相关。
该方法的明显缺陷是只对线性关系敏感,如果特征与响应变量的关系是非线性的,即便两个变量具有一 一对应的关系,相关系数也可能会接近0。建议最好把数据可视化出来,以免得出错误的结论。
Scipy 的pearsonr 方法能够同时计算相关系数r值 和p-value (简称p值 ), p值越小,表示相关系数越显著。
专业上,p值为结果可信程度的一个递减指标,p值越大,我们越不能认为样本中变量的关联是总体中各变量关联的可靠指标。p值是将观察结果认为有效即具有总体代表性的犯错概率。如p=0.05提示样本中变量关联有5%的可能是由于偶然性造成的。即假设总体中任意变量间均无关联,我们重复类似实验,会发现约20个实验中有一个实验,我们所研究的变量关联将等于或强于我们的实验结果。(这并不是说如果变量间存在关联,我们可得到5%或95%次数的相同结果,当总体中的变量存在关联,重复研究和发现关联的可能性与设计的统计学效力有关。)
在许多研究领域,0.05的p值通常被认为是可接受错误的边界水平。
数值属性
A
A
A 和
B
B
B 的相关系数计算公式如下:
r
A
,
B
=
∑
i
=
1
n
(
a
i
?
A
 ̄
)
(
b
i
?
B
 ̄
)
n
σ
A
σ
B
=
∑
i
=
1
n
(
a
i
b
i
)
?
n
A
 ̄
B
 ̄
n
σ
A
σ
B
=
C
o
v
(
A
,
B
)
σ
A
σ
B
r_{A, B} = \frac{\sum\limits^{n}_{i=1}(a_i - \overline{A})(b_i - \overline{B})}{n\sigma_A\sigma_B} = \frac{\sum\limits^{n}_{i=1}(a_ib_i) - n\overline{A}\overline{B}}{n\sigma_{A}\sigma_B} = \frac{Cov(A, B)}{\sigma_A\sigma_B}
rA,B?=nσA?σB?i=1∑n?(ai??A)(bi??B)?=nσA?σB?i=1∑n?(ai?bi?)?nAB?=σA?σB?Cov(A,B)? 其中,
n
n
n 是元组的个数,
a
i
a_i
ai? 和
b
i
b_i
bi? 分别是元组
i
i
i 在
A
A
A 和 $ B$ 上的值,
A
 ̄
\overline{A}
A 和
B
 ̄
\overline{B}
B 分别是
A
A
A 和
B
B
B 的均值,
σ
A
\sigma_A
σA? 和
σ
B
\sigma_B
σB? 别是
A
A
A和
B
B
B的标准差。
c
o
v
(
A
,
B
)
cov(A,B)
cov(A,B)为
A
A
A 和
B
B
B 的 协方差(Covariance),公式如下:
C
o
v
(
A
,
B
)
=
E
(
(
A
?
A
 ̄
)
(
B
?
B
 ̄
)
)
=
∑
i
=
1
n
(
a
i
?
A
 ̄
)
(
b
i
?
B
 ̄
)
n
=
E
(
A
B
)
?
E
(
A
)
E
(
B
)
Cov(A, B) = E((A - \overline{A})(B - \overline{B})) = \frac{\sum\limits^{n}_{i=1}(a_i - \overline{A})(b_i - \overline{B})}{n} = E(AB) - E(A)E(B)
Cov(A,B)=E((A?A)(B?B))=ni=1∑n?(ai??A)(bi??B)?=E(AB)?E(A)E(B)
- 两个变量之间的皮尔逊相关系数定义为两个变量之间的协方差和标准差的商。
- 协方差(Covariance)是两个变量间的相关性,二维的是协方差,三维及以上则构成了协方差矩阵。而方差是协方差的一种特殊情况,即当两个变量是相同的情况。
2.3.2 实现
依旧以Boston 房价预测为例
from scipy import stats
X = X.values
for i in range(X.shape[1]):
X_pear = stats.pearsonr(X[:, i], y)
print(X_pear)
(-0.38830460858681154, 1.1739870821941207e-19)
(0.3604453424505427, 5.713584153079929e-17)
(-0.48372516002837324, 4.900259981751073e-31)
(0.1752601771902987, 7.3906231705176e-05)
(-0.42732077237328253, 7.065041586251507e-24)
(0.6953599470715394, 2.4872288710071593e-74)
(-0.37695456500459623, 1.5699822091877261e-18)
(0.24992873408590388, 1.2066117273368017e-08)
(-0.3816262306397778, 5.465932569647003e-19)
(-0.46853593356776696, 5.637733627689404e-29)
(-0.5077866855375613, 1.6095094784727926e-34)
(0.33346081965706637, 1.3181127340752416e-14)
(-0.7376627261740147, 5.081103394387547e-88)
可以看出第13个特征的p-value 最小,皮尔森相关系数的绝对值最大,表明第13个特征与目标
y
y
y 的相关性显著。
2.4 卡方检验
2.4.1 概念
卡方检验,也叫
x
2
x^2
x2 检验,它可以检验某个特征分布和输出值分布之间的相关性,通常比粗暴的方差选择法好用。
x
2
x^2
x2值描述了自变量与因变量之间的相关程度:
x
2
x^2
x2值越大,相关程度也越大。在特征选择时,保留相关程度大的特征,另外还可以利用χ^2检验做异常检测等。
在sklearn 中,可以使用chi2 这个类来做卡方检验得到所有特征的
x
2
x^2
x2 值与显著性水平
P
P
P 的临界值,给定
x
2
x^2
x2 值阈值, 选择
x
2
x^2
x2 值较大的部分特征。
除了卡方检验,我们还可以使用 F检验 和 t检验,它们都是使用假设检验的方法,只是使用的统计分布不是卡方分布,而是 F分布 和 t分布 而已。在 sklearn 中,有F检验的函数 f_classif 和 f_regression ,分别在分类和回归特征选择时使用。
为了确定从样本(sample)统计结果推论至总体时所犯错的概率,我们会利用统计学家所开发的一些统计方法,进行统计检定。F值、
x
2
x^2
x2 和 t值 就是这些统计检定值
通过把所得到的统计检定值,与统计学家建立了一些随机变量的概率分布(probability distribution)进行比较,我们可以知道在多少%的机会下会得到目前的结果。倘若经比较后发现,出现这结果的机率很少,亦即是说,是在机会很少、很罕有的情况下才出现;那我们便可以有信心的说,这不是巧合,是具有统计学上的意义的(用统计学的话讲,就是能够拒绝虚无假设。
卡方检验原理及应用详见网址 https://segmentfault.com/a/1190000003719712 卡方检验(也叫做
x
2
x^2
x2 检验),被誉为二十世纪科学技术所有分支中的20大发明之一,它的发明者卡尔·皮尔逊是一位历史上罕见的百科全书式的学者,研究领域涵盖了生物、历史、宗教、哲学、法律。
F值和t值就是这些统计检定值,与它们相对应的概率分布,就是F分布和t分布。统计显著性(sig)就是出现目前样本这结果的机率。
假设
A
A
A有
c
c
c个不同值
a
1
a_1
a1?,
a
2
a_2
a2?,…,
a
c
a_c
ac?,
B
B
B 有
r
r
r个不同值
b
1
b_1
b1?,
b
2
b_2
b2?,…,
b
r
b_r
br?,A和B描述的数据元组可以用一个 相依表 表示,其中
A
A
A的
c
c
c 个值构成列,
B
B
B的
r
r
r个值构成行。令
(
a
i
,
b
j
)
(a_i,b_j)
(ai?,bj?) 表示属性
A
A
A 取值 $ a_i$、属性
B
B
B 取值
b
j
b_j
bj? 的联合事件,其中
i
=
1
,
2
,
…
,
c
,
j
=
1
,
2
,
…
,
r
i=1,2,…,c,j=1,2,…,r
i=1,2,…,c,j=1,2,…,r。
x
2
x^2
x2值可用下式计算:
X
2
=
∑
i
=
1
c
∑
j
=
1
r
(
o
i
j
?
e
i
j
)
2
e
i
j
X^2 = \sum\limits^{c}_{i=1}\sum\limits^{r}_{j=1}\frac{(o_{ij} - e_{ij})^2}{e_{ij}}
X2=i=1∑c?j=1∑r?eij?(oij??eij?)2? 其中
o
i
j
o_{ij}
oij? 是联合事件
(
a
i
,
b
j
)
(a_i,b_j)
(ai?,bj?) 的观测频度,而
e
i
j
e_{ij}
eij? 是
(
a
i
,
b
j
)
(a_i,b_j)
(ai?,bj?) 的期望频度,可以用下式计算,其中
n
n
n 为数据元组的个数:
e
i
j
=
c
o
u
n
t
(
A
=
a
i
)
c
o
u
n
t
(
B
=
b
i
)
n
e_{ij} = \frac{count(A = a_i)count(B = b_i)}{n}
eij?=ncount(A=ai?)count(B=bi?)?
x
2
x^2
x2用于衡量实际值与理论值的差异程度(也就是卡方检验的核心思想),包含了以下两个信息:
- 实际值与理论值偏差的绝对大小(由于平方的存在,差异是被放大的)。
- 差异程度与理论值的相对大小。
既然已经得到了
x
2
x^2
x2值,我们又怎么知道
x
2
x^2
x2值是否合理?即怎么知道无关性假设是否可靠?首先计算该相依表的自由度
n
n
n 公式为:
n
=
(
r
?
1
)
×
(
c
?
1
)
n = (r - 1) \times (c - 1)
n=(r?1)×(c?1) 查询卡方分布的临界值表:该表中记录着不同自由度下每个分布的概率。
A与B的相依表
B \ A |
a
1
a_1
a1? |
a
2
a_2
a2? |
…
\dots
… |
a
c
a_c
ac? |
---|
b
1
b_1
b1? |
o
11
o_{11}
o11? |
o
21
o_{21}
o21? |
…
\dots
… |
o
1
c
o_{1c}
o1c? |
b
2
b_2
b2? |
o
21
o_{21}
o21? |
o
22
o_{22}
o22? |
…
\dots
… |
o
2
c
o_{2c}
o2c? |
…
\dots
… |
…
\dots
… |
…
\dots
… |
…
\dots
… |
…
\dots
… |
b
r
b_r
br? |
o
r
1
o_{r1}
or1? |
o
r
2
o_{r2}
or2? |
…
\dots
… |
o
r
c
o_{rc}
orc? |
卡方分布临界值表
| 0.99 | 0.98 | 0.95 | 0.90 | 0.05 | 0.02 | 0.01 | 0.001 |
---|
1 | 0.000 | 0.001 | 0.004 | 0.016 | 0.045 | 5.14 | 6.64 | 10.83 | 2 | 0.020 | 0.040 | 0.103 | 0.211 | 1.36 | 7.82 | 9.21 | 13.82 | 3 | 0.115 | 0.185 | 0.352 | 0.584 | 2.366 | 9.49 | 11.34 | 16.27 | 4 | 0.554 | 0.429 | 0.711 | 1.064 | 3.357 | 11.07 | 13.28 | 18.47 | 5 | 0.874 | 0.752 | 1.145 | 1.610 | 4.351 | 12.69 | 15.09 | 20.52 |
若
n
n
n 个相互独立的随机变量
ξ
1
,
ξ
2
,
…
,
ξ
n
\xi_1,\xi_2,\dots, \xi_n
ξ1?,ξ2?,…,ξn? ,均服从标准正态分布(也称独立同分布于标准正态分布),则这
n
n
n个服从标准正态分布的随机变量的平方和构成一新的随机变量,其分布规律称为卡方分布(chi-square distribution)。
卡方分布临界值表的查看方法:在具体问题中确定需要查询的自由度和分位数分别是什么,然后查表;表的左侧是
n
n
n 值,即自由度,上方一行是
p
p
p 值,即分位数。以自由度为1,分位数为0.001为例。先找到左侧一列,找到数字1,对应那一行,然后找到上方一行,找到数字0.001,对应那一竖。
例如:
喜好 \ 性别 | 男 | 女 | 合计 |
---|
小说 | 250(90) | 200(360) | 450 | 非小说 | 50(210) | 1000(840) | 1050 | 合计 | 300 | 1200 | 1500 |
括号里的值为 似然估计值:(如果喜好与性别没有关系,四个格子应该是括号里的数:$ 90 = 300 \times \frac{450}{1500}
,
,
,\frac{450}{1500}$ 为喜好是小说的概率,乘以男生树300,得到男生喜欢小说的似然估计) KaTeX parse error: Expected 'EOF', got '&' at position 9: e_{11} &?=& \frac{count(…
自
由
度
=
(
c
?
1
)
(
r
?
1
)
=
(
2
?
1
)
(
2
?
1
)
=
1
自由度 = (c-1)(r-1) = (2-1)(2-1) = 1
自由度=(c?1)(r?1)=(2?1)(2?1)=1
在0.001的置信水平下,拒绝假设(两个属性独立)的值是10.83;由于计算的卡方值大于该值,因此拒绝独立假设;阅读偏好与性别强相关。
卡方检验就是统计样本的实际观测值与理论推断值之间的偏离程度,实际观测值与理论推断值之间的偏离程度就决定卡方值的大小,卡方值越大,越不符合;卡方值越小,偏差越小,越趋于符合,若两个值完全相等时,卡方值就为0,表明理论值完全符合。
可以总结:卡方值描述了自变量与因变量之间的相关程度:卡方值越大,相关程度也越大,所以很自然的可以利用卡方值来做特征选择,保留相关程度大的变量。
2.4.2 实现
利用sklearn 的SelectKBest 类,可以移除得分前 k 名以外的所有特征(取
t
o
p
k
top \quad k
topk),此次用鸢尾花分类数据集来进行本次验证
from sklearn.feature_selection import chi2, SelectKBest
from sklearn.datasets import load_iris
X, y = load_iris(return_X_y=True)
chi2_model = SelectKBest(chi2, k=3)
chi2_model.fit_transform(X, y)
for i in range(X.shape[1]):
print((chi2_model.scores_[i], chi2_model.pvalues_[i]))
(10.817820878494006, 0.00447651499022576)
(3.7107283035324987, 0.15639598043162492)
(116.31261309207014, 5.533972277194186e-26)
(67.04836020011113, 2.7582496530034537e-15)
可以看出第三个和第四个特征与目标值的相关性最强。
2.5 互信息法
2.5.1 概念
互信息表示两个变量是否有关系以及关系的强弱。
I
(
X
,
Y
)
=
∑
P
(
X
,
Y
)
l
o
g
(
P
(
X
,
Y
)
P
(
X
)
P
(
Y
)
)
I(X, Y) = \sum {P(X,Y)log(\frac{P(X,Y)}{P(X)P(Y)})}
I(X,Y)=∑P(X,Y)log(P(X)P(Y)P(X,Y)?) 其中,
I
(
X
,
Y
)
I(X,Y)
I(X,Y) 为随机变量
X
X
X 与
Y
Y
Y 之间的互信息,该公式能够很好地度量各种相关性,但计算复杂。
对上述公式变现有
I
(
X
,
Y
)
=
H
(
Y
)
?
H
(
Y
∣
X
)
I(X,Y)=H(Y)?H(Y|X)
I(X,Y)=H(Y)?H(Y∣X),互信息可以理解为,
X
X
X 引入导致
Y
Y
Y 的熵减小的量,其中
H
(
Y
)
H(Y)
H(Y) 表示的
Y
Y
Y 熵,即
Y
Y
Y 的不确定度,
Y
Y
Y 的分布越是离散,其不确定程度就越明显,熵就越大。
其中
Y
Y
Y 的熵的计算公式为:
H
(
Y
)
=
?
∑
P
(
Y
)
l
o
g
P
(
Y
)
H(Y)=-∑P(Y)logP(Y)
H(Y)=?∑P(Y)logP(Y) ,表示平均信息量。
互信息(Mutual Information)是信息论里一种有用的信息度量,它可以看成是一个随机变量中包含的关于另一个随机变量的信息量,或者说是一个随机变量由于已知另一个随机变量而减少的不肯定性。
从信息熵的角度分析特征和输出值之间的关系评分。互信息值越大,说明该特征和输出值之间的相关性越大,越需要保留。 互信息方法使用缺陷:
- 它不属于度量方式,也没有办法归一化,在不同数据集上的结果无法做比较。
- 对于连续变量通常需要先离散化,而互信息的结果对离散化的方式敏感。
sklearn 使用 mutual_info_classif (分类)和 mutual_info_regression (回归)来计算各个输入特征和输出值之间的互信息。
2.5.2 实现
依旧以鸢尾花分类为例
from sklearn.feature_selection import mutual_info_classif
X_mut = mutual_info_classif(X, y)
X_mut
0, 0.484254
1, 0.248885
2, 0.978520
3, 0.981759
此时可以选择互信息值大的作为保留特征,如第四个(0.981759),第三个(0.978520)。
2.6 使用场景
方差选择法:只适用于连续变量
皮尔逊相关系数:适用于特征类型均为数值特征的情况
卡方检验:只适用于连续变量
互信息法:它不属于度量方式,也没有办法归一化,在不同数据集上的结果无法做比较。对于连续变量通常需要先离散化,而互信息的结果对离散化的方式敏感。
2.7 小结
Filter方法总结起来就是利用不同的打分规则,如卡方检验、相关系数、互信息等规则对每个特征进行打分,即相当于给每个特征赋予一个权重,按照权重排序,对不达标的特征进行过滤。
对于理解数据、数据结构、数据分布而言,单变量特征选择是非常好的选择。该方法是通过对特征进行排序来优化模型,但缺点是它不能发现冗余:
- 若特征之间具有强关联,且非线性时,Filter方法不能避免选择的最优特征组合冗余。
- Filter方法中的具体技术有许多改进的版本或变种。
按不同的特征属性类型,可将上述方法做如下划分:
- 评价自变量的信息量或离散情况:方差选择法;
- 评价自变量与自变量(或应变量)的相关性:相关系数法;
- 评价自变量与因变量(或自变量)的相关性:卡方检验方法、互信息法。
三、
W
r
a
p
p
e
r
Wrapper
Wrapper
3.1 引入
- 机器学习的思想认为:特征和模型是分不开的,选择不同的特征训练出的模型也是不同的,特征选择就是模型选择的一部分。
- 相对单变量特征选择方法(如Filter方法),基于模型的特征选择方法是另一类特征选择方法,也称为非单变量特征选择方法。
- 因一些机器学习方法本身就具有对特征进行打分的机制,或者该学习方法很容易运用到特征选择任务中,例如回归模型,
SVM ,决策树,随机森林等等。 - 该方法目前主流的两大类方法是:
- Wrapper(包装法)
- Embedded(嵌入法)
基于模型的特征选择方法思想来源是:越是重要的特征在模型中对应的系数就会越大,而跟输出变量越是无关的特征对应的系数就会越接近于0。在噪音不多的数据上,或是数据量远大于特征数的数据集建模分析问题中:
- 当特征之间是独立的且均为数值型,可以运用线性回归模型。
- 假如特征和响应变量之间的关系是非线性的,可以用基于树的方法(决策树、随机森林)、或者扩展的线性模型等。
- 基于树的方法比较易于使用,因为他们对非线性关系的建模比较好,并且不需要太多的调试。需要注意过拟合问题,避免过拟合的常用方法有:限制树深度、使用交叉验证方法。
3.2 概念
Wrapper,包装法,也形象地称为“弯刀法”,其解决思路没有过滤法直接,在确认算法模型后,把模型本身的性能作为评价准则:
- 包装法需要结合后续选择的机器学习算法,一起选择出能使最终算法达到较高性能的特征子集。
- 根据目标函数,每次选择部分特征,或者排除部分特征。
常用包装法:
换句话说,包装法特征选择就是给后续学习器量身定做的子集
3.3 递归特征消除法
(
R
e
c
u
r
s
i
v
e
??
F
e
a
t
u
r
e
??
E
l
i
m
i
n
a
t
i
o
n
)
(Recursive \; Feature \; Elimination)
(RecursiveFeatureElimination)
3.3.1 概念
简称RFE,使用一个基模型来进行多轮训练,每轮训练后,移除若干权值系数的特征,再基于新的特征集进行下一轮训练。
对特征含有权重的预测模型(例如,线性模型对应参数coefficients),RFE通过递归减少考察的特征集规模来选择特征。预测模型在原始特征上训练,每个特征指定一个权重,随后那些拥有最小绝对值权重的特征会被踢出特征集。如此往复递归,直至剩余的特征数量达到所需的特征数量。
3.3.2 思路
- 指定一个有n个特征的数据集。
- 选择一个算法模型来做RFE的基模型。
- 指定保留的特征数量 k(k<n)。
- 第一轮对所有特征进行训练,算法会根据基模型的目标函数给出每个特征的 “得分”或排名,将最小“得分”或排名的特征剔除,这时候特征减少为n-1,对其进行第二轮训练,持续迭代,直到特征保留为k个,这k个特征就是选择的特征。
RFE的稳定性很大程度上取决于在迭代时底层所采用的模型。例如,假如RFE采用的普通的回归,没有经过正则化的回归是不稳定的,那么RFE就是不稳定的;假如采用的是Ridge,而用Ridge正则化的回归是稳定的,那么RFE就是稳定的。
Sklearn 提供了RFE 包(sklearn.feature_selection.RFE ),用于特征消除,还提供了RFECV ,可以通过交叉验证对特征进行排序后进行筛选。RFECV 类是RFE 的一个变体,它执行一个交叉验证来寻找最优的剩余特征数量,不需要指定保留多少个特征。
3.3.3 实现
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
rfe = RFE(estimator=LogisticRegression(), n_features_to_select=2).fit(X, y)
print(rfe.support_, rfe.ranking_)
[False False True True] [3 2 1 1]
support_ 表示按特征对应位置展示所选特征,True 表示保留,False 表示剔除。ranking_ 表示各特征排名位置,1表示最优特征。
四、
E
m
b
e
d
e
d
Embeded
Embeded
4.1 概念
4.1.1 引入
Embedded,也称嵌入法,相比前两种方法要更加复杂,它利用机器学习算法和模型进行训练,得到各个特征的权值系数,根据权值系数从大到小来选择特征。
- 它类似过滤法,但它是通过机器学习训练来确定特征的优劣,而不是直接从特征的统计学指标来确定特征的优劣。
- 和包装法相比,嵌入法也是用机器学习的方法来选择特征,区别是不通过不停的筛掉特征来进行训练,每次迭代使用的都是特征全集。
- 嵌入式特征选择方法是将特征选择过程与学习器训练过程融为一体,两者在同一个优化过程中完成,即在学习器训练过程中自动完成了特征选择。
4.1.2 方法
常用的嵌入法技术:
线性模型和正则化(Embedded方式)
- 基于线性回归模型方法(理解)
- 基于L1的正则化方法(掌握使用方法、应用场景和优缺点)
- 基于树模型的特征选择(Embedded方式)
线性模型和正则化(Embedded方式)中的基于线性回归模型方法,此处强调理解,可以更好帮助读者理解后续的L1正则化方法和直观的理解整个嵌入法的思想。
对于满足回归关系的数据分布,可以利用回归模型的系数来选择特征,就是利用了越是重要的特征,在模型中对应的系数就会越大,而跟输出变量越是无关的特征,对应的系数就会越接近于0这一特点。 正则化是一种回归的形式,它将系数估计(coefficient estimate)朝零的方向进行约束、调整或缩小。也就是说,正则化可以在学习过程中降低模型复杂度和不稳定程度,从而避免过拟合的危险。正则化(Regularization)包括L1、L2正则化。在原始的代价函数后面加上一个L1正则化项,即所有权重w的绝对值的和,再乘以
λ
\lambda
λ,参数
λ
\lambda
λ 起到了权衡的作用。
这个概念的更广泛用法和介绍会在模型评估中详细说明,此处可以只记住该方法。
4.2 基于L1的正则化
4.2.1 概念
L1正则化即是在简单线性回归模型基础上加入一个L1范数作为惩罚约束,用RSS表示LASSO回归的损失函数,表达式如下:
R
S
S
=
∑
i
=
1
n
(
y
i
?
β
0
?
∑
j
=
1
p
β
j
X
i
j
)
+
λ
∑
j
=
1
p
∣
β
j
∣
RSS = \sum\limits^{n}_{i=1}(y_i - \beta_0 -\sum\limits^{p}_{j=1}\beta_jX_{ij}) + \lambda\sum\limits^{p}_{j=1}|\beta_j|
RSS=i=1∑n?(yi??β0??j=1∑p?βj?Xij?)+λj=1∑p?∣βj?∣
公式加号前一项即线性回归的拟合误差,后一项即为
L
1
L1
L1 正则化项,其中
λ
\lambda
λ 为惩罚项系数(超参数),可以控制惩罚的力度,
λ
\lambda
λ 越大被筛掉的特征越多,正则化项是对回归的系数
β
j
β_j
βj? 做了限制,
L
1
L1
L1 正则化的任务就是在
L
1
L1
L1 正则化项的约束下求
R
S
S
RSS
RSS 最小值;
L1正则化可以产生稀疏权值矩阵,即产生一个稀疏模型,可以用于特征选择,也可以防止过拟合。
Note:
L
a
s
s
o
回
归
Lasso回归
Lasso回归 是由1996年
R
o
b
e
r
t
??
T
i
b
s
h
i
r
a
n
i
Robert \; Tibshirani
RobertTibshirani 首次提出,全称
L
e
a
s
t
??
a
b
s
o
l
u
t
e
??
s
h
r
i
n
k
a
g
e
??
a
n
d
??
s
e
l
e
c
t
i
o
n
??
o
p
e
r
a
t
o
r
Least \; absolute \; shrinkage \; and \; selection \; operator
Leastabsoluteshrinkageandselectionoperator。
R
S
S
RSS
RSS 也称为
L
a
s
s
o
Lasso
Lasso 的优化目标
L
1
L1
L1 正则化将系数
w
w
w 的
L
1
L1
L1 范数作为惩罚项加到损失函数上,其中 $\lambda $ 即惩罚项前的系数,常数乘以
L
1
L1
L1 项。默认为1.0。
λ
=
0
\lambda = 0
λ=0相当于普通的最小二乘,由
L
i
n
e
a
r
R
e
g
r
e
s
s
i
o
n
LinearRegression
LinearRegression 对象求解。不建议在
L
a
s
s
o
Lasso
Lasso 对象中使用
λ
=
0
\lambda= 0
λ=0。
解析:
- L1正则化将回归系数β_j的L1范数作为惩罚项加到损失函数上,由于正则项非零,这就迫使那些弱的特征所对应的系数变成0。因此L1正则化往往会使学到的模型很稀疏(系数w经常为0),这个特性使得L1正则化成为一种很好的特征选择方法
- L1正则化像非正则化线性模型一样也是不稳定的,如果特征集合中具有相关联的特征,当数据发生细微变化时也有可能导致很大的模型差异。
- L1正则化能够生成稀疏的模型。
数据稀疏性:
- L1正则化本来是为了降低过拟合风险,但是L1正则化的执行结果通常容易获得稀疏数据,即L1方法选择后的数据拥有更多零分量,所以被当做特征选择的强大方法。
- 稀疏数据对后续建模的好处:数据集表示的矩阵中有很多列与当前任务无关,通过特征选择去除这些列,如果数据稀疏性比较突出,意味着去除了较多的无关列,模型训练过程实际上可以在较小的列上进行,降低学习任务的难度,计算和存储开销小。
4.2.2 实现
以Boston 房价预测为例
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_boston
from sklearn.linear_model import Lasso
ss = StandardScaler()
data = load_boston()
data = pd.concat(
[pd.DataFrame(data.data, columns=data.feature_names), pd.DataFrame(data.target, columns=['target'])], axis=1
)
data.head().round(2)
CRIM ZN INDUS CHAS NOX RM AGE DIS RAD TAX PTRATIO B LSTAT target
-0.42 0.28 -1.29 -0.27 -0.14 0.41 -0.12 0.14 -0.98 -0.67 -1.46 0.44 -1.08 24.0
-0.42 -0.49 -0.59 -0.27 -0.74 0.19 0.37 0.56 -0.87 -0.99 -0.30 0.44 -0.49 21.6
-0.42 -0.49 -0.59 -0.27 -0.74 1.28 -0.27 0.56 -0.87 -0.99 -0.30 0.40 -1.21 34.7
-0.42 -0.49 -1.31 -0.27 -0.84 1.02 -0.81 1.08 -0.75 -1.11 0.11 0.42 -1.36 33.4
-0.41 -0.49 -1.31 -0.27 -0.84 1.23 -0.51 1.08 -0.75 -1.11 0.11 0.44 -1.03 36.2
特征说明:
- CRIM:城镇人均犯罪率。
- ZN:住宅用地超过 25000 sq.ft的比例。
- INDUS:城镇非零售商用土地的比例。
- CHAS:查理斯河空变量(如果边界是河流,则为1;否则为0)。
- NOX:一氧化氮浓度。
- RM:住宅平均房间数。
- AGE:1940 年之前建成的自用房屋比例。
- DIS:到波士顿五个中心区域的加权距离。
- RAD:辐射性公路的接近指数。
- TAX:每 10000 美元的全值财产税率。
- PTRATIO:城镇师生比例。
- B:
1000
×
(
B
k
?
0.63
)
2
1000\times(Bk-0.63)^ 2
1000×(Bk?0.63)2,其中 Bk 指代城镇中黑人的比例。
- LSTAT:人口中地位低下者的比例。
- MEDV:自住房的平均房价,以千美元计。
导入
L
1
L1
L1 正则化模型进行训练:
lasso = Lasso(alpha=1)
lasso.fit(X, data.target)
for i in range( X.shape[1] ):
print (data.feature_names[i], format( lasso.coef_[i], '.3f'))
CRIM -0.000
ZN 0.000
INDUS -0.000
CHAS 0.000
NOX -0.000
RM 2.713
AGE -0.000
DIS -0.000
RAD -0.000
TAX -0.000
PTRATIO -1.344
B 0.181
LSTAT -3.543
可以看到非零特征有4个,可以保留这4个特征。如果希望增加保留的特征数,可以通过调整参数alpha的值,令alpha小于1的值进行调试。
4.3. 基于树的嵌入方法
(
T
r
e
e
?
b
a
s
e
d
??
F
e
a
t
u
r
e
??
S
e
l
e
c
t
i
o
n
)
(Tree-based \; Feature \; Selection)
(Tree?basedFeatureSelection)
4.3.1 概念
4.3.1.1 引入
- 基于树的预测模型能够用来计算特征的重要程度,因此能用来去除不相关的特征。
- 基于随机森林的模型选择方法。
- 随机森林具有准确率高、稳定性强、易于使用等优点,是目前最流行的机器学习算法之一。
- 随机森林提供的两种常用特征选择的方法:
- 平均不纯度减少(Mean Decrease Impurity)
- 平均精度下降 (Mean Decrease Accuracy)
基于随机森林的特征选择方法也属于树。在机器学习中,随机森林是一个包含多个决策树的分类器, 并且其输出的类别是由个别树输出的类别的众数而定。
平均不纯度减少:随机森林由多个决策树构成,决策树中的每一个节点都是关于某个特征的条件,为的是将数据集按照不同的响应变量一分为二。利用不纯度可以确定节点(最优条件),对于分类问题,通常采用基尼不纯度或者信息增益,对于回归问题,通常采用的是方差或者最小二乘拟合。当训练决策树的时候,可以计算出每个特征减少了多少树的不纯度。对于一个决策树森林来说,可以算出每个特征平均减少了多少不纯度,并把它平均减少的不纯度作为特征选择的值。于分类问题通常采用基尼不纯度或者信息增益。对于回归问题,通常采用方差或者最小二乘拟合。
平均精度下降:直接度量每个特征对模型精确率的影响。主要思路是打乱每个特征的特征值顺序,并且度量顺序变动对模型的精确率的影响。很明显,对于不重要的变量来说,打乱顺序对模型的精确率影响不会太大,但是对于重要的变量来说,打乱顺序就会降低模型的精确率。这个方法sklearn中没有直接提供。
4.3.1.2 基于随机森林特征选择
随机森林由多个决策树构成,决策树中的每一个节点都是关于某个特征的条件,目的是将数据集按照不同的响应变量一分为二。对于一个决策树森林来说,可以算出每个特征平均减少了多少不纯度,并把它平均减少的不纯度作为特征选择的值。
若特征之间存在关联,一旦某个特征被选择之后,其他特征的重要度就会急剧下降,而不纯度已经被选中的那个特征降下来,**其他特征就很难再降低那么多不纯度。**在理解数据时,容易错误地认为先被选中的特征是很重要的,而其余的特征是不重要的,但实际上这些特征对响应变量的作用可能非常接近。
随机森林由多个决策树构成,决策树中的每一个节点都是关于某个特征的条件,目的是将数据集按照不同的响应变量一分为二。利用不纯度可以确定节点(最优条件),对于分类问题,通常采用基尼不纯度或者信息增益,对于回归问题,通常采用的是方差或者最小二乘拟合。当训练决策树的时候,可以计算出每个特征减少了树的多少不纯度。对于一个决策树森林来说,可以算出每个特征平均减少了多少不纯度,并把它平均减少的不纯度作为特征选择的值。
随机森林 平均精确度减少
- 该方法是直接度量每个特征对模型精确率的影响。
- 主要思路是打乱每个特征的特征值顺序,并且度量顺序变动对模型的精确率的影响。因为对于不重要的变量,打乱其顺序对模型的精确率影响不会太大,对于重要的变量来说,打乱顺序就会降低模型的精确率。
- 在特征选择结果上,需要注意:
- 尽管在所有特征上进行了训练得到了模型,然后才得到了每个特征的重要性测试,这并不等于筛选掉某个或某几个重要特征后模型的性能就一定会下降很多,因为即便某个特征删掉之后,其关联特征一样可以发挥作用,让模型性能基本不变。
4.3.2 实现
同样使用 Boston 数据集
from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor(n_estimators=15, max_depth=6)
model = rf.fit(X, data.target)
for i in range(X.shape[1]):
print(data.feature_names[i], ' ', model.feature_importances_[i])
CRIM 0.040618011701091264
ZN 0.00040320905243035804
INDUS 0.005469589217440185
CHAS 0.0007206391545212441
NOX 0.016588507390000763
RM 0.41856995949011583
AGE 0.007006575421722392
DIS 0.06688366762871543
RAD 0.004151947338258672
TAX 0.010346281063036198
PTRATIO 0.015510611056865957
B 0.012616715253617183
LSTAT 0.40111428623218465
五、其他方法
在此不做过多讲解,有兴趣可以自行了解,包括但不限于以下:
六、特征扩增
6.1 概念
特征选择一方面的目的是选择特征子集,另一方面,除了减少特征,有时还需要通过构造方法来增加特征,尝试找到与目标特征更好的关联模式。
- 扩增特征通常是在对原始特征与建模之间做了尝试之后,也就是明确需要选择的模型后进行尝试扩增特征达到更好的模型效果;
- 最简单的特征扩增方法:将特征的一些进行线性叠加或者非线性叠加得到一个新的特征,可以有效的提高分类效果。
6.2 常用的特征扩增的方法:
- 对原始部分特征进行线性变换处理:特征相加、减;
- 对原始部分特征进行非线性变换处理,如:
- 对原始特征进行多项式映射扩增;
- 对原始特征进行:乘、除;
- 其他非线性函数变换:对数函数,如将特征
x
x
x 变换:
x
→
l
o
g
?
(
x
)
x→log?(x)
x→log?(x),指数函数变换
x
→
a
x
x→a^x
x→ax 等
特征扩增的思路通常来自对业务和模式的进一步理解,很多时候盲目的扩增不一定会获得更好的模型效果,或者扩增后的特征可解释性比较一般。
实际工程经验中,会通过特征扩增后再来选择特征:
- 如对用户id和用户特征组合来获得较大的特征集再来选择特征,这种做法在推荐系统和广告系统中比较常见,原因是用户数据比较稀疏,组合特征能够同时兼顾全局模型和个性化模型。
七、小结
7.1 业务场景化
- 在使用的时候要弄清楚自己的目标是什么,然后找到哪种方法适用于自己的任务。
- 当选择最优特征以提升模型性能的时候,可以采用交叉验证的方法来验证某种模型是否比其他方法要好。
- 当用特征选择的方法来理解数据的时候,要注意特征选择模型的稳定性。稳定性差的模型很容易导致错误的结论,通常可以对数据进行二次采样,然后在子集上运行特征选择算法。如果在各个子集上的结果是一致的,那就可以说,在这个数据集上得出来的结论是可信的,可以确定用这种特征选择模型的结果。
7.2 对比
- 过滤法由于和特定的学习器无关,计算开销小,泛化能力强于后两种特征选择方法。因此,在实际应用中由于数据集很大,特征维度高,过滤式特征选择应用的更广泛些。但它是通过一些统计指标对特征进行排序来选择,通常不能发现冗余。
- 从模型性能的角度出发,包装法的性能要优于过滤法,但时间开销较大。
- 嵌入法中的
L
1
L1
L1 正则化方法对于特征理解和特征选择来说是非常强大的工具,它能够生成稀疏的模型,对于选择特征子集来说非常有用。
- 嵌入法中的随机森林方法是当前比较主流的方法之一,它易于使用,一般不需要其他特征工程操作、调参等繁琐的步骤,有直接的工具包都提供平均不纯度下降方法。
如对用户id和用户特征组合来获得较大的特征集再来选择特征,这种做法在推荐系统和广告系统中比较常见,原因是用户数据比较稀疏,组合特征能够同时兼顾全局模型和个性化模型。
|