Scikit-learn 中文教程

第二部分:Scikit-learn 核心基础
第 3 章 Scikit-learn 核心设计与 API 体系
第 4 章 数据集模块与数据划分
第三部分:数据预处理与特征工程
第 5 章 数据预处理核心模块(sklearn.preprocessing)
第 6 章 特征工程:提取、选择与构建
第四部分:模型评估与验证
第 7 章 模型评估指标(按任务类型划分)
第 8 章 模型验证与超参数调优
第五部分:Scikit-learn 核心算法模块
第 9 章 有监督学习:分类算法
第 10 章 有监督学习:回归算法
第 11 章 无监督学习:聚类与密度算法
第 12 章 半监督学习与其他常用算法
第八部分:性能优化与问题解决
第 18 章 Scikit-learn 性能优化
第 19 章 Scikit-learn 常见问题与解决方案

6.2 特征选择(sklearn.feature_selection)

Scikit-learn特征选择教程:过滤法、包裹法与嵌入法详解

Scikit-learn 中文教程

本章节系统讲解Scikit-learn中的特征选择方法,涵盖基于统计指标的过滤法(如方差选择和卡方检验)、基于模型性能的包裹法(如RFE)、基于模型内置重要性的嵌入法(如树模型和L1正则化),并包括实操流程和效果验证指南,适合机器学习新手学习。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

特征选择(Feature Selection)

特征选择是机器学习中的一个关键步骤,它帮助我们从大量特征中挑选出最有用的部分,以减少模型复杂度、防止过拟合、提高预测准确性和计算效率。在本教程中,我们将介绍Scikit-learn库提供的三种主要特征选择方法:过滤法、包裹法和嵌入法,并指导您如何在实际项目中应用和验证这些方法。

为什么需要特征选择?

  • 减少过拟合:去除无关或冗余特征,让模型更泛化。
  • 提高性能:更快训练和预测,降低内存使用。
  • 增强可解释性:专注于重要特征,更容易理解模型行为。

过滤法(Filter Methods)

过滤法基于统计指标来选择特征,不依赖于任何机器学习模型。它快速且易于实现,但可能忽略特征间的相互作用。

1. 方差选择(VarianceThreshold)

移除方差低于阈值的特征,因为这些特征在数据中变化很小,对预测贡献有限。

from sklearn.feature_selection import VarianceThreshold
# 示例:移除方差小于0.1的特征
selector = VarianceThreshold(threshold=0.1)
X_new = selector.fit_transform(X)
print("原始特征数:", X.shape[1])
print("选择后特征数:", X_new.shape[1])

2. 相关系数(Correlation)

通过计算特征与目标变量的相关系数(如皮尔逊相关系数),选择相关性强的前k个特征。

import pandas as pd
from sklearn.datasets import load_iris
# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target
df = pd.DataFrame(X, columns=iris.feature_names)
df['target'] = y
# 计算相关系数
correlation = df.corr()['target'].abs().sort_values(ascending=False)
# 选择前2个特征
selected_features = correlation.index[:2]
print("相关性高的特征:", selected_features)

3. 卡方检验(Chi-Square Test)

适用于分类问题,评估每个特征与目标变量的独立性,选择卡方值高的特征。

from sklearn.feature_selection import SelectKBest, chi2
# 假设X是特征矩阵,y是分类标签
selector = SelectKBest(chi2, k=2)  # 选择前2个特征
X_new = selector.fit_transform(X, y)

4. F检验(F-Test)

用于回归问题,基于方差分析选择特征。

from sklearn.feature_selection import f_regression
selector = SelectKBest(f_regression, k=2)
X_new = selector.fit_transform(X, y)

包裹法(Wrapper Methods)

包裹法基于模型性能来评估特征子集,通常更准确但计算成本较高。它迭代地添加或删除特征,以优化模型得分。

递归特征消除(RFE)

从所有特征开始,递归地移除最不重要的特征(基于模型权重或重要性),直到达到指定特征数。

