【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)))

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

相关推荐
JavaEdge在掘金2 分钟前
启动nginx报错,80 failed (97: Address family not supported by protocol)
python
新智元2 分钟前
毛骨悚然!o3 精准破译照片位置,只靠几行 Python 代码?人类在 AI 面前已裸奔
人工智能·openai
纪元A梦9 分钟前
华为OD机试真题——绘图机器(2025A卷:100分)Java/python/JavaScript/C++/C/GO最佳实现
java·javascript·c++·python·华为od·go·华为od机试题
程序员小远21 分钟前
接口测试和单元测试详解
自动化测试·软件测试·python·测试工具·单元测试·测试用例·接口测试
Tech Synapse30 分钟前
电商商品推荐系统实战:基于TensorFlow Recommenders构建智能推荐引擎
人工智能·python·tensorflow
帅帅的Python30 分钟前
2015-2023 各省 GDP 数据,用QuickBI 进行数据可视化——堆叠图!
大数据·人工智能
聿小翼33 分钟前
selenium-wire 与 googletrans 的爱恨情仇
python
咖啡调调。36 分钟前
模板引擎语法-算术运算
python·django·sqlite
CodeCraft Studio36 分钟前
Excel处理控件Spire.XLS系列教程:Java设置Excel活动工作表或活动单元格
java·python·excel
Doker 多克37 分钟前
Python-Django系列—部件
开发语言·python