如何在 GridSearchCV 中灵活集成特征选择与全特征保留策略

酷瑶姑娘_6644

酷瑶姑娘_6644

2026-09-02

246人浏览

原创

如何在 GridSearchCV 中灵活集成特征选择与全特征保留策略

本文介绍在 scikit-learn 管道中结合 SequentialFeatureSelector 与 passthrough 语义,通过比例型参数 n_features_to_select(如 1.0)统一建模“全特征使用”场景,使网格搜索能公平比较不同特征子集规模(含全部特征)的性能表现。

本文介绍在 scikit-learn 管道中结合 sequentialfeatureselector 与 `passthrough` 语义,通过比例型参数 `n_features_to_select`(如 `1.0`)统一建模“全特征使用”场景,使网格搜索能公平比较不同特征子集规模(含全部特征)的性能表现。

在构建机器学习管道时,常需评估特征选择对模型性能的实际增益。但标准的 SequentialFeatureSelector(SFS)默认不支持 n_features_to_select = n_features(即保留全部特征),直接指定整数 3 会触发 ValueError: n_features_to_select must be —— 这看似限制了“是否启用特征选择”的决策空间。

关键突破点在于:n_features_to_select 支持浮点数输入,表示所选特征占原始特征总数的比例。 因此,当预处理后特征维度为 n 时,设 n_features_to_select=1.0 即等价于“选择全部特征”,其行为在功能上与 'passthrough' 一致,且天然兼容 Pipeline 的参数网格结构,无需额外分支或自定义转换器。

以下是在原示例基础上优化后的完整实现:

import pandas as pd
import seaborn as sns
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LogisticRegression
from sklearn.feature_selection import SequentialFeatureSelector
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer

# 数据准备(同原示例)
titanic = sns.load_dataset('titanic')
features = ['age', 'fare', 'sex']
X = titanic[features].copy()
y = titanic['survived']

# 构建预处理器(保持不变)
numeric_features = ['age', 'fare']
numeric_transformer = Pipeline([
    ('imputer', SimpleImputer(strategy='constant')),
    ('scaler', StandardScaler())
])

categorical_features = ['sex']
categorical_transformer = Pipeline([
    ('imputer', SimpleImputer(strategy='constant')),
    ('onehot', OneHotEncoder(drop='first', sparse_output=False))
])

preprocessor = ColumnTransformer([
    ('num', numeric_transformer, numeric_features),
    ('cat', categorical_transformer, categorical_features)
], remainder='passthrough')

# 初始化分类器与 SFS(注意:SFS 需基于可拟合的 estimator)
clf = LogisticRegression(max_iter=1000, solver='liblinear')
sfs = SequentialFeatureSelector(clf, direction='forward', cv=3)

# 构建管道:预处理 → 特征选择 → 分类
pipeline = Pipeline([
    ('preprocessor', preprocessor),
    ('feature_selection', sfs),
    ('classifier', clf)
])

# ✅ 关键改进:使用比例参数,支持 [1/3, 2/3, 1.0]
# 假设预处理后特征数为 4(age、fare、sex_male),则:
#   1/3 ≈ 1 个特征,2/3 ≈ 2 个特征,1.0 = 全部 4 个特征
param_grid = {
    'feature_selection__n_features_to_select': [1/3, 2/3, 1.0],
    'classifier__C': [0.1, 1.0, 10.0]
}

grid_search = GridSearchCV(pipeline, param_grid, cv=5, scoring='accuracy', n_jobs=-1)
grid_search.fit(X, y)

# 查看详细结果(含各参数组合的均值/标准差得分)
results_df = pd.DataFrame(grid_search.cv_results_)
print("Grid search results (top 5 by mean test score):")
print(results_df[[
    'param_feature_selection__n_features_to_select',
    'param_classifier__C',
    'mean_test_score', 'std_test_score'
]].sort_values('mean_test_score', ascending=False).head())

注意事项与最佳实践

  • 预处理后特征数需明确n_features_to_select=1.0 是相对于 feature_selection 步骤输入特征数(即 preprocessor 输出维度)而言的。建议先用 preprocessor.fit_transform(X).shape[1] 验证实际维度,确保比例设置合理。
  • SFS 计算开销较大:前向/后向搜索的时间复杂度随特征数增长显著。若特征较多(>20),建议改用 SelectKBestRFECV,或限定 n_features_to_select 的最大比例(如 0.8)。
  • 避免重复验证 passthrough:无需再手动添加 ('feature_selection', 'passthrough') 到 pipeline 步骤中——n_features_to_select=1.0 已语义等价,且保证了参数空间的一致性与可比性。
  • 结果解读:若 1.0 对应的配置取得最优分数,说明当前任务中不进行特征削减更优;反之则表明降维带来泛化提升,此时可进一步分析被选中的特征组合。

