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

如何在scikit-learn中结合SelectFromModel与cross_validate使用?

解决特征选择与交叉验证结合的问题

你的代码当前存在一个关键问题:在整个数据集上提前完成特征选择后再做交叉验证,会导致数据泄露——测试集的信息被用到了特征选择的过程中,使得模型评估结果失真。正确的做法是把特征选择和模型训练封装成一个完整的流程,让每一轮交叉验证都在训练子集上独立完成特征选择,再用对应的测试子集评估。

修正后的代码实现

import numpy as np
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import RandomForestClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_validate
from sklearn.pipeline import Pipeline

# 拆分特征与目标变量
X = dataset.drop('target_column', axis=1)  # 替换'target_column'为实际目标列名
y = dataset['target_column']

# 构建Pipeline:先做特征选择,再训练决策树
pipeline = Pipeline([
    ('feature_selection', SelectFromModel(RandomForestClassifier(n_estimators=100, random_state=42))),
    ('classifier', DecisionTreeClassifier(criterion="entropy", min_samples_split=5, random_state=0))
])

# 交叉验证评估模型性能
cross_validation_results = cross_validate(
    estimator=pipeline,
    X=X,
    y=y,
    cv=5,
    scoring="accuracy",  # 若需要特异性,可替换为自定义的特异性评分函数
    return_train_score=True
)

# 输出交叉验证结果
print("交叉验证结果:", cross_validation_results)

# 可选:查看最终选中的特征数量(需先拟合整个Pipeline)
pipeline.fit(X, y)
selected_features_mask = pipeline.named_steps['feature_selection'].get_support()
num_selected_features = sum(selected_features_mask)
print(f"选中的特征数量:{num_selected_features}")

关键补充说明

  • Pipeline的核心作用:将特征选择和模型训练绑定成一个整体,确保每一轮交叉验证时,特征选择只在当前训练子集上拟合,完全隔绝测试集的信息,避免数据泄露。
  • 特异性评估的实现:sklearn默认scoring参数没有直接的"specificity"选项,若需要用特异性作为评估指标,需自定义评分函数,示例如下:
from sklearn.metrics import make_scorer, specificity_score

# 自定义特异性评分函数
specificity_scorer = make_scorer(specificity_score)

# 在cross_validate中替换scoring参数
cross_validation_results = cross_validate(
    estimator=pipeline,
    X=X,
    y=y,
    cv=5,
    scoring=specificity_scorer,
    return_train_score=True
)

内容的提问来源于stack exchange,提问作者Aman 007

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 11:37:09