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 中的 KMeans 等任务进行聚类吗?