最佳发现的PCA估计器用作RFECV中的估计器

时间:2018-07-19 00:54:18

标签: scikit-learn regression feature-extraction feature-selection

这有效(主要来自sklearn的演示示例):

activate application

这可行:

print(__doc__)


# Code source: Gaël Varoquaux
# Modified for documentation by Jaques Grobler
# License: BSD 3 clause


import numpy as np
import matplotlib.pyplot as plt

from sklearn import linear_model, decomposition, datasets
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV
from scipy.stats import uniform

lregress = LinearRegression()

pca = decomposition.PCA()
pipe = Pipeline(steps=[('pca', pca), ('regress', lregress)])


# Plot the PCA spectrum
pca.fit(data_num)

plt.figure(1, figsize=(16, 9))
plt.clf()
plt.axes([.2, .2, .7, .7])
plt.plot(pca.explained_variance_, linewidth=2)
plt.axis('tight')
plt.xlabel('n_components')
plt.ylabel('explained_variance_')

# Prediction
n_components = uniform.rvs(loc=1, scale=data_num.shape[1], size=50, 
random_state=42).astype(int)

# Parameters of pipelines can be set using ‘__’ separated parameter names:
estimator_pca = GridSearchCV(pipe,
                         dict(pca__n_components=n_components)
                        )
estimator_pca.fit(data_num, data_labels)

plt.axvline(estimator_pca.best_estimator_.named_steps['pca'].n_components,
            linestyle=':', label='n_components chosen ' + 
str(estimator_pca.best_estimator_.named_steps['pca'].n_components))
plt.legend(prop=dict(size=12))


plt.plot(np.cumsum(pca.explained_variance_ratio_), linewidth=1)

plt.show()

但是这给了我错误“ RuntimeError:分类器未在“ selector1 = selector1.fit”行上显示“ coef_”或“ feature_importances_”属性”

from sklearn.feature_selection import RFECV


estimator = LinearRegression()
selector = RFECV(estimator, step=1, cv=5, scoring='explained_variance')
selector = selector.fit(data_num_pd, data_labels)
print("Selected number of features : %d" % selector.n_features_)

plt.figure()
plt.xlabel("Number of features selected")
plt.ylabel("Cross validation score")
plt.plot(range(1, len(selector.grid_scores_) + 1), selector.grid_scores_)
plt.show()

如何将我发现最完善的PCA估计器用作RFECV中的估计器?

1 个答案:

答案 0 :(得分:1)

这是管道设计中的一个已知问题。请参阅the github page here

  

访问拟合的属性:

     

此外,元估计器使用一些拟合的属性;   AdaBoostClassifier假定其子估算器具有classes_属性   装配后,这意味着当前不能将Pipeline用作   AdaBoostClassifier的子估算器。

     

诸如AdaBoostClassifier之类的任何元估计器都需要   可配置他们如何访问此属性或元估算器   例如管道需要使子估算器具有一些合适的属性   可访问的。

其他属性如coef_feature_importances_也一样。它们是最后一个估算器的一部分,因此不会被管道公开。

现在,您可以尝试执行以下操作来尝试遵循此处的最后一段,并尝试绕过此段将其包含在管道中:

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

然后在代码中使用这个新的管道类,而不是原始的Pipeline

这在大多数情况下应该有效,但对您而言不起作用。您正在使用管道内部的PCA进行功能简化。但是要使用RFECV进行功能选择。我认为这不是一个很好的组合。

RFECV将继续减少要使用的功能部件的数量。但是从网格搜索中最佳选择的pca中的n_components将是固定的。然后,当特征数量小于n_components时,它将再次引发错误。在这种情况下,您将无能为力。

因此,我建议您考虑一下用例和代码。