6.2 特征选择(sklearn.feature_selection)
Scikit-learn特征选择教程:过滤法、包裹法与嵌入法详解
本章节系统讲解Scikit-learn中的特征选择方法,涵盖基于统计指标的过滤法(如方差选择和卡方检验)、基于模型性能的包裹法(如RFE)、基于模型内置重要性的嵌入法(如树模型和L1正则化),并包括实操流程和效果验证指南,适合机器学习新手学习。
特征选择(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)
特征选择的实操流程
以下是一个简单的步骤指南,帮助您在实际项目中应用特征选择。
- 数据准备:加载数据集,进行基本的预处理(如处理缺失值、标准化)。
- 选择方法:根据问题类型(分类或回归)和计算资源,决定使用过滤法、包裹法还是嵌入法。
- 过滤法适合快速初步筛选。
- 包裹法适合精度要求高的场景。
- 嵌入法适合与特定模型结合。
- 应用特征选择:使用Scikit-learn的相应类(如
SelectKBest、RFE或模型本身)来拟合和转换数据。 - 模型训练:在选择的特征上训练机器学习模型。
示例代码:
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)。