【机器学习】Feature selection – Part I: univariate selection

Feature selection – Part I: univariate selection

特征选择——1:单变量选择

原文链接:http://blog.datadive.net/selecting-good-features-part-i-univariate-selection/


对于数据科学家或机器学习实践者来说,对特征选择/排序有良好的理解可能是一大财富。对这些方法的良好掌握导致更好地执行模型,更好地理解数据的底层结构和特征,并导致对许多机器学习模型底层算法的更直观。

一般来说,使用特征选择的原因有两个:

1.减少特征数量,减少过拟合,提高模型的泛化能力。

2.为了更好地理解特性及其与响应变量的关系。

这两个目标常常相互矛盾,因此需要不同的方法:根据手头的数据,对目标(1)有利的特征选择方法不一定对目标(2)有利,反之亦然。然而,似乎经常发生的是人们不加区别地使用他们最喜欢的方法(或者从他们选择的工具最方便访问的任何方法),特别是更适合于(1)实现(2)的方法。

同时,特征选择在机器学习或数据挖掘教材中没有特别全面地涵盖,部分原因是它们常常被视为学习算法的天然副作用,因此不需要单独描述。

在这篇博文中,我将尝试介绍一些更流行的特性选择方法,以及它们的优缺点和缺点,以及Python和scikit-learning中的代码示例。我还将在一个示例数据集上并排运行这些方法,这应该会突出它们之间的一些主要差异。在我的所有示例中,我主要讨论回归数据集,但是大多数讨论和示例同样适用于分类数据集和方法。

单变量特征选择

单变量特征选择分别检查每个特征,以确定特征与响应变量之间的关系的强度。这些方法易于运行和理解,并且通常特别有利于更好地理解数据(但不一定是为了更好地泛化而优化特征集)。单变量选择有许多不同的选项。

皮尔逊相关系数

理解特征与响应变量之间关系的最简单方法之一是皮尔逊相关系数,它测量两个变量之间的线性相关性。所得值在[-1;1]中,-1表示完全负相关(随着一个变量增加,另一个变量减少),+1表示完全正相关,0表示两个变量之间的非线性相关。

它快速且易于计算,并且通常是在数据上运行的第一件事。Scipy的pearsonr方法计算相关性和p值,粗略地显示了不相关系统产生这种大小的相关性值的概率。

import numpy as np
from scipy.stats import pearsonr
np.random.seed(0)
size = 300
x = np.random.normal(0, 1, size)
print("Lower noise", pearsonr(x, x + np.random.normal(0, 1, size)))
print("Higher noise", pearsonr(x, x + np.random.normal(0, 10, size)))

正如你从示例中看到的,我们将变量本身与它的带噪声版本进行比较。对于较小的噪声量,相关性相对较强,具有非常低的p值,而对于噪声比较高的,相关性就非常小,而且,p值很高,这意味着很可能纯粹偶然地在这种大小的数据集上观察到这种相关性。

Scikit-learning提供了f_regrssion方法,用于为一组特征批量计算p值(和底层F-值),因此它是一次对数据集运行相关测试的方便方法,例如将其包括在sklearn in的流水线中。

Pearson相关性作为特征排序机制的一个明显的缺点是它仅对线性关系敏感。如果关系是非线性的,那么即使两个变量之间存在1-1对应,Pearson相关也可以接近于零。

例如,当x以0为中心时,x和x^2之间的相关性为零。

x = np.random.uniform(-1, 1, 100000)
print(pearsonr(x, x**2)[0])

有关与上面类似的更多示例,请参阅以下示例绘图。

此外,正如Anscombe所说明的,仅仅依靠相关值来解释两个变量之间的关系可能具有很高的误导性,因此总是值得对数据进行绘图。

互信息和最大信息系数

另一个更稳健的相关性估计选项是互信息,定义为

I(X,Y)=\sum_{y\epsilon Y}\sum_{x\epsilon X}p(x,y)log(\frac{p(x,y)}{p(x)p(y)})

测量变量之间的相互依赖性,通常以比特为单位

