机器学习——特征选择和降维(sklearn)

目录

  • 1. 移除低方差特征
    • 1.1 参数(Parameters)
    • 1.2 应用
    • 1.3 常用的方法
  • 2. 单变量特征选择
    • 2.1 SelectKBest
      • 2.1.1 参数
      • 2.1.2 常用的方法
      • 2.1.3 应用
    • 2.2 SelectPercentile
      • 2.2.1 参数
      • 2.2.2 常用的方法
      • 2.2.3 应用
    • 2.3 SelectFpr
      • 2.3.1 参数
      • 2.3.2 常用的方法
      • 2.3.3 应用
    • 2.4 SelectFdr
      • 2.4.1 参数
      • 2.4.2 常用的方法
      • 2.4.3 应用
    • 2.5 SelectFwe
      • 2.5.1 参数
      • 2.5.2 常用的方法
      • 2.5.3 应用
    • 2.6 GenericUnivariateSelect
      • 2.6.1 参数
      • 2.6.2 应用
    • 2.7 得分函数
  • 3. 使用SelectFromModel选取特征
    • 3.1 参数
    • 3.2 应用
  • 4. 其它
    • 4.1 基于 L1 的特征选取
    • 4.2 基于 Tree(树)的特征选取

sklearn.feature_selection模块中的类可以用来对样本集进行feature selection(特征选择)和 dimensionality reduction(降维),这将会提高估计器的准确度或者增强它们在高维数据集上的性能。

1. 移除低方差特征

VarianceThreshold是特征选择的一个简单基本方法,它会移除所有那些方差不满足一些阈值的特征。默认情况下,它将会移除所有的零方差特征,即那些在所有的样本上的取值均不变的特征。

1.1 参数(Parameters)

  1. threshold:float, default=0
    方差低于此阈值的特征将被删除。默认值是保持所有具有非零方差的特征。

  2. Attributes:variances_array, shape (n_features,)

单个特征的差异。

注意:
允许输入中有NAN。如果 X 中没有特征满足方差阈值,则引发 ValueError。

1.2 应用

例如,假设我们有一个特征是布尔值的数据集,我们想要移除那些在整个数据集中特征值为0或者为1的比例超过80%的特征。布尔特征是伯努利( Bernoulli )随机变量,变量的方差为

