Python Scikit学习中的功能选择遇到混合变量类型的问题

Python Scikit学习中的功能选择遇到混合变量类型的问题,python,scikit-learn,data-science,feature-selection,Python,Scikit Learn,Data Science,Feature Selection,我目前正在尝试为我拥有的数据集进行特征选择。大约有50个变量,其中35个是分类变量,每个变量要么是二进制变量,要么有

我目前正在尝试为我拥有的数据集进行特征选择。大约有50个变量,其中35个是分类变量,每个变量要么是二进制变量,要么有<5个可能值。我试图在预处理之前获得15个输入变量

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

  • RFE是否仍然可以使用一个热编码,并且是否准确
  • 如何在热编码之前获取所选功能对应的列?例如,如果它告诉我保留第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)
    
  • 一个热编码将您的分类特征转化为离散特征。用它就行了。您应该问问自己,RFE是否可以处理分类数据(答案:取决于估计器),但它可以处理二进制特征。最终,一个热编码只是一组二进制特征。即使使用一个热编码,精度也应该很好

  • 不幸的是,没有“自动”的方法来做到这一点。您必须以某种方式手动执行此操作。我能想到的最好的自动化方法是保存映射,然后使用它。例如,保存一个dict:
    my_dict={“Food\u Pizza”:“Food”,“Food\u意大利面”:“Food”}
    。然后您只需调用
    orig\u column=my\u dict[new\u column]
    就可以得到常规列。其他选项取决于您如何命名功能和一个热编码。例如,如果所有一个热编码都是“FeatureName_value”(就像熊猫模型中的一样),那么您只需解析名称并在“u”字符之前获取所有内容