所有中间步骤均应为变形器,并进行拟合和转换

Abd*_*han 3 python machine-learning feature-selection scikit-learn

我正在使用重要的特征选择来实现管道,然后使用相同的特征来训练我的随机森林分类器。以下是我的代码。

m = ExtraTreesClassifier(n_estimators = 10)
m.fit(train_cv_x,train_cv_y)
sel = SelectFromModel(m, prefit=True)
X_new = sel.transform(train_cv_x)
clf = RandomForestClassifier(5000)

model = Pipeline([('m', m),('sel', sel),('X_new', X_new),('clf', clf),])
params = {'clf__max_features': ['auto', 'sqrt', 'log2']}

gs = GridSearchCV(model, params)
gs.fit(train_cv_x,train_cv_y)
Run Code Online (Sandbox Code Playgroud)

因此,X_new可通过选择新的功能SelectFromModelsel.transform。然后,我想使用所选的新功能来训练我的RF。

我收到以下错误:

所有中间步骤都应该是转换器,并实现拟合和转换,ExtraTreesClassifier ...

Bra*_*mon 6

就像回溯说的那样:流水线中的每个步骤都需要有fit()and transform()方法(最后一个除外,后者只是需要fit()。),因为流水线在每一步将数据的转换链接在一起。

sel.transform(train_cv_x) 不是估算器,也不满足此条件。

实际上,根据您要执行的操作,您可以忽略此步骤。在内部,('sel', sel)已经进行了此转换-这就是为什么将其包含在管道中的原因。

其次,ExtraTreesClassifier(管道的第一步)也没有transform()方法。您可以在docstring类中在此处进行验证。并非为转换数据而建立了监督学习模型。他们是为适应它而做出的,并以此为基础进行预测。

哪些类型的类可以进行转换?

  • 那些可以扩展您的数据的人。请参阅预处理和规范化
  • 可以转换您的数据的方式(除了上述方式以外的其他方式)。 分解和其他无监督的学习方法可以做到这一点。

无需过多地了解您要在此处进行的操作,这将为您工作:

  1. 首先使用分割x和y train_test_split。由此产生的测试数据集将保留以进行最终测试,并且GridSearchCV交叉验证中的火车数据集将进一步细分为更小的火车和验证集。
  2. 建立一个满足您的回溯尝试告诉您的内容的管道。
  3. 将该管道传递至GridSearchCV.fit()该网格在X_train / y_train上进行搜索,然后.score()在X_test / y_test上进行搜索。

大致来说,它看起来像这样:

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.33, random_state=444)

sel = SelectFromModel(ExtraTreesClassifier(n_estimators=10, random_state=444), 
                      threshold='mean')
clf = RandomForestClassifier(n_estimators=5000, random_state=444)

model = Pipeline([('sel', sel), ('clf', clf)])
params = {'clf__max_features': ['auto', 'sqrt', 'log2']}

gs = GridSearchCV(model, params)
gs.fit(X_train, y_train)

# How well do your hyperparameter optimizations generalize
# to unseen test data?
gs.score(X_test, y_test)
Run Code Online (Sandbox Code Playgroud)

有两个示例可供进一步阅读: