You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Sklearn ImbPipeline特征选择失效:SMOTE未接收筛选后特征的问题

问题解决方法

你的核心问题是Pipeline结构错误导致SMOTE未使用筛选后的特征,同时存在数据泄露风险。以下是具体解决方案:

错误原因

你将GridSearchCV作为ImbPipeline的最后一步,导致流程执行逻辑出错:

  1. 先对全部训练数据执行预处理、特征选择、SMOTE采样
  2. 再在采样后的数据集上做交叉验证
    这不仅会造成数据泄露(SMOTE使用了整个训练集的信息),还可能因验证方式的误解让你误以为SMOTE未拿到筛选后的特征。

正确的Pipeline结构

将GridSearchCV包裹整个ImbPipeline,让交叉验证的每个fold内完整执行「预处理→特征选择→SMOTE→分类」的流程,确保SMOTE处理的是筛选后的Top5特征,同时避免数据泄露:

from imblearn.pipeline import Pipeline as ImbPipeline
from sklearn.model_selection import GridSearchCV
from sklearn.feature_selection import SelectKBest, f_classif
from imblearn.over_sampling import SMOTE
from sklearn.neighbors import KNeighborsClassifier

# 定义完整的内部Pipeline:包含所有预处理、特征选择、采样和分类步骤
inner_pipeline = ImbPipeline(steps=[
    ('preprocessor', preprocessor),
    ('feature_selection', SelectKBest(f_classif, k=5)),
    ('oversampling', SMOTE()),
    ('classifier', KNeighborsClassifier())
])

# 用GridSearchCV包裹内部Pipeline,指定分类器的参数网格
grid_search = GridSearchCV(
    estimator=inner_pipeline,
    param_grid={
        # 使用双下划线__指定Pipeline内部步骤的参数
        'classifier__n_neighbors': [3, 5, 7, 9],
        'classifier__weights': ['uniform', 'distance'],
        'classifier__p': [1, 2]
    },
    cv=5,
    scoring='accuracy'
)

# 训练模型
grid_search.fit(X, y)

验证方法

拟合完成后,你可以通过以下代码确认特征选择和SMOTE的执行结果:

# 获取特征选择步骤的选中索引
selected_indices = grid_search.best_estimator_.named_steps['feature_selection'].get_support(indices=True)
print("选中的特征索引:", selected_indices)

# 验证SMOTE处理后的特征数是否为5
# 取训练集的一部分数据经过Pipeline处理
test_X = X[:5]
processed_X = grid_search.best_estimator_.named_steps['preprocessor'].transform(test_X)
processed_X = grid_search.best_estimator_.named_steps['feature_selection'].transform(processed_X)
print("筛选后的特征数:", processed_X.shape[1])  # 应该输出5

内容的提问来源于stack exchange,提问作者Kaiwalya Patil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 11:41:00