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

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

相关推荐
此生只爱蛋12 分钟前
【手撕排序2】快速排序
c语言·c++·算法·排序算法
用户6915811416542 分钟前
Ascend Extension for PyTorch的源码解析
人工智能
Chef_Chen42 分钟前
从0开始学习机器学习--Day13--神经网络如何处理复杂非线性函数
神经网络·学习·机器学习
咕咕吖43 分钟前
对称二叉树(力扣101)
算法·leetcode·职场和发展
Troc_wangpeng43 分钟前
R language 关于二维平面直角坐标系的制作
开发语言·机器学习
努力的家伙是不讨厌的1 小时前
解析json导出csv或者直接入库
开发语言·python·json
用户691581141651 小时前
Ascend C的编程模型
人工智能
-Nemophilist-1 小时前
机器学习与深度学习-1-线性回归从零开始实现
深度学习·机器学习·线性回归
云空1 小时前
《Python 与 SQLite:强大的数据库组合》
数据库·python·sqlite
九圣残炎1 小时前
【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目
java·算法·leetcode