例子:

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]])'''
       

VarianceThreshold 移除了第一列,因为它的值为0的概率为p = 5/6 > .8 。

1.3 常用的方法

  1. get_params()
    获取此特征选择器的参数。返回一个字典。

  2. get_support()
    获取所选特征的索引。
    参数:
    indices = true返回证书索引,否则返回布尔值。返回一个数组。

  3. set_params()
    设置此特征选择器的参数。

2. 单变量特征选择

单变量的特征选择是通过基于单变量的统计测试来选择最好的特征。它可以当做是评估器的预处理步骤。

2.1 SelectKBest

SelectKBest移除那些除了评分最高的 K 个特征之外的所有特征。

2.1.1 参数

  1. score_func:callable, default=f_classif
    函数采用两个数组 X 和 y,并返回一对数组(分数、pvalues)或带有分数的单个数组。默认值为 f_classif。

  2. k:int or “all”, default=10
    要选择的主要特征的数量。 “all”选项绕过选择,用于参数搜索。

2.1.2 常用的方法

  1. get_params()
    获取此特征选择器的参数。返回一个字典。

  2. get_support()
    获取所选特征的索引。
    参数:
    indices = true返回证书索引,否则返回布尔值。返回一个数组。

  3. set_params()
    设置此特征选择器的参数。

2.1.3 应用

from sklearn.datasets import load_digits
from sklearn.feature_selection import SelectKBest, chi2


X, y = load_digits(return_X_y=True)
X.shape
'''(1797, 64)'''
X_new = SelectKBest(chi2, k=20).fit_transform(X, y)
X_new.shape
'''(1797, 20)'''

2.2 SelectPercentile

SelectPercentile移除除了用户指定的最高得分百分比之外的所有特征。根据最高分的百分位选择特征。

2.2.1 参数

score_func:callable, default=f_classif
参考上一个方法的参数。

percentile:int, default=10
要保留的特征百分比。

2.2.2 常用的方法

  1. get_params()
    获取此特征选择器的参数。返回一个字典。

  2. get_support()
    获取所选特征的索引。
    参数:
    indices = true返回证书索引,否则返回布尔值。返回一个数组。

  3. set_params()
    设置此特征选择器的参数。

2.2.3 应用

from sklearn.datasets import load_digits
from sklearn.feature_selection import SelectPercentile, chi2


X, y = load_digits(return_X_y=True)
X.shape
'''(1797, 64)'''
X_new = SelectPercentile(chi2, percentile=10).fit_transform(X, y)
X_new.shape
'''(1797, 7)'''

2.3 SelectFpr

筛选器:根据 FPR 测试选择alpha以下的值。FPR 测试代表误报率测试。它控制虚假检测的总数量。

2.3.1 参数

score_func:callable, default=f_classif
参考上一个方法的参数。

alpha:float, default=5e-2
选择alpha以下的特征。

2.3.2 常用的方法

  1. get_params()
    获取此特征选择器的参数。返回一个字典。

  2. get_support()
    获取所选特征的索引。
    参数:
    indices = true返回证书索引,否则返回布尔值。返回一个数组。

  3. set_params()
    设置此特征选择器的参数。

2.3.3 应用

from sklearn.datasets import load_breast_cancer
from sklearn.feature_selection import SelectFpr, chi2


X, y = load_breast_cancer(return_X_y=True)
X.shape
'''(569, 30)'''
X_new = SelectFpr(chi2, alpha=0.01).fit_transform(X, y)
X_new.shape
'''(569, 16)'''

2.4 SelectFdr

筛选器:选择估计错误发现率的 p 值。

2.4.1 参数

score_func:callable, default=f_classif
参考上一个方法的参数。

alpha:float, default=5e-2
要保留的特征的最高未校正 p 值。

2.4.2 常用的方法

  1. get_params()
    获取此特征选择器的参数。返回一个字典。

  2. get_support()
    获取所选特征的索引。
    参数:
    indices = true返回证书索引,否则返回布尔值。返回一个数组。

  3. set_params()
    设置此特征选择器的参数。

2.4.3 应用

from sklearn.datasets import load_breast_cancer
from sklearn.feature_selection import SelectFdr, chi2


X, y = load_breast_cancer(return_X_y=True)
X.shape
'''(569, 30)'''
X_new = SelectFdr(chi2, alpha=0.01).fit_transform(X, y)
X_new.shape
'''(569, 16)'''

2.5 SelectFwe

筛选器:选择与家庭错误率相对应的 p 值。

2.5.1 参数

score_func:callable, default=f_classif
参考上一个方法的参数。

alpha:float, default=5e-2
要保留的特征的最高未校正 p 值。

2.5.2 常用的方法

  1. get_params()
    获取此特征选择器的参数。返回一个字典。

  2. get_support()
    获取所选特征的索引。
    参数:
    indices = true返回证书索引,否则返回布尔值。返回一个数组。

  3. set_params()
    设置此特征选择器的参数。

2.5.3 应用

from sklearn.datasets import load_breast_cancer
from sklearn.feature_selection import SelectFwe, chi2

X, y = load_breast_cancer(return_X_y=True)
X.shape
'''(569, 30)'''
X_new = SelectFwe(chi2, alpha=0.01).fit_transform(X, y)
X_new.shape
'''(569, 15)'''

2.6 GenericUnivariateSelect

具有可配置策略的单变量特征选择器。允许使用可配置方法来进行单变量特征选择。它允许超参数搜索评估器来选择最好的单变量特征。

2.6.1 参数

  1. score_func:callable, default=f_classif
    函数采用两个数组 X 和 y,并返回一对数组(分数、pvalues)。对于模式“percentile”或“kbest”,它可以返回单个数组分数。

  2. mode:{‘percentile’, ‘k_best’, ‘fpr’, ‘fdr’, ‘fwe’}, default=’percentile’
    特征选择模式。

  3. param:float or int depending on the feature selection mode, default=1e-5
    对应模式的参数。

2.6.2 应用

from sklearn.datasets import load_breast_cancer
from sklearn.feature_selection import GenericUnivariateSelect, chi2


X, y = load_breast_cancer(return_X_y=True)
X.shape
'''(569, 30)'''
transformer = GenericUnivariateSelect(chi2, mode='k_best', param=20)
X_new = transformer.fit_transform(X, y)
X_new.shape
'''(569, 20)'''

2.7 得分函数

这些对象将得分函数作为输入,返回单变量的得分和 p 值:

  1. 对于回归:f_regression , mutual_info_regression
  2. 对于分类:chi2 , f_classif , mutual_info_classif

3. 使用SelectFromModel选取特征

SelectFromModel是一个 meta-transformer(元转换器) ,它可以用来处理任何带有 或者 属性的训练之后的评估器。 如果相关的 或者 属性值低于预先设置的阈值,这些特征将会被认为不重要并且移除掉。除了指定数值上的阈值之外,还可以通过给定字符串参数来使用内置的启发式方法找到一个合适的阈值。可以使用的启发式方法有meanmedian以及使用浮点数乘以这些(例如,0.1*mean )。

基于重要性权重选择特征的元转换器。

3.1 参数

  1. estimator:object
    构建元转换器的基础估算器。这可以是拟合(如果设置为 True)或非拟合估计量。评估器在拟合后应该有一个 or 属性。否则,应使用该参数。

  2. threshold:string or float, default=None
    用于特征选择的阈值。保留重要性大于或等于的特征,而丢弃其他特征。如果“中值”(或“均值”),则该值是特征重要性的中值(或均值)。也可以使用缩放因子(例如,“1.25*mean”)。如果 None 并且如果估计器将参数惩罚设置为L1,无论是显式还是隐式(例如,套索),使用的阈值是 1e-5。否则,默认使用“mean”。

  3. prefit:bool, default=False
    预置模型是否应直接传递给构造函数。如果为 True,则必须直接调用并且不能用SelectFromModel ,以及克隆估算器的类似实用程序一起使用。否则训练模型使用然后做特征选择。

  4. norm_order:non-zero int, inf, -inf, default=1
    在估计器的属性是维数的情况下,用于过滤2.阈值以下系数向量的范数的顺序。

  5. max_features:int, default=None
    要选择的最大特征数。

  6. importance_getter:str or callable, default=’auto’
    如果为“auto”,则通过 estimator.coef_feature_importances_ 的属性或属性使用特征重要性。
    还接受一个字符串,该字符串指定用于提取特征重要性的属性名称/路径(使用 实现)。
    覆盖默认的特征重要性获取器。 callable 与拟合估计器一起传递,它应该返回每个 feature.callable 的重要性。

3.2 应用

from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression


X = [[ 0.87, -1.34,  0.31 ],
      [-2.79, -0.02, -0.85 ],
      [-1.34, -0.48, -2.55 ],
      [ 1.92,  1.48,  0.65 ]]
y = [0, 1, 0, 1]
selector = SelectFromModel(estimator=LogisticRegression()).fit(X, y)
selector.estimator_.coef_
'''array([[-0.3252302 ,  0.83462377,  0.49750423]])'''
selector.threshold_
'''0.55245...'''
selector.get_support()
'''array([False,  True, False])'''
selector.transform(X)
'''array([[-1.34],
       [-0.02],
       [-0.48],
       [ 1.48]])'''
       

4. 其它

4.1 基于 L1 的特征选取

Linear models使用 L1 正则化的线性模型会得到稀疏解:他们的许多系数为0。 当目标是降低使用另一个分类器的数据集的维度, 它们可以与feature_selection.SelectFromModel一起使用来选择非零系数。特别的,可以用于此目的的稀疏评估器有用于回归linear_model.Lasso, 以及用于分类linear_model.LogisticRegressionsvm.LinearSVC

>>> from sklearn.svm import LinearSVC
>>> from sklearn.datasets import load_iris
>>> from sklearn.feature_selection import SelectFromModel
>>> iris = load_iris()
>>> X, y = iris.data, iris.target
>>> X.shape
(150, 4)
>>> lsvc = LinearSVC(C=0.01, penalty="l1", dual=False).fit(X, y)
>>> model = SelectFromModel(lsvc, prefit=True)
>>> X_new = model.transform(X)
>>> X_new.shape
(150, 3)

4.2 基于 Tree(树)的特征选取

基于树的estimators(查阅 sklearn.tree 模块和树的森林 在 sklearn.ensemble 模块)可以用来计算特征的重要性,然后可以消除不相关的特征(当与 sklearn.feature_selection.SelectFromModel 等元转换器一同使用时):

>>> from sklearn.ensemble import ExtraTreesClassifier
>>> from sklearn.datasets import load_iris
>>> from sklearn.feature_selection import SelectFromModel
>>> iris = load_iris()
>>> X, y = iris.data, iris.target
>>> X.shape
(150, 4)
>>> clf = ExtraTreesClassifier()
>>> clf = clf.fit(X, y)
>>> clf.feature_importances_  
array([ 0.04...,  0.05...,  0.4...,  0.4...])
>>> model = SelectFromModel(clf, prefit=True)
>>> X_new = model.transform(X)
>>> X_new.shape               
(150, 2)

你可能感兴趣的:(机器学习,机器学习,python)