• 机器学习特征选择方法


    单变量特征选择

    单变量特征选择是通过选择那些基于单变量统计检验(univariate statistical tests)得出的最优特征来实现的。它可以看作是估计器的一个预处理步骤。Scikit-learn将一系列特征选择程序作为不同的类提供给我们,这些类都实现了 transform 方法:

    • SelectKBest 选择得分最高的K个特征,其余的特征都删除。
    • SelectPercentile 删除除用户指定的最高得分百分比以外的所有特征
    • 对每个特征使用通用的单变量统计检验:假阳率(false positive rate)SelectFpr,伪发现率(false discovery rate) SelectFdr或多重比较谬误(family wise error)SelectFwe。
    • GenericUnivariateSelect允许使用可配置的策略来执行单变量特征选择。这允许使用超参数搜索估计器(hyper-parameter search estimator)选择最佳的单变量选择策略。

    例如,我们可以对样本执行一个χ2测试来挑选出两个最好的特征(chi2方式)

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

    这些对象把输入当做计分函数,返回单变量分数(univariate scores)和p值(或对于SelectKBest和 SelectPercentile来说,仅仅返回分数):

    • 对于回归:f_regression,mutual_info_regression
    • 对于分类:chi2,f_classif,mutual_info_classif

    基于F-检验的方法可以估计两个随机变量之间的线性依赖度(linear dependency)。另一方面,基于互信息(mutual information)的方法可以捕捉任何类型的统计依赖性(statistical dependency),但由于互信息方法是无参数的,他们需要更多的样本才能进行准确的估计。

    #特征相关性权重柱状图输出
    from sklearn.datasets import load_iris
    from sklearn.feature_selection import SelectKBest,f_classif
    from sklearn.feature_selection import chi2
    import numpy as np
    iris=load_iris()
    x,y=iris.data,iris.target
    print(x.shape)
    x_new=SelectKBest(f_classif,k=2).fit_transform(x,y)
    print(x_new.shape)

    #方法1-采用卡方检验的方式进行特征的提取(统计依赖度)
    import numpy as np
    from sklearn.feature_selection import SelectKBest,chi2
    import matplotlib.pyplot as plt
    selector=SelectKBest(chi2,k=2)
    selector.fit(x,y)
    s=-1*np.log10(selector.pvalues_)
    plt.bar(range(len(iris.feature_names)),s)
    plt.xticks(range(len(iris.feature_names)),iris.feature_names)
    plt.show()

    #方法2-采用F检验方法的方式进行特征的提取(线性依赖度)
    import numpy as np
    from sklearn.feature_selection import SelectKBest,f_classif
    import matplotlib.pyplot as plt
    selector=SelectKBest(f_classif,k=2)
    selector.fit(x,y)
    s=-1*np.log10(selector.pvalues_)
    plt.bar(range(len(iris.feature_names)),s)
    plt.xticks(range(len(iris.feature_names)),iris.feature_names)
    plt.show()

    #方法3—使用集成学习算法的特征重要性输出进行类比
    from sklearn import ensemble
    params={"n_estimators":100,"max_depth":4,"min_samples_split":2,"learning_rate":0.01,"loss":"ls"}
    clf=ensemble.GradientBoostingRegressor(**params)
    clf.fit(x,y)
    feature_importance=clf.feature_importances_
    feature_importance=100.0*(feature_importance/feature_importance.max())
    plt.bar(range(len(iris.feature_names)),feature_importance)
    plt.xticks(range(len(iris.feature_names)),iris.feature_names)
    plt.show()
  • 相关阅读:
    项目开发目录
    语法 部分
    time模块
    文件 部分
    二分法
    函数 部分
    递归
    模块 部分
    稀疏数组
    Java中使用foreach遍历数组
  • 原文地址:https://www.cnblogs.com/Yanjy-OnlyOne/p/12975199.html
Copyright © 2020-2023  润新知