Scikit-learn库支持递归功能消除(RFE)及其交叉验证版本(RFECV)。 RFECV对我来说非常有用,它选择了一些小的功能,但是我想知道RFE的交叉验证是如何完成的。

RFE是减少最不重要特征的方法。因此,我认为RFECV将按1来计算交叉验证分数消除功能。

但是,如果使用交叉验证,由于数据不同,我认为每一折都会选择最不重要的其他功能。
有人知道如何在RFECV中删除功能吗?

最佳答案

交叉验证是在要素数量上完成的。每次CV迭代都会更新每个已删除功能的分数。

然后,根据得分,选择要保留的多个特征n_features_to_select,并在仅保留n_features_to_select特征的完整数据集中使用RFE。

source

for n, (train, test) in enumerate(cv):
    X_train, y_train = _safe_split(self.estimator, X, y, train)
    X_test, y_test = _safe_split(self.estimator, X, y, test, train)

    rfe = RFE(estimator=self.estimator,
              n_features_to_select=n_features_to_select,
              step=self.step, estimator_params=self.estimator_params,
              verbose=self.verbose - 1)

    rfe._fit(X_train, y_train, lambda estimator, features:
             _score(estimator, X_test[:, features], y_test, scorer))
    scores.append(np.array(rfe.scores_[::-1]).reshape(1, -1))
scores = np.sum(np.concatenate(scores, 0), 0)
# The index in 'scores' when 'n_features' features are selected
n_feature_index = np.ceil((n_features - n_features_to_select) /
                          float(self.step))
n_features_to_select = max(n_features_to_select,
                           n_features - ((n_feature_index -
                                         np.argmax(scores)) *
                                         self.step))
# Re-execute an elimination with best_k over the whole set
rfe = RFE(estimator=self.estimator,
          n_features_to_select=n_features_to_select,
          step=self.step, estimator_params=self.estimator_params)
rfe.fit(X, y)

关于python - python scikit-learn中RFECV()的得分,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34703051/

10-12 18:02