有几种特征选择 /变量选择方法(例如,参见Guyon&Elisseeff,2003;Liu等,2010):
- 过滤器方法(例如,基于相关性,基于熵,基于随机森林重要性),
- 包装器方法(例如,前向搜索,爬山搜索)和
- 特征选择是模型学习的一部分的嵌入式方法。
机器学习工具(例如R,Python等)也实现了许多已发布的算法。
比较不同的特征选择算法并为给定问题/数据集选择最佳方法的合适方法是什么?另一个问题是,是否存在已知的衡量特征选择算法性能的指标?
有几种特征选择 /变量选择方法(例如,参见Guyon&Elisseeff,2003;Liu等,2010):
机器学习工具(例如R,Python等)也实现了许多已发布的算法。
比较不同的特征选择算法并为给定问题/数据集选择最佳方法的合适方法是什么?另一个问题是,是否存在已知的衡量特征选择算法性能的指标?
Answers:
这是一个难题,研究人员正在取得很大进展。
如果您正在寻找有监督的功能选择,我建议使用LASSO及其变体。在监督学习下,对算法的评估非常简单:选择测试数据时所采用的任何度量标准的性能。
LASSO的两个主要警告是:(1)所选功能将不会自动检测到交互,因此您必须先验设计所有功能(即,在通过模型运行它们之前),以及(2)LASSO将不会识别出非功能。 -线性关系(例如,二次关系)。
尝试克服这两个警告的一种方法是使用Gradient Boosted Machines,它会自动进行功能选择。值得注意的是,GBM的统计属性比LASSO的统计属性更加模糊。
如果您正在寻找无监督的特征选择,这些研究人员似乎使用了类似的正则化方法,但是在这种特殊情况下的评估变得不那么明显了。人们尝试了许多不同的方法,例如PCA / SVD或K-Means,它们最终将试图找到数据的线性近似。
在那种情况下,性能的典型度量是重建误差或群集的RMSE。
在软件方面,R和Python都具有GBM,LASSO,K-Means,SVD和PCA。R和Sklearn for Python中的GLMNET和XGBoost是相关的库。
您将必须运行一组人工测试,尝试使用不同的方法检测相关特征,同时事先知道输入变量的哪些子集会影响输出变量。
一个好的技巧是保留一组具有不同分布的随机输入变量,并确保您的特征选择算法确实将它们标记为不相关。
另一个技巧是确保在对行进行置换之后,将标记为相关的变量停止分类为相关。
以上所述适用于过滤器和包装器方法。
如果分开(一个接一个地)将变量对目标没有任何影响,但联合起来表现出很强的依赖性,则一定要处理这种情况。示例将是一个众所周知的XOR问题(请查看Python代码):
import numpy as np
import matplotlib.pyplot as plt
from sklearn.feature_selection import f_regression, mutual_info_regression,mutual_info_classif
x=np.random.randn(5000,3)
y=np.where(np.logical_xor(x[:,0]>0,x[:,1]>0),1,0)
plt.scatter(x[y==1,0],x[y==1,1],c='r',marker='x')
plt.scatter(x[y==0,0],x[y==0,1],c='b',marker='o')
plt.show()
print(mutual_info_classif(x, y))
输出:
[0. 0. 0.00429746]
因此,可能强大的(但单变量)过滤方法(计算出变量和输入变量之间的互信息)无法检测数据集中的任何关系。而我们可以肯定地知道它是100%的依存关系,并且知道X就能以100%的准确性预测Y。
好的主意是为特征选择方法创建一种基准,有人愿意参加吗?