我在使用递归特征消除(RFE)进行特征选择。它的工作原理是迭代地使用一个估计器(如SVM分类器),将其拟合到数据上,并移除权重(系数)最低的特征。
我能够将它拟合到数据上并进行特征选择。然而,之后我想从RFE中恢复每个特征的学习权重。
我使用以下代码来初始化一个分类器对象和一个RFE对象,并将它们拟合到数据上。
svc = SVC(C=1, kernel="linear")rfe = RFE(estimator=svc, n_features_to_select=300, step=0.1)rfe.fit(all_training, training_labels)
然后我尝试打印系数
print ('coefficients',svc.coef_)
并收到以下错误:
AttributeError: 'RFE' object has no attribute 'dual_coef_'
根据sklearn文档,分类器对象应该有这个属性:
coef_ : array, shape = [n_class-1, n_features]分配给特征的权重(原始问题中的系数)。这仅在使用线性核时可用。coef_ 是从dual_coef_ 和 support_vectors_ 派生的只读属性。
我使用的是线性核,所以这不是问题所在。
谁能解释为什么我无法恢复系数?有没有解决办法?
回答:
在发布2分钟后,我再次查看了RFE的文档,并意识到了一个部分解决方案。
RFE对象具有估计器对象作为属性。因此我可以调用
print ('coefficients',rfe.estimator_.coef_)
并获取选定特征的系数。(即这会返回前300个特征的系数,因为我之前设置了n_features_to_select=300)。
然而,我仍然无法获取未选中特征的系数。对于RFE的每次迭代,它都会训练分类器并为每个特征获取新的系数。理想情况下,我希望能够访问每次迭代中学习到的系数。
(所以如果我从3000个特征开始,并使用步长300个特征,第一轮迭代我想访问3000个系数,下一轮迭代我想访问剩余2700个特征的2700个系数,第三轮迭代我想访问2400个系数,依此类推。)