【问题标题】:All intermediate steps should be transformers and implement fit and transform所有中间步骤都应该是转换器并实现拟合和转换
【发布时间】:2018-07-23 07:49:21
【问题描述】:

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

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。

我收到以下错误:

所有中间步骤都应该是变形金刚并实施适合和 变换,ExtraTreesClassifier ...

【问题讨论】:

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


    【解决方案1】:

    就像回溯说的那样:管道中的每个步骤都需要有一个 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/y_test 上传递 .score()

    大概是这样的:

    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)
    

    两个例子供进一步阅读:

    【讨论】:

    • 如果ExtraTreesClassifier 没有transform 方法,那么我可以用什么来代替它来为我的分类选择重要特征? @布拉德
    • 您已经在使用SelectFromModelsklearn.feature_selection 中的任何内容都可以使用。
    • SelectFromModel 在它的参数中使用了一个估计器对象。我可以把它作为论据吗?如果我没有像您建议的那样给出任何估算器,那么默认情况下它采用哪个估算器?此外,有什么方法可以让我了解所选的确切功能。
    • 是的——对不起,你是对的,用估算器更新了我的答案。至于功能,我相信你可以拨打model.named_steps['sel'].get_support()
    • 在这些选定的特征自动进入我的随机 Forrest 分类器之前,我有什么方法可以知道所选特征的名称和所选特征的数量。因为我想用神经网络代替 RF,而神经网络 keras 模型需要在训练之前知道它的特征数量。
    【解决方案2】:

    发生这种情况是因为您在管道中传递的第一个转换器必须同时具有 fit 和 transform 方法。

    m = ExtraTreesClassifier(n_estimators = 10)
    m.fit(train_cv_x,train_cv_y)
    

    这里 m 没有 transform 方法,因为 ExtraTreesClassifier 模型没有 transform 方法,因此在管道中失败。

    所以改变管道的顺序,为管道的第一步添加另一个转换器

    【讨论】:

      猜你喜欢
      • 2021-01-27
      • 2021-09-12
      • 1970-01-01
      • 2020-06-12
      • 2017-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多