微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在拟合我的估计器之前,如何使用 sklearn RFECV 选择要传递到降维步骤的最佳特征

如何解决在拟合我的估计器之前,如何使用 sklearn RFECV 选择要传递到降维步骤的最佳特征

在使用 KNN 拟合我的估计器之前,如何使用 sklearn RFECV 方法选择要传递给 LineardiscriminantAnalysis(n_components=2) 方法的最佳特征以进行降维。

pipeline = make_pipeline(normalizer(),LineardiscriminantAnalysis(n_components=2),KNeighborsClassifier(n_neighbors=10))

X = self.dataset
y = self.postures

min_features_to_select = 1  # Minimum number of features to consider
rfecv = RFECV(svc,step=1,cv=None,scoring='f1_weighted',min_features_to_select=min_features_to_select)

rfecv.fit(X,y)

print(rfecv.support_)
print(rfecv.ranking_)
print("Optimal number of features : %d" % rfecv.n_features_)

Plot number of features VS. cross-validation scores
plt.figure()
plt.xlabel("Number of features selected")
plt.ylabel("Cross validation score (nb of correct classifications)")
plt.plot(range(min_features_to_select,len(rfecv.grid_scores_) + min_features_to_select),rfecv.grid_scores_)
plt.show()

我从这段代码中得到以下错误。如果我在没有 LineardiscriminantAnalysis() 步骤的情况下运行此代码,则它可以工作,但这是我处理的重要部分。

*** ValueError: when `importance_getter=='auto'`,the underlying estimator Pipeline should have `coef_` or `feature_importances_` attribute. Either pass a fitted estimator to feature selector or call fit before calling transform.

解决方法

您的方法存在一个整体问题:KNeighborsClassifier 没有对特征重要性的内在度量。因此,它与 RFECV 不兼容,因为它的文档说明了分类器:

具有拟合方法的监督学习估计器,通过 coef_ 属性或通过 feature_importances_ 属性提供有关特征重要性的信息。

你肯定会失败 KNeighborsClassifier。您肯定需要另一个分类器,例如 RandomForestClassifierSVC

如果您可以选择另一个分类器,您的管道仍然需要在您的管道中公开估计器的特征重要性。为此,您可以在此处参考此 answer,它为此定义了一个自定义管道:

class Mypipeline(Pipeline):
    @property
    def coef_(self):
        return self._final_estimator.coef_
    @property
    def feature_importances_(self):
        return self._final_estimator.feature_importances_

像这样定义你的管道:

pipeline = MyPipeline([
    ('normalizer',Normalizer()),('ldm',LinearDiscriminantAnalysis(n_components=2)),('rf',RandomForestClassifier())
])

它应该可以工作。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。