【Python机器学习】自动化特征选择——单变量统计

添加更多特征会使所有的模型变得更加复杂,从而增大过拟合的可能性。

在添加新特征或处理一般的高位数据集时,最好将特征的数量减少到只包含最有用的那些特征,并删除其余特征,这样会得到泛化能力更好、更简单的模型。

对于如何判断每个特征的作用有多大,有三种基本策略:单变量统计基于模型的选择迭代选择。所有的这些方法都是监督方法,即它们需要目标来拟合模型。这也就是说,我们需要将数据划分为训练集和测试集,并只在训练集上拟合特征选择。

在单变量统计中,我们计算每个特征和目标值之间的关系是否存在统计显著性,然后选择具有最高置信度的特征。对于分类问题,这也被称为方差分析(ANOVA)。这些测试的一个关键性质就是他们是单变量的。即它们只单独考虑每个特征。因此如果一个特征只有在与另一个特征合并时才具有信息量,那么这个特征将被舍弃。单变量测试的计算速度通常很快,并且不需要构建模型。另一方面,他们完全独立于你可能想要在特征选择之后应用的模型。

想要在scikit-learn中使用单变量特征选择,你需要进行一项测试(对分类问题通常是f_classif,对回归问题通常是f_regression),然后基于测试中确定的p值来选择一种舍弃特征的方法。所有舍弃参数的方法都是用阈值来舍弃所有p值过大的特征,因为这意味着它们不可能与目标值相关。计算阈值的方法各有不同,最简单的事SelectKBest和SelectPercenttile,前者选择固定数量的k个特特征,后者选择固定百分比的特征。我们将分类的特征选择应用于cancer数据集,为了使任务难一点,我们将向数据中添加一些没有信息量的噪声特征。

我们期望特征选择能够识别没有信息量的特征并删除它们:

python 复制代码
from sklearn.datasets import load_breast_cancer
from sklearn.feature_selection import SelectKBest,SelectPercentile
from sklearn.model_selection import train_test_split
import numpy as np


cancer=load_breast_cancer()
rng=np.random.RandomState(42)
noise=rng.normal(size=(len(cancer.data),50))
#向数据中添加噪声
#前30个特征来自数据集,后50个是噪声
X_w_noise=np.hstack([cancer.data,noise])


X_train,X_test,y_train,y_test=train_test_split(X_w_noise,cancer.target,random_state=0,test_size=.5)

select=SelectPercentile(percentile=50)
select.fit(X_train,y_train)

X_train_selected=select.transform(X_train)

print('训练集形状:{}'.format(X_train.shape))
print('特征选择训练集形状:{}'.format(X_train_selected.shape))

可以发现,特征数量由80个减少为40个,我们可以用get_support方法来查看哪些特征被选中,它会返回所选特征的布尔遮罩(mask):

python 复制代码
mask=select.get_support()
print(mask)
plt.matshow(mask.reshape(1,-1),cmap='gray_r')
plt.xlabel('Sample index')
plt.show()

从可视化图中可以看到,大多数所选择的特征都是原始特征,并且大多数噪声特征都已被删除。但原始特征的还原并不完美。比较Logistic回归在所有特征上的性能和仅使用所选特征的性能:

python 复制代码
X_test_selected=select.transform(X_test)
lr=LogisticRegression()
lr.fit(X_train,y_train)
print('所有特征下的score:{:.3f}'.format(lr.score(X_test,y_test)))
lr.fit(X_train_selected,y_train)
print('所选特征下的score:{:.3f}'.format(lr.score(X_test_selected,y_test)))

这个例子下,删除噪声特征可以提高性能,即使丢失了某些原始特征。这是一个非常简单的示例,在真实数据上的结果要更加复杂。如果特征量太大以至于无法构建模型,或者怀疑许多特征完全没有信息量,那么单变量特征选择还是非常有用的。

相关推荐
沿着路走到底5 小时前
python 基础
开发语言·python
Juchecar6 小时前
LLM模型与ML算法之间的关系
人工智能
FIN66686 小时前
昂瑞微:深耕射频“芯”赛道以硬核实力冲刺科创板大门
前端·人工智能·科技·前端框架·信息与通信·智能
benben0446 小时前
京东agent之joyagent解读
人工智能
LONGZETECH6 小时前
【龙泽科技】汽车动力与驱动系统综合分析技术1+X仿真教学软件(1.1.3 -初级)
人工智能·科技·汽车·汽车仿真教学软件·汽车教学软件
烛阴6 小时前
武装你的Python“工具箱”:盘点10个你必须熟练掌握的核心方法
前端·python
lisw056 小时前
SolidWorks:现代工程设计与数字制造的核心平台
人工智能·机器学习·青少年编程·软件工程·制造
大刘讲IT6 小时前
AI 生产工艺参数优化:中小型制造企业用 “智能调参“ 提升产品合格率与生产效率
人工智能·制造
图欧学习资源库6 小时前
人工智能领域、图欧科技、IMYAI智能助手2025年9月更新月报
人工智能·科技
学Linux的语莫6 小时前
机器学习数据处理
java·算法·机器学习