综上,利用 n_features_to_select 的浮点语义,是 scikit-learn 生态中实现“特征选择 vs 全特征”统一网格搜索的最简洁、最规范、最可复现的方式。它既符合 sklearn 的设计哲学(参数驱动、组件解耦),又规避了自定义 PassthroughSelector 等冗余封装,是生产级特征工程流程中的推荐实践。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Python 机器学习入门与 Scikit-Learn 实战
Python 机器学习入门与 Scikit-Learn 实战

面向机器学习初学者,以 Scikit-Learn 为核心工具,讲解机器学习基本概念(监督学习/无监督学习/模型评估)、数据预处理(标准化/归一化/缺失值填充/特征编码)、常用分类算法(逻辑回归/决策树/随机森林/SVM/KNN)、回归算法(线性回归/岭回归/Lasso)、无监督聚类(K-Means/DBSCAN)、交叉验证与超参数调优(GridSearch/RandomSearch)、混淆矩阵与 ROC/AUC 模型评估指标,帮助开发者

2026.04.24

295

29

NumPy性能优化版本更新与常见报错排查
NumPy性能优化版本更新与常见报错排查

本专题整理 NumPy 性能优化、版本更新与常见报错排查相关教程,覆盖向量化计算、广播性能、内存布局、NumPy 2.0 升级、版本兼容冲突、安装导入报错、dtype 溢出、矩阵运算异常和 broadcasting 报错修复,帮助读者系统掌握 NumPy 性能调优与问题定位方法。

2026.09.22

0

25

Vibeknow在线使用入口合集
Vibeknow在线使用入口合集

本专题汇总了Vibeknow在线创作视频的官方入口及网页版使用教程,涵盖PPT、PDF、Word等文档一键转讲解视频的核心操作,并整理了免费版水印规则与手机端浏览器访问指南,助你快速将知识内容视频化。

2026.09.21

20

20

NumPy随机数文件读写与dtype数据类型
NumPy随机数文件读写与dtype数据类型

本专题整理 NumPy 随机数、文件读写与 dtype 数据类型相关教程,覆盖 Generator/random、随机数种子、正态分布采样、npy/npz/CSV/TXT 保存读取、loadtxt/savetxt、memmap、大文件处理、astype 类型转换、结构化 dtype、整数溢出和精度丢失等场景。

2026.09.21

20

24

NumPy矩阵运算与线性代数计算
NumPy矩阵运算与线性代数计算

本专题整理 NumPy 矩阵运算与线性代数计算相关教程,覆盖矩阵乘法、dot 与 @ 运算符、逆矩阵、行列式、特征值与特征向量、SVD、线性方程组、欧氏距离、矩阵分解和大规模矩阵性能优化等内容,帮助读者掌握 np.linalg 与矩阵计算实战。

2026.09.21

0

20

NumPy广播机制数学运算与统计分析
NumPy广播机制数学运算与统计分析

本专题整理 NumPy 广播机制、数组数学运算与统计分析相关教程,覆盖广播规则、维度对齐、矩阵与数组加减除法、向量化计算、均值方差、分位数、中位数、直方图和 unique 频次统计等场景,帮助读者掌握 ndarray 高效计算与统计处理方法。

2026.09.21

0

17

NumPy数组创建索引切片与数据选择
NumPy数组创建索引切片与数据选择

本专题整理 NumPy 数组创建、索引、切片与数据选择相关教程,覆盖 np.array、zeros/ones、多维数组形状、基础切片、花式索引、布尔索引、条件筛选、视图与副本等常用场景,帮助读者系统掌握 ndarray 数据构造与高效提取方法。

2026.09.21

0

12

Aionclaw智能助手介绍
Aionclaw智能助手介绍

本专题汇总了AionClaw(AI龙虾助手)的功能介绍与在线使用入口。AionClaw是杭州趣猿人工智能有限公司推出的桌面级AI智能体,能直接在电脑上读写文件、运行脚本、操作浏览器,自动交付Word、PPT、Excel等成品。

2026.09.20

40

13

AionClaw AI智能体与电脑自动化任务执行功能使用教程
AionClaw AI智能体与电脑自动化任务执行功能使用教程

AionClaw专题整理AI智能体与电脑自动化相关功能使用教程,涵盖安装部署、AI任务执行、Skills技能、文件处理、浏览器控制、电脑操作、持久记忆、聊天工具连接以及办公、编程和内容创作等功能,帮助用户快速掌握AionClaw的实际使用方法。

2026.09.20

20

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.1万人学习