特征选择算法研究
A. CFS的特征选择算法
基于关联规则的特征选择算法(correlation-based feature selection),是一种经典的过滤器模式的特征选择方法。源自论文“correlation-based feature selection for discrete and numeric class machine learning”,启发地对单一特征 对应于每个分类的作用进行评价,从而得到最终的特征子集。特别地,特征必须是离散的随机变量,如果是数值型变量,需要首先执行指导的离散化方法来进行离散化特征。
B. 特征选择:11 种特征选择策略总结
太多的特征会增加模型的复杂性和过拟合,而太少的特征会导致模型的拟合不足。将模型优化为足够复杂以使其性能可推广,但又足够简单易于训练、维护和解释是特征选择的主要工作。
“特征选择”意味着可以保留一些特征并放弃其他一些特征。本文的目的是概述一些特征选择策略:
该演示的数据集在 MIT 许可下发布,来自 PyCaret——一个开源的低代码机器学习库。
数据集相当干净,但我做了一些预处理。 请注意,我使用此数据集来演示不同的特征选择策略如何工作,而不是构建最终模型,因此模型性能无关紧要。
首先加载数据集:
该数据集包含 202 行和 26 列——每行代表一个 汽车 实例,每列代表其特征和相应的价格。 这些列包括:
现在让我们深入研究特征选择的 11 种策略。
当然,最简单的策略是你的直觉。虽然是直觉,但有时很有用的,某些列在最终模型中不会以任何形式使用(例如“ID”、“FirstName”、“LastName”等列)。 如果您知道某个特定列将不会被使用,请随时将其删除。 在我们的数据中,没有一列有这样的问题所以,我在此步骤中不删除任何列。
缺失值在机器学习中是不可接受的,因此我们会采用不同的策略来清理缺失数据(例如插补)。 但是如果列中缺少大量数据,那么完全删除它是非常好的方法。
无论算法是回归(预测数字)还是分类(预测类别),特征都必须与目标相关。 如果一个特征没有表现出相关性,它就是一个主要的消除目标。 可以分别测试数值和分类特征的相关性。
数值变量
在此示例中, peak-rpm , compression-ratio, stroke, bore, height , symboling 等特征与价格几乎没有相关性,因此我们可以删除它们。
可以手动删除列,但我更喜欢使用相关阈值(在本例中为 0.2)以编程方式进行:
分类变量
可以使用箱线图查找目标和分类特征之间的相关性:
柴油车的中位价高于汽油车。 这意味着这个分类变量可以解释 汽车 价格,所以应放弃它。 可以像这样单独检查每个分类列。
检查一下我们的特征的差异:
这里的“bore”具有极低的方差,虽然这是删除的候选者。 在这个特殊的例子中,我不愿意删除它,因为它的值在2.54和3.94之间,因此方差很低:
df['bore'].describe()
当任何两个特征之间存在相关性时,就会出现多重共线性。 在机器学习中,期望每个特征都应该独立于其他特征,即它们之间没有共线性。 高马力车辆往往具有高发动机尺寸。 所以你可能想消除其中一个,让另一个决定目标变量——价格。
我们可以分别测试数字和分类特征的多重共线性:
数值变量
Heatmap 是检查和寻找相关特征的最简单方法。
大多数特征在某种程度上相互关联,但有些特征具有非常高的相关性,例如长度与轴距以及发动机尺寸与马力。
可以根据相关阈值手动或以编程方式删除这些功能。 我将手动删除具有 0.80 共线性阈值的特征。
还可以使用称为方差膨胀因子 (VIF) 的方法来确定多重共线性并根据高 VIF 值删除特征。 我稍后会展示这个例子。
分类变量
与数值特征类似,也可以检查分类变量之间的共线性。 诸如独立性卡方检验之类的统计检验非常适合它。
让我们检查一下数据集中的两个分类列——燃料类型和车身风格——是独立的还是相关的。
然后我们将在每一列中创建一个类别的交叉表/列联表。
最后,我们将在交叉表上运行卡方检验,这将告诉我们这两个特征是否独立。
输出依次是卡方值、p 值、自由度和预期频率数组。
p 值