赞
踩
数据集由数据对象(Data Objects)组成,一个数据的集合,通常以表格形式出现。
数据行对应数据对象,一个数据对象代表一个实体(Entity),数据对象又称为样本、实例、数据点、对象。
数据列对应属性(或者称为特征、字段、指标等)。
- 定类: 属性值仅仅是区分彼此的标志,没有序次关系。如颜色、性别等。
- 定序: 属性表示个体在某个有序状态中处的位置。如学历、等级等。
- 定距: 区间属性的值有序,可以评估值之间的差,不能评估倍数。如温度等。
- 定比: 值有序,可以评估值之间的差,也可以说一个值是另一个值的倍数。如重量、高度、长度等。
- 来源一: 业务已经整理好各种特征数据,即业务指标,有时称为属性,我们需要去找出适合我们问题需要的特征。该类特征通常是业务专家指出,通常是挖掘遇到的最初数据来源,是已有特征,也称原始特征。
- 来源二: 从业务特征中自己去寻找高级数据特征,如若干原始特征的组合后形成一个新特征,即特征衍生。
在特征选择范畴下,属性的概念等同于特征的概念。
- 特征选择(feature selection)也被称为变量选择、属性选择或属性子集选择。它是为了构建模型而选择相关特征子集的过程。
- 特征选择是指从原始特征中挑选出一组最有代表性、分类性能好的特征。
- 没有确定的步骤,更多是工程上的经验和权衡,一般需要耗费较多的时间和精力,掌握常用的经验和权衡方法,可以极大提高挖掘建模的效率和效果。
- 给定不同的挖掘任务,需要的特征组合可能不同。
现实中大数据挖掘任务,往往特征属性过多,而一个普遍存在的事实是,大数据集带来的关键信息只聚集在部分或少数特征上,因此需要:
当数据预处理完成后,需要选择有意义的特征进行模型训练。通常来说,从三个方面考虑:
特征选择方法有很多,主要包含特征减少和特征扩增。
单变量特征选择方法
基于模型的特征选择方法
其他方法
Filter是一种启发式方法,基本思想是:制定一个准则,用来衡量每个特征对目标属性的重要性,以此对所有特征/属性进行排序,或优选操作,特征选择的过程和后续的学习器无关(区别另外两个方法)。
以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
# 利用sklearn包进行方差选择
vt = VarianceThreshold(threshold=5)
xx = vt.fit_transform(X)
# 选择后原先13个维度降到了8维
xx.shape
(506, 8)
适用于特征类型均为数值特征的情况。
也称为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σBi=1∑n(ai−A)(bi−B)=nσAσBi=1∑n(aibi)−nAB=σAσBCov(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)
依旧以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 的相关性显著。
卡方检验,也叫 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∑cj=1∑reij(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)
查询卡方分布的临界值表:该表中记录着不同自由度下每个分布的概率。
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,得到男生喜欢小说的似然估计)
e
11
=
c
o
u
n
t
(
男
)
×
c
o
u
n
t
(
小
说
)
n
=
300
×
450
1500
=
90
x
2
=
(
250
−
90
)
2
90
+
(
50
−
210
)
2
210
+
(
200
−
360
)
2
360
+
(
1000
−
840
)
2
840
=
507.94
自 由 度 = ( 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,表明理论值完全符合。
可以总结:卡方值描述了自变量与因变量之间的相关程度:卡方值越大,相关程度也越大,所以很自然的可以利用卡方值来做特征选择,保留相关程度大的变量。
利用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)
可以看出第三个和第四个特征与目标值的相关性最强。
互信息表示两个变量是否有关系以及关系的强弱。
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) ,表示平均信息量。
互信息( M u t u a l I n f o r m a t i o n Mutual \; Information MutualInformation)是信息论里一种有用的信息度量,它可以看成是一个随机变量中包含的关于另一个随机变量的信息量,或者说是一个随机变量由于已知另一个随机变量而减少的不肯定性。
从信息熵的角度分析特征和输出值之间的关系评分。互信息值越大,说明该特征和输出值之间的相关性越大,越需要保留。
互信息方法使用缺陷:
sklearn
使用 mutual_info_classif
(分类)和 mutual_info_regression
(回归)来计算各个输入特征和输出值之间的互信息。依旧以鸢尾花分类为例
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)。
方差选择法:只适用于连续变量
皮尔逊相关系数:适用于特征类型均为数值特征的情况
卡方检验:只适用于连续变量
互信息法:它不属于度量方式,也没有办法归一化,在不同数据集上的结果无法做比较。对于连续变量通常需要先离散化,而互信息的结果对离散化的方式敏感。
F i l t e r Filter Filter方法总结起来就是利用不同的打分规则,如卡方检验、相关系数、互信息等规则对每个特征进行打分,即相当于给每个特征赋予一个权重,按照权重排序,对不达标的特征进行过滤。
对于理解数据、数据结构、数据分布而言,单变量特征选择是非常好的选择。该方法是通过对特征进行排序来优化模型,但缺点是它不能发现冗余:
按不同的特征属性类型,可将上述方法做如下划分:
SVM
,决策树,随机森林等等。基于模型的特征选择方法思想来源是:越是重要的特征在模型中对应的系数就会越大,而跟输出变量越是无关的特征对应的系数就会越接近于0。在噪音不多的数据上,或是数据量远大于特征数的数据集建模分析问题中:
- 当特征之间是独立的且均为数值型,可以运用线性回归模型。
- 假如特征和响应变量之间的关系是非线性的,可以用基于树的方法(决策树、随机森林)、或者扩展的线性模型等。
- 基于树的方法比较易于使用,因为他们对非线性关系的建模比较好,并且不需要太多的调试。需要注意过拟合问题,避免过拟合的常用方法有:限制树深度、使用交叉验证方法。
W r a p p e r Wrapper Wrapper,包装法,也形象地称为“弯刀法”,其解决思路没有过滤法直接,在确认算法模型后,把模型本身的性能作为评价准则:
常用包装法:
换句话说,包装法特征选择就是给后续学习器量身定做的子集
简称 R F E RFE RFE,使用一个基模型来进行多轮训练,每轮训练后,移除若干权值系数的特征,再基于新的特征集进行下一轮训练。
对特征含有权重的预测模型(例如,线性模型对应参数 c o e f f i c i e n t s coefficients coefficients), R F E RFE RFE通过递归减少考察的特征集规模来选择特征。预测模型在原始特征上训练,每个特征指定一个权重,随后那些拥有最小绝对值权重的特征会被踢出特征集。如此往复递归,直至剩余的特征数量达到所需的特征数量。
R F E RFE RFE的稳定性很大程度上取决于在迭代时底层所采用的模型。例如,假如RFE采用的普通的回归,没有经过正则化的回归是不稳定的,那么 R F E RFE RFE就是不稳定的;假如采用的是 R i d g e Ridge Ridge,而用 R i d g e Ridge Ridge正则化的回归是稳定的,那么 R F E RFE RFE就是稳定的。
Sklearn
提供了RFE
包(sklearn.feature_selection.RFE
),用于特征消除,还提供了RFECV
,可以通过交叉验证对特征进行排序后进行筛选。RFECV
类是RFE
的一个变体,它执行一个交叉验证来寻找最优的剩余特征数量,不需要指定保留多少个特征。
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 d e d Embedded Embedded,也称嵌入法,相比前两种方法要更加复杂,它利用机器学习算法和模型进行训练,得到各个特征的权值系数,根据权值系数从大到小来选择特征。
常用的嵌入法技术:
线性模型和正则化(Embedded方式)
线性模型和正则化(Embedded方式)中的基于线性回归模型方法,此处强调理解,可以更好帮助读者理解后续的L1正则化方法和直观的理解整个嵌入法的思想。
对于满足回归关系的数据分布,可以利用回归模型的系数来选择特征,就是利用了越是重要的特征,在模型中对应的系数就会越大,而跟输出变量越是无关的特征,对应的系数就会越接近于0这一特点。
正则化是一种回归的形式,它将系数估计(coefficient estimate)朝零的方向进行约束、调整或缩小。也就是说,正则化可以在学习过程中降低模型复杂度和不稳定程度,从而避免过拟合的危险。正则化(Regularization)包括 L 1 、 L 2 L1、L2 L1、L2正则化。在原始的代价函数后面加上一个 L 1 L1 L1正则化项,即所有权重 w w w的绝对值的和,再乘以 λ \lambda λ,参数 λ \lambda λ 起到了权衡的作用。这个概念的更广泛用法和介绍会在模型评估中详细说明,此处可以只记住该方法。
L
1
L1
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βjXij)+λ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。
解析:
数据稀疏性:
以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的值进行调试。
基于随机森林的特征选择方法也属于树。在机器学习中,随机森林是一个包含多个决策树的分类器, 并且其输出的类别是由个别树输出的类别的众数而定。
平均不纯度减少:随机森林由多个决策树构成,决策树中的每一个节点都是关于某个特征的条件,为的是将数据集按照不同的响应变量一分为二。利用不纯度可以确定节点(最优条件),对于分类问题,通常采用基尼不纯度或者信息增益,对于回归问题,通常采用的是方差或者最小二乘拟合。当训练决策树的时候,可以计算出每个特征减少了多少树的不纯度。对于一个决策树森林来说,可以算出每个特征平均减少了多少不纯度,并把它平均减少的不纯度作为特征选择的值。于分类问题通常采用基尼不纯度或者信息增益。对于回归问题,通常采用方差或者最小二乘拟合。
平均精度下降:直接度量每个特征对模型精确率的影响。主要思路是打乱每个特征的特征值顺序,并且度量顺序变动对模型的精确率的影响。很明显,对于不重要的变量来说,打乱顺序对模型的精确率影响不会太大,但是对于重要的变量来说,打乱顺序就会降低模型的精确率。这个方法sklearn中没有直接提供。
随机森林由多个决策树构成,决策树中的每一个节点都是关于某个特征的条件,目的是将数据集按照不同的响应变量一分为二。对于一个决策树森林来说,可以算出每个特征平均减少了多少不纯度,并把它平均减少的不纯度作为特征选择的值。
若特征之间存在关联,一旦某个特征被选择之后,其他特征的重要度就会急剧下降,而不纯度已经被选中的那个特征降下来,**其他特征就很难再降低那么多不纯度。**在理解数据时,容易错误地认为先被选中的特征是很重要的,而其余的特征是不重要的,但实际上这些特征对响应变量的作用可能非常接近。
随机森林由多个决策树构成,决策树中的每一个节点都是关于某个特征的条件,目的是将数据集按照不同的响应变量一分为二。利用不纯度可以确定节点(最优条件),对于分类问题,通常采用基尼不纯度或者信息增益,对于回归问题,通常采用的是方差或者最小二乘拟合。当训练决策树的时候,可以计算出每个特征减少了树的多少不纯度。对于一个决策树森林来说,可以算出每个特征平均减少了多少不纯度,并把它平均减少的不纯度作为特征选择的值。
随机森林 平均精确度减少
同样使用 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
在此不做过多讲解,有兴趣可以自行了解,包括但不限于以下:
通过深度学习来进行特征选择
随着深度学习的流行而成为一种手段,尤其是在计算机视觉领域,深度学习具有自动学习特征的能力,可以用来特征选择。
基于模型的特征选择方法结合交叉验证
特征选择一方面的目的是选择特征子集,另一方面,除了减少特征,有时还需要通过构造方法来增加特征,尝试找到与目标特征更好的关联模式。
特征扩增的思路通常来自对业务和模式的进一步理解,很多时候盲目的扩增不一定会获得更好的模型效果,或者扩增后的特征可解释性比较一般。
实际工程经验中,会通过特征扩增后再来选择特征:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。