特征选择--过滤法
过滤法 (Filter Method):过滤法通过计算特征与目标变量之间的统计关系,独立于模型来选择特征,它通常使用简单的评估标准,如相关性或方差
过滤法:
-
方差阈值法:移除低方差特征
-
相关系数:计算特征与目标变量之间的相关性(如皮尔逊相关系数)
-
卡方检验:用于分类任务,评估特征与目标变量的独立性
-
互信息:测量特征与目标变量之间的信息共享程度
1、方差阈值法
方差阈值法(Variance Threshold)是一种简单而有效的特征选择技术,用于去除数据集中方差低于某个阈值的特征。其基本思想是:假设低方差特征对模型的贡献较小,因此可以在特征选择过程中将其排除。
假设我们有一个数据集,其中每一行代表一个样本,每一列代表一个特征。我们可以计算每个特征的方差,然后设定一个阈值,如果某个特征的方差低于这个阈值,则认为该特征不具有足够的区分度,可以被删除。
具体步骤如下:
- 计算每个特征的方差;
- 设定方差阈值;
- 如果特征方差小于设定阈值,则删除该特征。
优点:
- 简单易用:方差阈值法实现简单,计算开销小,适合快速筛选特征
- 无偏性:不依赖于目标变量,因此适用于无监督学习任务
- 高效性:能够迅速去除无用特征,减少后续模型训练的计算量
缺点:
- 忽略相关性:方差阈值法只考虑特征的方差,可能会排除与目标变量相关性较强但方差小的特征
- 阈值选择:阈值的选择可能会影响结果,选择不当可能导致重要特征被去除
示例: 将方差小于阈值 0.1 的特征过滤,保留方差大于阈值 0.1 的特征
import numpy as np
import pandas as pd
from sklearn.feature_selection import VarianceThreshold
# 创建示例数据
data = {'特征1': [1, 1, 1, 1, 1], # 方差为0
'特征2': [1, 2, 3, 4, 5], # 方差较大
'特征3': [3, 3, 3, 3, 3], # 方差为0
'特征4': [1, 0, 0, 0, 1], # 方差为0.2}
df = pd.DataFrame(data)
# 设置方差阈值
threshold = 0.1
# 创建方差选择器
selector = VarianceThreshold(threshold)
# 拟合数据并转换
selected_features = selector.fit_transform(df)
# 获取保留的特征索引
selected_indices = selector.get_support(indices=True)
# 打印结果
print("原始特征:", df.columns.tolist())
print("选择后的特征:", df.columns[selected_indices].tolist())
print("选择后的数据:\n", selected_features)
# ------输出------
# 原始特征:['特征1', '特征2', '特征3', '特征4']
# 选择后的特征:['特征2', '特征4']
# 选择后的数据:
# [[1 1]
# [2 0]
# [3 0]
# [4 0]
# [5 1]]
2、相关系数法
相关系数法是一种用于特征选择的统计方法,通过评估特征与目标变量之间的相关性来选择重要特征。该方法适用于回归和分类任务,特别是在特征数量较多的情况下,可以帮助识别与目标变量关系密切的特征。其中相关性可以用皮尔逊相关系数、斯皮尔曼等级相关系数、点二列相关系数,本文主要介绍用 皮尔逊相关系数 来计算相关系数
具体步骤如下:
- 计算相关系数:对于每个特征,根据以上皮尔逊相关系数公式计算其与目标变量的相关系数
- 设定阈值:根据相关系数的绝对值设定一个阈值,选择与目标变量相关性较强的特征
- 特征选择:保留相关系数绝对值大于阈值的特征,去除相关性较弱的特征
优点
- 直观性:相关系数提供了特征与目标变量之间关系的清晰度
- 快速计算:计算相关系数相对简单,适合快速评估特征
- 适用性广:可以用于不同类型的数据(连续、分类等)
缺点
- 线性关系限制:相关系数法主要捕捉线性关系,可能忽略非线性关系
- 敏感性:易受异常值影响,可能导致相关系数的失真
- 多重共线性:在特征之间存在高度相关性时,可能导致冗余特征的保留
示例:特征与目标变量的相关系数小于阈值,特征被过滤,反之,特征被保留
import pandas as pd
# 创建示例数据
data = {
'特征1': [1, 2, 3, 4, 5],
'特征2': [1, 2, 1, 1, 2],
'特征3': [2, 3, 4, 5, 6],
'目标变量': [1, 3, 2, 5, 4],}
df = pd.DataFrame(data)
# 计算相关系数矩阵
correlation_matrix = df.corr()print(correlation_matrix)
# 选择与目标变量相关性较强的特征
threshold = 0.5
strong_features = correlation_matrix['目标变量'][abs(correlation_matrix['目标变量']) > threshold]
# 打印结果
print("与目标变量相关性强的特征:")
print(strong_features)
# ------输出------
# 特征1 特征2 特征3 目标变量
# 特征1 1.000000 0.288675 1.000000 0.800000
# 特征2 0.288675 1.000000 0.288675 0.288675
# 特征3 1.000000 0.288675 1.000000 0.800000
# 目标变量 0.800000 0.288675 0.800000 1.000000
# 与目标变量相关性强的特征:
# 特征1 0.8
# 特征3 0.8
# 目标变量 1.0
# Name: 目标变量, dtype: float64
3、卡方检验法
卡方检验(Chi-square test)是一种统计检验方法,用于判断观测数据与理论数据之间是否存在显著差异。基于卡方分布,通过比较实际频数与理论频数的一致性来做出统计推断。在特征选择中,卡方检验常用于评估特征与类别标签之间的相关性。
具体步骤:
- 计算卡方统计量和自由度:根据公式计算卡方统计量,并根据公式(自由度 = (行数 - 1) × (列数 - 1))确定自由度。
- 查找临界值:根据显著性水平(如0.05)和自由度查找卡方分布表中的临界值。
- 做出决策:如果卡方统计量大于临界值,我们就有证据拒绝特征与目标变量独立的原假设,即特征与目标变量存在关联。根据卡方检验的结果,可以选取与目标变量关联性较强的特征。
优点
- 简单易用:卡方检验的计算过程较为简单,适合初学者
- 适用性广:适用于多种类型的分类数据分析
- 无分布假设:不要求数据符合特定的分布
缺点
- 样本量要求:对于小样本数据,卡方检验的结果可能不可靠,通常要求每个单元的期望频数至少为5
- 仅适用于分类变量:不适用于连续变量的分析
- 敏感性:对数据的稀疏性敏感,可能导致结果失真
示例:
import pandas as pd
import scipy.stats as stats
# 创建示例数据
data = {
'特征1': ['A', 'A', 'B', 'B', 'C', 'C', 'A', 'B', 'C', 'A'],
'目标变量': ['是', '否', '是', '否', '是', '否', '否', '是', '是', '否']}
df = pd.DataFrame(data)
# 构建列联表
contingency_table = pd.crosstab(df['特征1'], df['目标变量'])
# 进行卡方检验
chi2_stat, p_val, dof, expected = stats.chi2_contingency(contingency_table)
# 打印结果
print("卡方统计量:", chi2_stat)
print("p值:", p_val)
print("自由度:", dof)
print("期望频数:\n", expected)
# 判断结果
alpha = 0.05
if p_val < alpha:
print("拒绝零假设:特征1与目标变量之间存在显著关系。")
else:
print("不拒绝零假设:特征1与目标变量之间无显著关系。")
# ------输出------
# 卡方统计量: 1.666666666666667
# p值: 0.4345982085070782
# 自由度: 2
# 期望频数:
# [[2. 2. ]
# [1.5 1.5]
# [1.5 1.5]]
# 不拒绝零假设:特征1与目标变量之间无显著关系。
4、互信息法
互信息(Mutual Information, MI)是一种衡量两个随机变量之间相互依赖程度的信息论指标。在特征选择中,互信息用于评估特征与目标变量之间的相关性,而不仅仅是线性关系。
互信息的值越大,表示两个变量之间的依赖关系越强。在特征选择中,我们通常计算每个特征与目标变量的互信息,然后选择互信息较高的特征,因为这些特征更有可能对目标变量有预测能力。
优点
- 非线性关系:互信息可以捕捉非线性关系,而不仅仅是线性关系
- 适用性广:适用于处理分类和连续变量的组合
- 信息量度:提供了关于变量之间信息共享的量化指标
缺点
- 计算复杂性:对于高维数据,计算熵和联合熵可能比较复杂
- 样本量要求:在样本量较小的情况下,互信息的估计可能不稳定
示例:
import numpy as np
import pandas as pd
from sklearn.feature_selection import mutual_info_classif
# 创建示例数据
data = {
'特征1': [1, 2, 3, 4, 5, 6, 1, 2, 3, 4],
'特征2': [0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
'目标变量': [0, 0, 1, 1, 0, 1, 0, 1, 1, 0],}
df = pd.DataFrame(data)
# 提取特征和目标变量
X = df[['特征1', '特征2']]
y = df['目标变量']
# 计算互信息
mi = mutual_info_classif(X, y, discrete_features=True)
# 打印互信息结果
mi_df = pd.DataFrame(mi, index=X.columns, columns=['互信息'])
print(mi_df)
# ------输出------
# 互信息
# 特征1 0.415888
# 特征2 0.020136
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
2022-12-16 使用SELECT ... INTO OUTFILE导出mysql数据