我使用递归特征估计(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]
Weights assigned to the features (coefficients in the primal problem). This is only
available in the case of a linear kernel.
coef_ is a readonly property derived from dual_coef_ and support_vectors_.
我使用的是线性内核,所以这不是问题所在。
有人能解释为什么我无法恢复系数吗?有办法解决这个问题吗?
发布后2分钟,我再次查看了RFE的文档,并实现了部分解决方案。
RFE对象具有估计器对象作为属性。因此我可以呼叫
print ('coefficients',rfe.estimator_.coef_)
并获取选定的前几个特征的系数。(即,这返回了前300个特征的系数,因为我之前设置了n_features_to_select=300)。
然而,我仍然无法获得剩余未选择特征的系数。对于RFE的每次迭代,它训练分类器并为每个特征获得新的系数。理想情况下,我想访问在每次迭代中学习的系数。
(因此,如果我从3000个特征开始,并使用步长为300的特征,第一次迭代我想访问3000个系数,下一次迭代我想要2700个系数用于剩余的2700个特征,第三次迭代我希望访问2400个系数,等等)
from sklearn.linear_model import LogisticRegression
from sklearn.feature_selection import RFE
reg = LogisticRegression()
rfe = RFE(reg, no of features u want to select)
rfe.fit(X, Y)
print(rfe.support_)
你会知道哪些功能是重要的,这是一种更好的方式。