python - 所有中间步骤都应该是变压器并实现拟合和变换

标签 python machine-learning scikit-learn feature-selection

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

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)

所以 X_new 是通过 SelectFromModelsel.transform 选择的新特征。然后我想使用所选的新功能训练我的 RF。

我收到以下错误:

All intermediate steps should be transformers and implement fit and transform, 
ExtraTreesClassifier ...

最佳答案

就像回溯所说:管道中的每个步骤都需要有一个 fit()transform() 方法(除了最后一个,它只需要 fit()。这是因为管道将每个步骤的数据转换链接在一起。

sel.transform(train_cv_x) 不是估算器,不符合此标准。

事实上,根据您要执行的操作,您可以省略此步骤。在内部,('sel', sel) 已经进行了这种转换——这就是它包含在管道中的原因。

其次,ExtraTreesClassifier(管道中的第一步)也没有 transform() 方法。您可以验证 here ,在类文档字符串中。监督学习模型不是为转换数据而设计的;它们是为适应它而设计的,并以此为基础进行预测。

什么类型的类能够进行转换?

无需过多了解您在这里尝试做什么,这对您有用:

  1. 首先使用 train_test_split 拆分 x 和 y。由此产生的测试数据集用于最终测试,GridSearchCV 交叉验证中的训练数据集将进一步分解为更小的训练集和验证集。
  2. 构建满足回溯试图告诉您的内容的管道。
  3. 将该管道传递给 GridSearchCV.fit() 在 X_train/y_train 上进行网格搜索,然后在 X_test 上进行 .score()/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)

进一步阅读的两个例子:

关于python - 所有中间步骤都应该是变压器并实现拟合和变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48758383/

相关文章:

r - 如何修复 R : [. data.frame(newdata, , object$method$center, drop = FALSE) 中的此错误:选择了未定义的列

scikit-learn - sklearn : LogisticRegression - predict_proba(X) - calculation

python - 如何在 Mac OS X 10.6 (Snow Leopard) 上安装 EasyGUI?

python - 使用 Selenium for Python 从 <table> 中迭代读取特定元素

python - 使用 reindex 平衡 DataFrame

python - 训练集和测试集的随机森林回归精度不同

machine-learning - L1-正则化 : Where to use penalized cost function?

python - Mongodb FindAndModify 多进程使用问题

python - 用于降维的 Scikit-learn 主成分分析 (PCA)

使用 GaussianNB 分类器进行交叉验证的 Python 朴素贝叶斯