但是,由于两个原因,直接用于特征排序可能不方便。首先,它不是度量,也不标准化(即不在固定范围内),所以MI值在两个数据集之间可以是不可比较的。其次,计算连续变量会带来不便:一般来说,变量需要通过装箱进行离散化,但是互信息得分对装箱选择非常敏感

最大信息系数是为了克服这些缺点而开发的一种技术。它搜索最优的装箱,并将互信息得分转换为位于范围[0;1]中的度量。在python中,MI在minepy库中可用

回顾y=x^2示例,MIC发现互信息是1,即最大。

from minepy import MINE
m = MINE()
x = np.random.uniform(-1, 1, 10000)
m.compute_score(x, x**2)
print(m.mic())

结果为1.0

关于MIC的统计能力,即当空假设为假时拒绝空假设的能力,一直存在一些批评。根据特定的数据集及其噪声,这可能是一个问题,也可能不是问题。

距离相关

另一种稳健的、相互竞争的相关估计方法是距离相关,它明确地设计用于解决皮尔逊相关的缺点。虽然对于Pearson相关,相关值0并不意味着独立性(如从x vs x^2示例中看到的),但是距离相关性0确实意味着两个变量之间没有相关性

距离相关性在R的energy包中可用(并且还有一个Python gist)。

当这种关系接近线性时,为什么偏爱皮尔逊相关而不是更复杂的方法,如MIC或距离相关,至少有两个原因。首先,计算Pearson相关性要快得多,这对于大型数据集可能很重要。其次,相关系数的范围是[-1;1](而不是MIC和距离相关的[0;1])。这可以传递关于关系是负还是正的有用的额外信息,即,更高的特征值是否意味着响应变量的更高值,反之亦然。但是,当然,只有当两个变量之间的关系是单调时,负相关和正相关的问题才成立。

基于模型的排序

最后,可以采用任意的机器学习方法,利用每个单独的特征建立响应变量的预测模型,并测量每个模型的性能。事实上,这已经用于皮尔逊相关系数,因为它等价于线性回归中用于预测的标准化回归系数。如果特征和响应变量之间的关系是非线性的,那么有许多替代方法,例如基于树的方法(决策树、随机森林)、具有基扩展的线性模型等。基于树的方法可能是最容易应用的方法之一,因为它们能够很好地建模非线性关系,并且不需要太多。调谐。避免过拟合是最主要的,因此树的深度应该相对较小,并且应该应用交叉验证。

这里是使用sklearning的随机森林回归器在波士顿房价数据集上的单变量选择,这个样本包括波士顿郊区的房价以及一些关键属性。

from sklearn.cross_validation import cross_val_score, ShuffleSplit
from sklearn.datasets import load_boston
from sklearn.ensemble import RandomForestRegressor
 
#Load boston housing dataset as an example
boston = load_boston()
X = boston["data"]
Y = boston["target"]
names = boston["feature_names"]
 
rf = RandomForestRegressor(n_estimators=20, max_depth=4)
scores = []
for i in range(X.shape[1]):
     score = cross_val_score(rf, X[:, i:i+1], Y, scoring="r2",
                              cv=ShuffleSplit(len(X), 3, .3))
     scores.append((round(np.mean(score), 3), names[i]))
print(sorted(scores, reverse=True))

[(0.68400000000000005, 'LSTAT'), (0.58499999999999996, 'RM'), (0.42599999999999999, 'NOX'), (0.40500000000000003, 'INDUS'), (0.311, 'PTRATIO'), (0.27400000000000002, 'TAX'), (0.21299999999999999, 'ZN'), (0.20999999999999999, 'CRIM'), (0.20599999999999999, 'RAD'), (0.096000000000000002, 'DIS'), (0.072999999999999995, 'B'), (0.023, 'CHAS'), (-0.017999999999999999, 'AGE')]

总结

一般来说,单变量的特征选择最好能更好地理解数据、其结构和特征。在某些设置中,它可以用于选择用于模型改进的顶部特征,但是由于它不能去除冗余(例如,在强相关特征的子集中仅选择最佳特征),所以最好将此任务留给其他方法。这就引出了下一个主题:选择好的特性。第二部分:线性模型和正则化

猜你喜欢

转载自blog.csdn.net/ARPOSPF/article/details/84985390