使用 one-hot-encoded 分类数据进行特征选择

数据挖掘 机器学习 Python 特征选择 分类数据
2021-10-15 04:47:00

我有一个包含 400 多列的数据集。其中几乎 90% 是使用 One-Hot-Encoding (OHE) 的分类数据。我正在使用数据集来解决分类问题。

我的教授要求我使用顺序前向选择 (mlxtend) 执行特征选择。

这样做真的有意义吗,因为它也非常耗时?删除分类数据是否合乎逻辑?如果是这样,k_features我应该使用的 sfs 编号是多少?或者方法(sfs)甚至适合这个吗?

2个回答

如果我没记错的话,顺序前向选择似乎是一种贪婪的搜索算法?看来您最初适合所有可能的单变量模型,然后选择性能最高的单变量模型。然后,您尝试通过拟合所有可能的两个变量模型,将第二个变量添加到上一步中性能最高的一个变量模型。你选择表现最好的二变量模型,如果它优于最好的一变量模型,你就转移到二变量模型。该过程继续,尝试所有三个变量模型,然后是四个(如果最好的三个变量模型优于最好的两个)......直到您选择最好的 k 个特征或模型停止改进。

最好的 k 似乎很随意,如果有办法让算法继续运行直到没有改进,那么这就是我会做的。但是,以下是我对这种方法的一些初步印象:

我想这个问题是你很有可能找不到最佳模型(本地解决方案)。候选变量可能与尚未包含在未来步骤中的其他变量一起工作得特别好,或者如果算法提前终止,您甚至可能没有机会使用潜在有用的预测变量。

然而,在我看来,这种方法的最大问题是它的成本是多少。您声明您有 400 多列。假设您有 415 个变量。然后,在第一遍中,您必须拟合 415 个模型,然后在第二遍中,414 等等……这甚至不包括可能的超参数调整和交叉验证。这是大量的模型,老实说,这通常是基于包装器的特征选择方法的问题。他们中的大多数最终会拟合大量模型,以获得模型性能的潜在边际收益(如果有的话)。当您有需要调整的超参数时,问题会变得更糟,因此我发现性能增益和使用这些方法所花费的计算时间之间的权衡是不值得的,除非您想要绝对最佳的模型。

就您而言,彼得在评论中的建议是我会采取的路线,纯粹是因为它更快且通常足够好。几乎每一种现代 ML 方法都以某种方式提供正则化,可以为您明确地选择特征,也就是嵌入式特征选择(根本不使用无用的预测器)或通过强烈限制它们的影响。收缩。Peter 提到的 Ridge/LASSO/Elastic Net 是一个很棒的建议。考虑到数据集的维度,其他方法(例如基于树的方法)也具有嵌入的特征选择,并且在您的情况下可能效果很好。

缺少重要的一点:SFS 是合适的,因为它不假设特征是分类的或数字的。但是,当您计划使用 SFS 时,one-hot 编码是多余的。您只需通过 one-hot 编码使过程更长,因为这样做 SFS 需要检查的功能数量比实际数量多。