第五章:特征选择
第3节:过滤法
3.1 过滤法的概念
过滤法(Filter Method)是特征选择中一种常见且高效的方法。它通过特征的统计指标(如方差、相关系数、卡方检验、信息增益等)对每个特征进行评估和排序,然后选择排名靠前的特征。与包裹法和嵌入法不同,过滤法不依赖于模型训练,而是通过评估每个特征与目标变量之间的关系来选择特征。
过滤法的优势在于计算速度快,且通常不易过拟合,因此特别适合高维数据的预处理。
3.2 过滤法的常见方法
- 方差选择法(Variance Threshold):去除方差较小的特征,认为方差小的特征提供的信息量少。
- 卡方检验(Chi-Square Test):用于评估特征与目标变量之间的独立性,适用于分类问题。
- 皮尔逊相关系数(Pearson Correlation Coefficient):衡量特征与目标变量之间的线性关系,适用于连续值特征。
- Relief特征选择:基于近邻的距离来评估特征的相关性,适用于处理数据中潜在的非线性关系。
过滤法通常被用于初步特征筛选,在数据预处理阶段就可应用,从而避免了特征冗余和噪音对后续模型训练的影响。
3.3 实际应用案例
以下是三个基于过滤法进行特征选择的实际应用案例,涵盖不同的领域和算法,以展示其广泛的应用。
案例1:客户流失预测中的卡方检验
案例描述
在客户流失预测(Churn Prediction)中,企业需要通过用户的行为数据和属性来预测哪些用户可能会流失。特征选择在这个任务中尤为重要,因为不相关的特征可能会影响预测的准确性。卡方检验是一种常见的过滤法,用于评估每个特征与目标变量之间的独立性,尤其适合处理分类数据。
案例分析
- 目标:通过卡方检验筛选出与客户流失(Churn)最相关的特征。
- 数据:包含用户行为、账户类型、支付方式等特征的数据集。
- 方法:使用卡方检验评估每个特征与目标变量(流失与否)的关系,筛选出最相关的特征。
算法步骤
- 数据准备:加载并处理客户流失数据。
- 特征选择:使用卡方检验对特征与目标变量之间的独立性进行评估。
- 模型训练:根据筛选后的特征训练分类模型。
Python代码(卡方检验)
import pandas as pd
from sklearn.feature_selection import SelectKBest, chi2
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
# 模拟加载客户流失数据
# 假设数据集中包含以下特征:账户类型、支付方式、使用时长、客户满意度等
data = pd.DataFrame({
'account_type': ['basic', 'premium', 'basic', 'premium', 'basic'],
'payment_method': ['credit', 'debit', 'credit', 'debit', 'credit'],
'usage_duration': [5, 2, 8, 1, 3], # 使用时长(年)
'customer_satisfaction': [4, 5, 2, 3, 4], # 客户满意度
'churn': [1, 0, 1, 0, 1] # 目标变量:1表示流失,0表示未流失
})
# 特征和目标变量
X = data.drop('churn', axis=1)
y = data['churn']
# 将分类变量转换为数值型变量
X_encoded = pd.get_dummies(X)
# 使用卡方检验评估特征与目标变量的关系
chi2_selector = SelectKBest(chi2, k='all')
X_new = chi2_selector.fit_transform(X_encoded, y)
# 输出每个特征的卡方值和P值
chi2_scores = pd.DataFrame({
'Feature': X_encoded.columns,
'Chi2 Score': chi2_selector.scores_,
'P-value': chi2_selector.pvalues_
})
print(chi2_scores)
代码解析
- 数据准备:模拟了一个包含客户流失信息的数据集,并通过
pd.get_dummies()
将分类特征转换为数值型。 - 卡方检验:使用
SelectKBest
和chi2
函数来计算特征与目标变量之间的卡方值,并筛选出最具相关性的特征。 - 输出:打印每个特征的卡方值和P值,用于评估其重要性。
案例2:房价预测中的方差选择法
案例描述
房价预测是回归问题中的经典任务。在房价预测任务中,特征的选择尤为关键。方差选择法可以用于去除那些方差过低的特征,因为这些特征几乎没有提供有效的区分信息。通过方差选择法,我们可以减少噪音特征,提升回归模型的性能。
案例分析
- 目标:通过方差选择法筛选出对房价预测最具影响力的特征。
- 数据:包括房屋面积、卧室数量、建筑年代、所在区域等特征的数据集。
- 方法:使用方差选择法去除方差过低的特征,保留方差较大的特征。
算法步骤
- 数据准备:加载房价数据。
- 特征选择:使用方差选择法筛选特征。
- 模型训练:使用选择后的特征训练回归模型进行房价预测。
Python代码(方差选择法)
from sklearn.feature_selection import VarianceThreshold
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
# 加载California房价数据
data = fetch_california_housing()
X = data.data
y = data.target
# 使用方差选择法,去除方差小于0.1的特征
selector = VarianceThreshold(threshold=0.1)
X_selected = selector.fit_transform(X)
# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X_selected, y, test_size=0.2, random_state=42)
# 训练线性回归模型
model = LinearRegression()
model.fit(X_train, y_train)
# 预测并计算均方误差
y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error: {mse}")
代码解析
- 数据准备:使用
fetch_california_housing
加载加利福尼亚州房价数据集。 - 方差选择:使用
VarianceThreshold
选择方差大于0.1的特征,去除低方差特征。 - 模型训练与评估:使用线性回归模型对选定的特征进行训练,并计算均方误差(MSE)来评估模型性能。
案例3:基因表达数据中的Relief特征选择
案例描述
在生物信息学中,基因表达数据通常包含成千上万的特征,而很多特征之间的相关性较低,因此需要有效的特征选择方法。Relief特征选择算法通过评估特征与目标之间的相关性,特别适用于处理数据中的非线性关系。
案例分析
- 目标:通过Relief算法选择对基因表达预测最具影响力的特征。
- 数据:基因表达数据集,包含多个基因的表达值。
- 方法:使用Relief算法评估特征的重要性,并选择最具影响力的特征。
算法步骤
- 数据准备:加载基因表达数据。
- 特征选择:使用Relief算法选择特征。
- 模型训练:使用选择后的特征训练分类或回归模型。
Python代码(Relief特征选择)
from sklearn.datasets import make_classification
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from skrebate import ReliefF
# 生成模拟基因表达数据:1000个样本,100个特征
X, y = make_classification(n_samples=1000, n_features=100, n_informative=10, random_state=42)
# 使用ReliefF进行特征选择
relieff = ReliefF(n_features_to_select=10)
X_selected = relieff.fit_transform(X, y)
# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X_selected, y, test_size=0.2, random_state=42)
# 使用随机森林进行训练
clf = RandomForestClassifier()
clf.fit(X_train, y_train)
# 预测并评估模型
y_pred = clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy}")
代码解析
- 数据生成:通过
make_classification
生成一个包含100个特征的模拟数据集。 - ReliefF选择:使用
ReliefF
算法选择最具影响力的10个特征。 - 模型训练与评估:使用随机森林分类器进行训练,并通过准确率评估模型的表现。
3.4 总结
过滤法是一种快速且高效的特征选择方法,适用于高维数据集。通过方差、卡方检验、皮尔逊相关系数、Relief等方法,过滤法可以在不依赖模型训练的情况下快速筛选出最具相关性的特征。根据不同的任务和数据特性,选择合适的过滤法可以显著提高模型性能,减少计算复杂度,并提升模型的可解释性。
通过上述案例,我们展示了如何在实际问题中应用过滤法进行特征选择,包括金融领域的客户流失预测、回归问题中的房价预测以及生物信息学中的基因表达数据分析。不同的特征选择方法可以根据数据的性质和任务需求进行灵活选择,从而提升模型的预测能力和泛化能力。
【哈佛博后带小白玩转机器学习】 哔哩哔哩_bilibili
总课时超400+,时长75+小时