【问题标题】:When do feature selection in imblearn pipeline with cross-validation and grid search何时使用交叉验证和网格搜索在 imblearn 管道中进行特征选择
【发布时间】:2019-07-01 19:10:01
【问题描述】:

目前我正在构建一个数据严重不平衡的分类器。我使用 imblearn 管道首先到 StandardScaling、SMOTE,然后使用 gridSearchCV 进行分类。这确保了在交叉验证期间完成上采样。现在我想将 feature_selection 包含到我的管道中。我应该如何将此步骤包含到管道中?

model = Pipeline([
        ('sampling', SMOTE()),
        ('classification', RandomForestClassifier())
    ])

param_grid = { 
    'classification__n_estimators': [10, 20, 50],
    'classification__max_depth' : [2,3,5]
}

gridsearch_model = GridSearchCV(model, param_grid, cv = 4, scoring = make_scorer(recall_score))
gridsearch_model.fit(X_train, y_train)
predictions = gridsearch_model.predict(X_test)
print(classification_report(y_test, predictions))
print(confusion_matrix(y_test, predictions))

【问题讨论】:

    标签: python sampling feature-selection imblearn


    【解决方案1】:

    在模型是随机森林 (RF) 的管道中包含特征选择不一定有意义。这是因为 RF 模型的 max_depthmax_features 参数本质上控制了构建单个树时包含的特征数量(n 的最大深度只是表示您的森林中的每棵树都将为 @987654325 构建@ 节点,每个节点都有一个由 max_features 数量的特征组合组成的拆分)。检查https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html

    您可以简单地调查您的训练模型以获得排名靠前的功能。在训练单个树时,可以计算出每个特征减少了树中的加权杂质的程度。对于森林,可以平均每个特征的杂质减少,并根据此度量对特征进行排名。所以你实际上不需要为不同的特征集重新训练森林,因为特征重要性(已经在 sklearn 模型中计算)告诉你所有你需要的信息。


    附:我也不会浪费时间网格搜索n_estimators,因为更多的树会带来更好的准确性。更多的树意味着更多的计算成本,并且在一定数量的树之后,改进太小了,所以也许你必须担心这一点,但否则你会从大量的 n_estimator 中获得性能,而你并不是真正的过拟合的麻烦。

    【讨论】:

      【解决方案2】:

      您的意思是 sklearn 中的特征选择吗? https://scikit-learn.org/stable/modules/feature_selection.html

      您可以在开始时运行它。您将基本上调整您的 X 列(X_trainX_test accordingly)。重要的是你只用训练数据来拟合你的特征选择(因为你的测试数据在那个时间点应该是看不见的)。

      我应该如何将此步骤包含到管道中?

      所以你应该在你的代码之前运行它。

      【讨论】:

        【解决方案3】:

        没有“如何”,就好像有一个具体的食谱,这取决于你的目标。

        如果您想检查哪组功能可以提供最佳性能(根据您的指标,此处为recall),您可以使用sklearn'ssklearn.feature_selection.RFE(递归功能消除)或其交叉验证变体@987654322 @。

        第一个适合您的模型并具有整套功能,衡量它们的重要性并修剪影响最小的那些。此操作继续进行,直到剩下所需数量的特征。不过,它的计算量很大。

        第二个从所有特征开始,每次尝试所有可能的学习模型组合时都会删除step 特征。这种情况一直持续到min_features_to_select 被击中。 计算量非常大,比第一个要多

        由于此操作很难与超参数搜索结合使用,因此您应该在 GridSearchCV 之前或找到一些合适的值之后使用一组固定的默认值来执行此操作。在第一种情况下,功能选择将不取决于您找到的hyperparams,而对于第二种情况,影响可能相当大。两种方法都是正确的,但可能会产生不同的结果和模型。

        您可以在this StackOverflow answer 中阅读有关RFECVRFE 的更多信息。

        【讨论】:

          猜你喜欢
          • 2020-03-07
          • 2019-05-19
          • 2013-11-08
          • 2015-11-13
          • 2017-06-19
          • 2021-12-11
          • 1970-01-01
          • 1970-01-01
          • 2018-11-16
          相关资源
          最近更新 更多