所有中间步骤都应该是变换器并实现适合和转换

时间:2018-02-13 01:59:50

标签: 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。

我收到以下错误:

  

所有中间步骤都应该是变压器并实现适合   transform,ExtraTreesClassifier ......

1 个答案:

答案 0 :(得分:4)

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

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

事实上,看起来根据您尝试做的事情,您可以将此步骤抛弃。在内部,('sel', sel)已经进行了这种转换 - 这就是它包含在管道中的原因。

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

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

如果不仔细阅读你在这里尝试做的事情,那么这对你有用:

  1. 首先使用train_test_split拆分x和y。由此产生的测试数据集被保留用于最终测试,并且GridSearchCV交叉验证中的训练数据集将进一步分解为更小的训练集和验证集。
  2. 构建一个满足您的回溯试图告诉您的管道。
  3. 将该管道传递给GridSearchCV.fit()网格搜索X_train / y_train,然后将.score()传递给X_test / y_test。
  4. 粗略地说,这看起来像这样:

    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)
    

    进一步阅读的两个例子: