在sklearn中对分类数据进行递归特征消除?

4

我有一个数据集,其中包含8个参数(4个连续的和4个分类的),我正在尝试使用Scikit中的RFEC类来消除特征。

这是我正在使用的公式:

svc = SVC(kernel="linear")
rfecv = RFECV(estimator=svc, step=1, cv=StratifiedKFold(y, 2),
          scoring='accuracy')
rfecv.fit(X, y)

由于我有分类数据,所以我使用dmatrics(Patsy)将其更改为虚拟变量。

在特征选择后,我想尝试不同的分类模型来改进模型,以及SVC。

在对数据进行转换后,我运行了RFE,但我认为我做错了。
我们是在转换分类数据之前还是之后运行RFECV?

我找不到任何文档中的明确指示。

1个回答

2

这取决于您想选择分类变量的给定值还是整个变量。目前,您正在选择分类变量的单个设置(也称为级别)。要选择整个变量,您可能需要进行一些hackery,基于 SVC 定义自己的估算器。您可以执行 make_pipeline(OneHotEncoder(categorical_features), SVC()) 但是您需要将管道的 coef_ 设置为反映输入形状的某些内容。


2
谢谢Andreas。实际上我还没有尝试过OneHotEncoder方法,一直在使用Dmatrices来转换分类数据。在转换分类数据后运行RFEC时,它可以正常工作(给出了最佳数量),但是当我尝试在转换分类数据之前运行时,会出现错误“无法将字符串转换为浮点数”。所以我很困惑是否可以在转换分类数据之前对分类数据运行递归特征选择。再次感谢。 - Hitesh
有人可能会认为这是在RFE中进行过于严格的输入验证。然而,由于我们目前并不真正支持管道上的特征选择,我不确定是否有充分的理由来改变这一点。 - Andreas Mueller
再次感谢。那么可以正确地假设只有在分类数据转换之后才能运行RFEC,无论是通过管道还是其他方法?现在这很有意义。 - Hitesh
不完全是这样。两种方法都可行,但作用不同。但是在scikit-learn中,在转换之前进行此操作并不会直接奏效。 - Andreas Mueller
感谢您的澄清,非常感谢。 - Hitesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接