from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
# 使用逻辑回归作为基础模型
model = LogisticRegression()
rfe = RFE(model, n_features_to_select=2)  # 选择2个特征
X_new = rfe.fit_transform(X, y)
print("选择的特征索引:", rfe.support_)

递归特征消除交叉验证(RFECV)

在RFE基础上使用交叉验证自动选择最优特征数。

from sklearn.feature_selection import RFECV
from sklearn.model_selection import StratifiedKFold
rfecv = RFECV(estimator=model, cv=StratifiedKFold(5), scoring='accuracy')
rfecv.fit(X, y)
print("最优特征数:", rfecv.n_features_)
print("选择的特征:", rfecv.support_)

嵌入法(Embedded Methods)

嵌入法将特征选择过程融入模型训练中,利用模型内置的特征重要性指标。

基于树模型的特征重要性

例如,随机森林或梯度提升树可以提供特征重要性得分。

from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier()
rf.fit(X, y)
# 获取特征重要性
importances = rf.feature_importances_
# 排序并选择前k个特征
indices = np.argsort(importances)[::-1]
selected_indices = indices[:2]  # 假设选择前2个
X_new = X[:, selected_indices]

基于L1正则化(Lasso)

在回归或分类模型中,L1正则化可以迫使一些特征系数为零,从而实现特征选择。

from sklearn.linear_model import Lasso
lasso = Lasso(alpha=0.1)  # alpha控制正则化强度
lasso.fit(X, y)
# 系数非零的特征被选中
selected_features = np.where(lasso.coef_ != 0)[0]
print("选择的特征索引:", selected_features)

特征选择的实操流程

以下是一个简单的步骤指南,帮助您在实际项目中应用特征选择。

  1. 数据准备:加载数据集,进行基本的预处理(如处理缺失值、标准化)。
  2. 选择方法:根据问题类型(分类或回归)和计算资源,决定使用过滤法、包裹法还是嵌入法。
    • 过滤法适合快速初步筛选。
    • 包裹法适合精度要求高的场景。
    • 嵌入法适合与特定模型结合。
  3. 应用特征选择:使用Scikit-learn的相应类(如SelectKBestRFE或模型本身)来拟合和转换数据。
  4. 模型训练:在选择的特征上训练机器学习模型。

示例代码:

from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 假设我们使用过滤法(卡方检验)
selector = SelectKBest(chi2, k=2)
X_selected = selector.fit_transform(X, y)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_selected, y, test_size=0.3, random_state=42)
# 训练一个分类模型
model = RandomForestClassifier()
model.fit(X_train, y_train)
predictions = model.predict(X_test)
print("准确率:", accuracy_score(y_test, predictions))

效果验证

验证特征选择的效果是确保模型改进的关键。建议使用以下方法:

  • 交叉验证:在训练过程中使用交叉验证来评估不同特征子集的性能,避免过拟合。
  • 模型性能指标:比较特征选择前后的模型得分(如准确率、F1分数、均方误差)。
  • 可视化:绘制特征重要性图或学习曲线,直观理解特征贡献。

示例验证代码:

from sklearn.model_selection import cross_val_score
# 使用交叉验证评估特征选择效果
scores = cross_val_score(model, X_selected, y, cv=5, scoring='accuracy')
print("交叉验证平均准确率:", np.mean(scores))
# 对比原始特征的效果
original_scores = cross_val_score(model, X, y, cv=5, scoring='accuracy')
print("原始特征平均准确率:", np.mean(original_scores))

总结

特征选择是机器学习工作流中的重要环节。通过Scikit-learn提供的工具,您可以轻松实现过滤法、包裹法和嵌入法。作为新手,建议从过滤法开始,因为它简单快速;随着经验积累,可以尝试包裹法和嵌入法以获得更好性能。记住,始终验证特征选择的效果以确保模型优化。

在下一章节中,我们将深入探讨特征降维方法,如主成分分析(PCA)。

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包