通过特征选择确定重要属性

数据挖掘 r 特征选择 相关性
2021-09-22 02:15:01

我有两个类的标记数据集。让我们说生病和健康的病人。我的功能是患者数据以及诊断数据,例如验血结果。它是分类数据和连续数据。总共有几千个功能。

我想确定最能区分患病患者和健康患者的特征。

这并不是一个真正的异常检测问题,因为我的特征中的任何内容都没有直接表明这种疾病。这意味着对于我的任何特征,生病的患者都不会被异常值指示。例如,结果可能是 50 岁以上的患者患病的风险更高。但 50 岁以上通常并不少见。

显而易见的方法是使用专门的特征选择技术。例如卡方检验、决策树中的变量重要性或反向消除。

所有这些方法的问题在于,它们通常是在部署另一种学习算法之前的预处理步骤。另一方面,我不想使用另一种学习算法。整个任务是找出最重要的特征。

特征选择算法真的是最好的方法吗,还是有更好的方法?也许一些专门为我的问题设计的技术?

提前谢谢了!

3个回答

听起来很正统的特征重要性分析。简单的选择:

插入符号的特征图

它基本上为您创建了一个相关矩阵,以查看哪个似乎最分离。

稍微花哨的:

来自randomForest的 VarImpPlot

这使用随机森林 ML 技术直接告诉您哪些特征是最重要的。这听起来与您正在寻找的非常相似。

编辑: 这里是 VarImpPlot 的更详细的讨论。

您可以使用经典的“Pima Diabetes”数据集,该数据集由美国原住民女性测试为糖尿病阴性/阳性。

(在 R 中,MASS 包中有这个数据集的一些变体(有和没有缺失数据)。)

但是,“diabetes.arff”数据文件也作为样本数据集出现在 Weka 软件中,并且 Weka 内置了一些“属性选择”算法。

如果您了解 Weka,我建议您自己尝试一下。只需单击几下,您就可以了解很多关于您的数据集的信息(当然,没有得到明确的答案)。

我添加了一个截图来说明我的方法。

威卡截图

Weka 从小的“Weka GUI 选择器”窗口开始。我打开了 Weka Experimenter (1),然后出现了大窗口。

我已经导入了文件(在“预处理”选项卡 (2) 中)。我刚刚加载了它,没有应用任何预处理,因为数据集已经很干净了。

在 (3) 中,我选择了“选择属性”选项卡,并尝试了一些 Weka 的算法。数字 4,5,6 表示我必须单击的按钮。

(7) 显示我上次运行的——“GainRatioAttributeEval”方法,该方法是Weka结合“Ranker”方法对结果进行加权。

主面板 (8) 显示了该算法认为最重要的属性/特征,按重要性排序:

=== Attribute selection 10 fold cross-validation (stratified), seed: 1 ===

average merit      average rank  attribute
 0.104 +- 0.008     1.1 +- 0.3     2 plas   ---  Blood plasma
 0.092 +- 0.008     1.9 +- 0.3     6 mass   ---  Body mass
 0.067 +- 0.009     3.1 +- 0.3     8 age    ---  age
 0.052 +- 0.005     3.9 +- 0.3     1 preg   ---  
 0.04  +- 0.003     5   +- 0       5 insu   ---  
 0.02  +- 0.011     6.4 +- 0.66    7 pedi   --- 
 0.016 +- 0.011     7.1 +- 0.7     4 skin   --- 
 0.009 +- 0.009     7.5 +- 0.67    3 pres   --- 

# Column Positions in the original datatable:
%    1. Number of times pregnant
%    2. Plasma glucose concentration a 2 hours in an oral glucose tolerance test
%    3. Diastolic blood pressure (mm Hg)
%    4. Triceps skin fold thickness (mm)
%    5. 2-Hour serum insulin (mu U/ml)
%    6. Body mass index (weight in kg/(height in m)^2)
%    7. Diabetes pedigree function
%    8. Age (years)
%    9. Class variable (0 or 1)

所以这个属性选择算法认为前 3 个重要属性(按顺序)是#2、#6、#8。这些是 2. 血浆、6. 体重指数和 8. 年龄。对我来说听起来很合理。

请记住,这是一个理想化的例子。

您的数据集包含多少缺失数据?你没有告诉我们。我认为您的患者数据将非常稀疏,并且数据集将包含许多空单元格。我认为当缺失数据值很少时,许多属性选择算法效果最好。

是时候给出更一般的答案了。

根据您的目标和时间尺度,您的方法应该是务实的。您是否试图找到预测变量和响应之间的细微联系,您是否希望对“重要”变量有更多粗略的了解?您是否有时间和资源来准备数据并运行更复杂的算法/流程?

需要记住的是,通常有很多方法可以实现相同的目标。您可能会发现,对于您的特定数据和任务,简单(“传统”)测试的性能可能与更复杂的技术一样好。

也就是说,也许考虑以下内容 - 按复杂性递增的顺序:

  1. 用于分类预测变量的卡方/克莱默 V
  2. 连续预测变量的 ANOVA 检验
  3. 前向选择(GLM 技术)
  4. 决策树/袋装树/随机森林重要性。
  5. 增强树

或者,如果您正在寻找 R 包来帮助您选择功能,请查看caretFSelector.