最近在进行一个比赛的时候遇到特征处理的问题,于是就在sklearn官网查了一下,发现有专门的一节来讲关于特征选择的,因此翻译一下主要供自己学习使用,当然如果对你也有帮助,那更好。

sklearn.feature_selection

PS:翻译如果觉得有问题,请大佬帮忙纠正!谢谢。

----------------------------------------------我是一条无感情的分界线---------------------------------------
<mark>1.13. Feature selection</mark>

sklearn.feature_selection模块能在样本数据集上进行特征选择或降维,这既能改善评估器的准确得分,也能提升高维数据集的泛化性能。

  • <mark>1.13.1. 移除低方差的特征</mark>
    VarianceThreshold是特征选择的基本方法,它移除所有不满足方差阈值的特征。默认地会移除所有零方差地特征,比如在所有样本中有着相同值的特征。

举个例子,假设现在有个布尔特征的数据集,然后我们想要移除 样本里超过80%是1或0的所有特征。布尔特征就是伯努利随机变量,这些变量的方差是由下面这个公式得来:
V a r [ X ] = p ( 1 − p ) Var[X]= p(1-p) Var[X]=p(1p)
所以我们可以选择使用 <mark>.8 * (1 - .8)</mark> 的阈值:

>>> from sklearn.feature_selection import VarianceThreshold
>>> X = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]]
>>> sel = VarianceThreshold(threshold=(.8 * (1 - .8)))
>>> sel.fit_transform(X)
array([[0, 1],
       [1, 0],
       [0, 0],
       [1, 1],
       [1, 0],
       [1, 1]])

如上,<mark>VarianceThreshold</mark> 方法移除了第一列,因为它里面0的占比 p = 5 / 6 > . 8 p = 5 / 6 > .8 p=5/6>.8

  • <mark>1.13.2. 单变量特征选择</mark>
    单变量特征选择是基于单变量统计检验来选取最佳特征的方法。它可以看作是评估器的预处理步骤,Scikit-learn把特征选择例程作为实现transform方法的对象:
    • SelectKBest只保留最高K值得分的特征
    • SelectPercentile只保留用户指定的最高得分比特征
    • 每个特征使用通用的单变量统计检验方法:其中假正率用SelectFpr,误发现率用 SelectFdr,族系错误用 SelectFwe
    • GenericUnivariateSelect允许执行可配置策略的单变量特征选择。它会选取超参数搜索评估器的最佳单变量选择策略。

例如,我们可以在下面这个样本集中利用 χ 2 \chi^2 χ2检验来找到仅有的两个最佳特征:

>>> from sklearn.datasets import load_iris
>>> from sklearn.feature_selection import SelectKBest
>>> from sklearn.feature_selection import chi2
>>> X, y = load_iris(return_X_y=True)
>>> X.shape
(150, 4)
>>> X_new = SelectKBest(chi2, k=2).fit_transform(X, y)
>>> X_new.shape
(150, 2)

这些对象将一个得分函数作为输入,该函数返回单变量得分和p值(或仅返回SelectKBestSelectPercentile的得分):

该方法是基于F检验来估计两个随机变量之间的线性相关程度。另一方面,互信息方法可以捕获任何类型的统计依赖关系,但由于是非参数性的,因此需要更多样本才能进行准确估计。

稀疏数据的特征选择

如果你使用稀疏数据(例如稀疏矩阵这样的数据),那么chi2,mutual_info_regression, mutual_info_classif这几个函数在处理数据的时候不会让其变得密集。

警告:请注意不要使用回归得分函数来解决分类问题,因为你会得到一个无效的结果。

示例