Scikit-learn 中的特征选择遇到了混合变量类型的问题

Posted

技术标签:

【中文标题】Scikit-learn 中的特征选择遇到了混合变量类型的问题【英文标题】:Feature Selection in Scikit-learn Encounters Problems with Mixed Variable Types 【发布时间】:2020-11-09 01:52:20 【问题描述】:

我目前正在尝试为我拥有的数据集进行特征选择。大约有 50 个变量,其中 35 个是分类变量,每个变量要么是二元的,要么具有

我正在尝试在 scikit-learn 中使用带有交叉验证的递归特征消除 (RFECV)。因为混合了连续变量和分类变量,所以当我对分类变量进行单热编码时遇到了一些问题,我有两个问题:

    RFE 是否仍可使用 one-hot 编码,它是否准确? 如何在 one-hot 编码之前获取所选特征对应的列?例如,如果它告诉我保留第 20 列,我如何知道在预处理之前对应的列,以便我可以将其保留为原始输入变量。

我不打算包括预处理,但它所做的只是估算和一个热编码,不会丢弃任何列。

这是我拥有的两个 RFECV 对象:

clf = SVC(kernel="linear")
rfecv = RFECV(estimator=clf, step=1, cv=StratifiedKFold(10), scoring="balanced_accuracy")
rfecv.fit(x_train, y_train)


clf2 = ExtraTreesClassifier(random_state=RANDOM_SEED)
rfecv2 = RFECV(estimator=clf2, step=1, cv=StratifiedKFold(10), scoring="balanced_accuracy")
rfecv2.fit(x_train, y_train)

【问题讨论】:

【参考方案1】:

    一种热编码将您的分类特征变成离散的。它会很好地工作。你应该问问自己,RFE 是否适用于分类数据(答案:取决于估计器),但它适用于二元特征。最终,单热编码只是一组二进制特征。即使使用 one-hot 编码,准确度也应该没问题。

    不幸的是,没有“自动”的方法可以做到这一点。您必须以某种方式手动执行此操作。我能想到的最好的自动化方法是保存映射,然后使用它。例如保存一个字典:my_dict = "Food_Pizza" : "Food", "Food_Pasta" : "Food"。然后您只需调用orig_column = my_dict[new_column] 即可获得常规专栏。其他选项取决于您如何使用命名和单热编码。例如,如果您所有的 one-hot 编码都是“FeatureName_value”(就像在熊猫假人中一样),您可以只解析名称并获取“_”字符之前的所有内容。

【讨论】:

以上是关于Scikit-learn 中的特征选择遇到了混合变量类型的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用热门词创建特征向量(scikit-learn 中的特征选择)

机器学习scikit-learn中的特征选择小结

我可以使用任何特征选择方法来对 Scikit-learn 中的 KMeans 等任务进行聚类吗?

[机器学习与scikit-learn-46]:特征工程-特征选择(降维)-2-常见的特征降维的方法大全

回归数据的 Scikit-learn 特征选择

scikit-learn 中大量特征的特征选择