目前我正在构建一个具有严重不平衡数据的分类器。我使用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))
在模型是随机森林(RF)的管道中包含特征选择并不一定有意义。这是因为RF模型的
max_depth
和max_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
)。重要的是,您只需要使用训练数据来适应您的特性选择(因为您的测试数据在那个时间点应该是看不见的)。在所以你应该在你的代码之前运行它。在
没有“怎么做”就好像有一个具体的配方,这取决于你的目标。在
如果您想检查哪一组特性为您提供了最佳性能(根据您的指标,这里是} (递归特征消除)或它的交叉验证变量^{} 。在
recall
),您可以使用sklearn's
^{第一种方法是将你的模型与整套特性相匹配,衡量它们的重要性,并删减影响最小的那些特性。此操作将继续,直到剩余所需数量的功能。但它的计算量相当大。在
{cd5>每秒钟都会从所有可能的功能组合中删除一个。这一直持续到
min_features_to_select
被击中。它的计算量非常大,远远超过第一个。在由于此操作不适合与超参数搜索结合使用,因此您应该在
GridSearchCV
之前或在找到合适的值之后使用一组固定的默认值。在第一种情况下,特性选择将不取决于您发现的hyperparams
,而对于第二种情况,影响可能相当大。两种方法都是正确的,但可能会产生不同的结果和模型。在您可以在this StackOverflow answer中阅读有关
RFECV
和RFE
的更多信息。在相关问题 更多 >
编程相关推荐