什么时候使用交叉验证和网格搜索在imblearn管道中进行特征选择

2024-09-27 07:27:28 发布

您现在位置:Python中文网/ 问答频道 /正文

目前我正在构建一个具有严重不平衡数据的分类器。我使用imblearn管道首先对scaling、SMOTE进行标准化,然后使用gridSearchCV进行分类。这样可以确保在交叉验证期间进行上采样。现在我想把feature_选择包含到我的管道中。我应该如何将此步骤包括在管道中?在

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))

Tags: 数据testmodel管道param分类器traingrid
3条回答

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

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


{cds>搜索树不会浪费更多的时间。更多的树意味着更多的计算开销,在一定数量的树之后,改进太小了,所以您可能需要担心这个问题,但否则您将从大量n_估计器中获得性能,并且您也不会真正陷入过度拟合的麻烦。在

你是说功能选择表sklearn?https://scikit-learn.org/stable/modules/feature_selection.html

你可以在开始的时候运行它。您将基本上调整X的列(X_train,和X_test accordingly)。重要的是,您只需要使用训练数据来适应您的特性选择(因为您的测试数据在那个时间点应该是看不见的)。在

How should I include this step into the pipeline?

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

没有“怎么做”就好像有一个具体的配方,这取决于你的目标。在

如果您想检查哪一组特性为您提供了最佳性能(根据您的指标,这里是recall),您可以使用sklearn's^{}(递归特征消除)或它的交叉验证变量^{}。在

第一种方法是将你的模型与整套特性相匹配,衡量它们的重要性,并删减影响最小的那些特性。此操作将继续,直到剩余所需数量的功能。但它的计算量相当大。在

{cd5>每秒钟都会从所有可能的功能组合中删除一个。这一直持续到min_features_to_select被击中。它的计算量非常大,远远超过第一个。在

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

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

相关问题 更多 >

    热门问题