精华内容
下载资源
问答
  • 连续投影算法用于特征变量筛选,可以用于复杂数据降维
  • 特征选择算法,防止分类结果出现过拟合,提前对多维的特征向量进行选择筛选
  • 本pdf简要精辟的介绍了IV值理论,做特征筛选时能够高效的计算IV值
  • 光谱特征波段的筛选,选择光谱数据中具有代表性的变量用以建立定量预测模型
  • 特征筛选

    2019-03-12 21:12:49
    通过特征筛选的方法,提升决策树的预测性能 import pandas as pd titanic=pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt') #分析数据特征与预测目标 y=titanic['survived'] X...

    通过特征筛选的方法,提升决策树的预测性能
    import pandas as pd
    titanic=pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt')

    #分析数据特征与预测目标
    y=titanic['survived']
    X=titanic.drop(['row.names','name','survived'],axis=1)

    #对缺失数据进行填充
    #age 用均值填充

    X['age'].fillna(X['age'].mean(),inplace=True)
    #其他na替换为‘UNKNOWN’
    X.fillna('UNKNOWN',inplace=True)

    from sklearn.cross_validation import train_test_split
    X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,random_state=33)

    #类别型特征向量化
    from sklearn.feature_extraction import DictVectorizer
    vec=DictVectorizer()
    X_train=vec.fit_transform(X_train.to_dict(orient='record'))
    X_test=vec.transform(X_test.to_dict(orient='record'))

    #输出处理后特征向量的维度
    print(len(vec.feature_names_))


    #使用决策树模型依靠所有特征进行预测,并作性能评估
    from sklearn.tree import DecisionTreeClassifier
    dt=DecisionTreeClassifier(criterion='entropy')
    dt.fit(X_train,y_train)
    dt.score(X_test,y_test)
    #0.817629179331307

    #导入特征筛选器
    from sklearn import feature_selection
    #筛选前20%的特征,使用相同配置的决策树模型进行预测,并评估性能
    fs=feature_selection.SelectPercentile(feature_selection.chi2,percentile=20)
    X_train_fs=fs.fit_transform(X_train,y_train)
    dt.fit(X_train_fs,y_train)
    X_test_fs=fs.transform(X_test)
    dt.score(X_test_fs,y_test)
    #0.8267477203647416


    #通过交叉验证的方法,按照固定间隔的百分比筛选特征

    #评判标准为cross_val_score的结果
    from sklearn.cross_validation import cross_val_score
    import numpy as np
    percentiles=range(1,100,2)
    results=[]
    for i in percentiles:
        fs=feature_selection.SelectPercentile(feature_selection.chi2,percentile=i)
        X_train_fs=fs.fit_transform(X_train,y_train)
        scores=cross_val_score(dt,X_train_fs,y_train,cv=5)
        results=np.append(results,scores.mean())
    print(results)
    #找到体现最佳性能的特征筛选的百分比
    opt=np.where(results==results.max())[0][0]
    print('最佳特征筛选百分比为:',percentiles[opt])

    import pylab as pl
    pl.plot(percentiles,results)
    pl.xlabel('percentiles of features')
    pl.ylabel('accuracy')
    pl.show()

    #使用最佳筛选后的特征,利用相同配置的模型在测试集上进行性能评估
    from sklearn import feature_selection
    fs=feature_selection.SelectPercentile(feature_selection.chi2,percentile=7)
    X_train_fs=fs.fit_transform(X_train,y_train)
    dt.fit(X_train_fs,y_train)
    X_test_fs=fs.transform(X_test)
    dt.score(X_test_fs,y_test)
    #0.8571428571428571
     

    展开全文
  • 特征筛选的支持向量回归算法,赵红军,颜亮,支持向量回归(SVR)可以有效对小样本数据进行回归分析,它通过求解一个凸二次优化问题得到全局最优解,避免了神经网络方法中的局部�
  • 高维生存数据的无模型特征筛选
  • 高维生存数据的强大特征筛选
  • 0x00 前言数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。由此可见,特征工程在机器学习中占有相当重要的地位。在实际应用当中,可以说特征工程是机器学习...

    0x00 前言

    数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。由此可见,特征工程在机器学习中占有相当重要的地位。在实际应用当中,可以说特征工程是机器学习成功的关键。

    那特征工程是什么?

    特征工程是利用数据领域的相关知识来创建能够使机器学习算法达到最佳性能的特征的过程。

    特征工程又包含了Feature Selection(特征选择)、Feature Extraction(特征提取)和Feature construction(特征构造)等子问题,本章内容主要讨论特征选择相关的方法及实现。

    在实际项目中,我们可能会有大量的特征可使用,有的特征携带的信息丰富,有的特征携带的信息有重叠,有的特征则属于无关特征,如果所有特征不经筛选地全部作为训练特征,经常会出现维度灾难问题,甚至会降低模型的准确性。因此,我们需要进行特征筛选,排除无效/冗余的特征,把有用的特征挑选出来作为模型的训练数据。

    0x01 特征选择介绍

    1.特征按重要性分类

    • 相关特征:

      对于学习任务(例如分类问题)有帮助,可以提升学习算法的效果;

    • 无关特征:

      对于我们的算法没有任何帮助,不会给算法的效果带来任何提升;

    • 冗余特征:

      不会对我们的算法带来新的信息,或者这种特征的信息可以由其他的特征推断出;

    2.特征选择的目的

    对于一个特定的学习算法来说,哪一个特征是有效的是未知的。因此,需要从所有特征中选择出对于学习算法有益的相关特征。而且在实际应用中,经常会出现维度灾难问题。如果只选择所有特征中的部分特征构建模型,那么可以大大减少学习算法的运行时间,也可以增加模型的可解释性。

    3.特征选择的原则

    获取尽可能小的特征子集,不显著降低分类精度、不影响分类分布以及特征子集应具有稳定、适应性强等特点。

    0x02 特征选择的方法

    1.Filter方法(过滤式)

    先进行特征选择,然后去训练学习器,所以特征选择的过程与学习器无关。相当于先对特征进行过滤操作,然后用特征子集来训练分类器。

    主要思想:对每一维特征“打分”,即给每一维的特征赋予权重,这样的权重就代表着该特征的重要性,然后依据权重排序。

    主要方法

    • Chi-squared test(卡方检验)

    • Information gain(信息增益)

    • Correlation coefficient scores(相关系数)

    优点:运行速度快,是一种非常流行的特征选择方法。

    缺点:无法提供反馈,特征选择的标准/规范的制定是在特征搜索算法中完成,学习算法无法向特征搜索算法传递对特征的需求。另外,可能处理某个特征时由于任意原因表示该特征不重要,但是该特征与其他特征结合起来则可能变得很重要。

    2.Wrapper方法(封装式)

    直接把最后要使用的分类器作为特征选择的评价函数,对于特定的分类器选择最优的特征子集。

    主要思想:将子集的选择看作是一个搜索寻优问题,生成不同的组合,对组合进行评价,再与其他的组合进行比较。这样就将子集的选择看作是一个优化问题,这里有很多的优化算法可以解决,尤其是一些启发式的优化算法,如GA、PSO(如:优化算法-粒子群算法)、DE、ABC(如:优化算法-人工蜂群算法)等。

    主要方法:递归特征消除算法。

    优点:对特征进行搜索时围绕学习算法展开的,对特征选择的标准/规范是在学习算法的需求中展开的,能够考虑学习算法所属的任意学习偏差,从而确定最佳子特征,真正关注的是学习问题本身。由于每次尝试针对特定子集时必须运行学习算法,所以能够关注到学习算法的学习偏差/归纳偏差,因此封装能够发挥巨大的作用。

    缺点:运行速度远慢于过滤算法,实际应用用封装方法没有过滤方法流行。

    3.Embedded方法(嵌入式)

    将特征选择嵌入到模型训练当中,其训练可能是相同的模型,但是特征选择完成后,还能给予特征选择完成的特征和模型训练出的超参数,再次训练优化。

    主要思想:在模型既定的情况下学习出对提高模型准确性最好的特征。也就是在确定模型的过程中,挑选出那些对模型的训练有重要意义的特征。

    主要方法:用带有L1正则化的项完成特征选择(也可以结合L2惩罚项来优化)、随机森林平均不纯度减少法/平均精确度减少法。

    优点:对特征进行搜索时围绕学习算法展开的,能够考虑学习算法所属的任意学习偏差。训练模型的次数小于Wrapper方法,比较节省时间。

    缺点:运行速度慢。

    0x03 特征选择实现方法一:去掉取值变化小的特征 (Removing features with low variance)

    该方法一般用在特征选择前作为一个预处理的工作,即先去掉取值变化小的特征,然后再使用其他特征选择方法选择特征。  

    考察某个特征下,样本的方差值,可以认为给定一个阈值,抛弃哪些小于某个阈值的特征。

    1.实现原理

    • 离散型变量:

      假设某特征的特征值只有0和1,并且在所有输入样本中,95%的实例的该特征取值都是1,那就可以认为这个特征作用不大。

      如果100%都是1,那这个特征就没意义了。

    • 连续型变量:

      需要将连续变量离散化之后才能用。

    而且实际当中,一般不太会有95%以上都取某个值的特征存在,所以这种方法虽然简单但是不太好用。可以把它作为特征选择的预处理,先去掉那些取值变化小的特征,然后再从接下来提到的的特征选择方法中选择合适的进行进一步的特征选择。

    2.实现代码

    from sklearn.feature_selection import VarianceThresholdX = [[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]])

    0x04 特征选择实现方法二:单变量特征选择

    单变量特征选择方法独立的衡量每个特征与响应变量之间的关系,单变量特征选择能够对每一个特征进行测试,衡量该特征和响应变量之间的关系,根据得分扔掉不好的特征。该方法简单,易于运行,易于理解,通常对于理解数据有较好的效果(但对特征优化、提高泛化能力来说不一定有效);这种方法有许多改进的版本、变种。

    1.Pearson相关系数(Pearson Correlation)

    皮尔森相关系数是一种最简单的,能帮助理解特征和响应变量之间关系的方法,该方法衡量的是变量之间的线性相关性。

    1)原理介绍


    640?wx_fmt=png

    • 就是用x_i、x_j的协方差除以x_i的标准差和x_j的标准差,可以看成一种剔除了两个变量量纲影响、标准化后的特殊协方差。

    • 协方差是度量各个维度偏离其均值的程度,协方差的值为正值时说明两者是正相关,否则是负相关的。

      结果的取值区间为[-1,1],-1表示完全的负相关,+1表示完全的正相关,0表示没有线性相关,绝对值表示相关性的强度。

    • 标准差也称均方差,是方差的算术平方根,能反映一个数据集的离散程度。

    2)主要用于连续型特征的筛选,不适用于离散型特征的筛选。

    3)优缺点

    • 优点:

      相关系数计算速度快、易于计算,经常在拿到数据(经过清洗和特征提取之后的)之后第一时间就执行。Pearson相关系数能够表征丰富的关系,符合表示关系的正负,绝对值能够表示强度。

    • 缺点:

      相关系数作为特征排序机制,它只对线性关系敏感,如果关系是非线性的,即便两个变量具有一一对应的关系,相关系数系数也可能会接近0。

    4)代码实现

    import numpy as npfrom scipy.stats import pearsonrnp.random.seed(2019)size=1000x = np.random.normal(0, 1, size)# 计算两变量间的相关系数print("Lower noise {}".format(pearsonr(x, x + np.random.normal(0, 1, size))))print("Higher noise {}".format(pearsonr(x, x + np.random.normal(0, 10, size))))

    2.互信息和最大信息系数(Mutual information and maximal information coefficient)

    如果变量不是独立的,那么我们可以通过考察联合概率分布与边缘概率分布乘积之间的 Kullback-Leibler 散度来判断它们是否“接近”于相互独立。

    1)互信息方法

    熵H(Y)与条件熵H(Y|X)之间的差称为互信息,互信息与条件熵之间的关系:

    640?wx_fmt=png

    其实,这就是ID3决策树的特征选择规则。  

    互信息法也是评价定性自变量对定性因变量的相关性的,但是并不方便直接用于特征选择:

    • 它不属于度量方式,也没有办法进行归一化,在不同的数据上的结果无法做比较。

    • 只能用于离散型特征的选择,连续型特征需要先进行离散化才能用互信息进行特征选择,而互信息的结果对离散化的方式很敏感。

    2)最大信息系数方法

    由于互信息法并不方便直接用于特征选择,因此引入了最大信息系数。最大信息数据首先寻找一种最优的离散方式,然后把互信息取值转换成一种度量方式,取值区间为[0,1]。

    3)最大信息系数方法代码实现

    x = np.random.normal(0,10,300)z = x *xpearsonr(x,z)# 输出-0.1from minepy import MINEm = MINE()m.compute_score(x, z)print(m.mic())# 输出1.0

    3.距离相关系数(Distance correlation)

    距离相关系数是为了克服Pearson相关系数的弱点而生的。

    1)原理介绍

    640?wx_fmt=png

    Pearson相关系数是0,我们也不能断定这两个变量是独立的(有可能是非线性相关)。
    例如x和x^2之间的Pearson相关系数是0,但是两个变量并不是独立的。

    2)代码实现

    from scipy.spatial.distance import pdist, squareformimport numpy as npfrom numbapro import jit, float32def distcorr(X, Y):    """ Compute the distance correlation function    >>> a = [1,2,3,4,5]    >>> b = np.array([1,2,9,4,4])    >>> distcorr(a, b)    0.762676242417    """    X = np.atleast_1d(X)    Y = np.atleast_1d(Y)    if np.prod(X.shape) == len(X):        X = X[:, None]    if np.prod(Y.shape) == len(Y):        Y = Y[:, None]    X = np.atleast_2d(X)    Y = np.atleast_2d(Y)    n = X.shape[0]    if Y.shape[0] != X.shape[0]:        raise ValueError('Number of samples must match')    a = squareform(pdist(X))    b = squareform(pdist(Y))    A = a - a.mean(axis=0)[None, :] - a.mean(axis=1)[:, None] + a.mean()    B = b - b.mean(axis=0)[None, :] - b.mean(axis=1)[:, None] + b.mean()    dcov2_xy = (A * B).sum()/float(n * n)    dcov2_xx = (A * A).sum()/float(n * n)    dcov2_yy = (B * B).sum()/float(n * n)    dcor = np.sqrt(dcov2_xy)/np.sqrt(np.sqrt(dcov2_xx) * np.sqrt(dcov2_yy))    return dcor

    4.基于学习模型的特征排序(Model based ranking)

    这种方法的思路是直接使用你要用的机器学习算法,针对每个单独的特征和响应变量建立预测模型。如果特征与响应变量之间的关系是非线性的,则有许多替代方案,例如基于树的方法(决策树,随机森林)、或者扩展的线性模型等。基于树的方法是最简单的方法之一,因为他们可以很好地模拟非线性关系,不需要太多的调整。但是要避免的主要是过度拟合,因此树的深度应该相对较小,并且应该应用交叉验证。

    代码实现

    from sklearn.cross_validation import cross_val_score, ShuffleSplitfrom sklearn.datasets import load_bostonfrom sklearn.ensemble import RandomForestRegressor#Load boston housing dataset as an exampleboston = load_boston()X = boston["data"]Y = boston["target"]names = boston["feature_names"]rf = RandomForestRegressor(n_estimators=20, max_depth=4)scores = []# 使用每个特征单独训练模型,并获取每个模型的评分来作为特征选择的依据。for i in range(X.shape[1]):     score = cross_val_score(rf, X[:, i:i+1], Y, scoring="r2",                              cv=ShuffleSplit(len(X), 3, .3))     scores.append((round(np.mean(score), 3), names[i]))print(sorted(scores, reverse=True))# 输出:[(0.636, 'LSTAT'), (0.59, 'RM'), (0.472, 'NOX'), (0.369, 'INDUS'),(0.311, 'PTRATIO'), (0.24, 'TAX'), (0.24, 'CRIM'), (0.185, 'RAD'),(0.16, 'ZN'), (0.087, 'B'), (0.062, 'DIS'), (0.036, 'CHAS'), (0.027, 'AGE')]

    5.卡方检验

    卡方检验是一种用途很广的计数资料的假设检验方法,由卡尔•皮尔逊提出。卡方值描述两个事件的独立性或者描述实际观察值与期望值的偏离程度。卡方值越大,表名实际观察值与期望值偏离越大,也说明两个事件的相互独立性越弱。

    1)原理介绍

    640?wx_fmt=png

    CHI值(卡方值)用于衡量实际值与理论值的差异程度,除以T是为了避免不同观察值与不同期望之间产生的偏差因T的不同而差别太大,所以除以E以消除这种弊端。

    • 实际值与理论值偏差的绝对大小(由于平方的存在,差异被放大)

    • 差异值与理论值的相对大小

    2)实现流程

    CHI值越大,说明两个变量越不可能是独立无关的,也就是说CHI值越大,两个变量的相关程度也越高。
    a. 对于特征变量x1,x2,…,xn,以及分类变量y。只需要计算CHI(x1,y)、CHI(x2,y)、…、CHI(xn,y),并按照CHI的值从大到小将特征排序。
    b. 选择合适的阈值,大于阈值的特征留下,小于阈值的特征删除。这样筛选出一组特征子集就是输入模型训练的特征。

    3)只适用于分类问题中离散型特征筛选,不能用于分类问题中连续型特征的筛选,也不能用于回归问题的特征筛选。

    4)代码实现

    现实方法:

    • sklearn.feature_selection.SelectKBest:

      返回k个最佳特征

    • sklearn.feature_selection.SelectPercentile:

      返回表现最佳的前r%个特征

    #导入sklearn库中的SelectKBest和chi2from sklearn.feature_selection import SelectKBest ,chi2#选择相关性最高的前5个特征X_chi2 = SelectKBest(chi2, k=5).fit_transform(X, y)X_chi2.shape输出:(27, 5)

    0xFF 总结

    1. 去掉取值变化小的特征方法一般用在特征选择前作为一个预处理的工作,即先去掉取值变化小的特征,然后再使用其他特征选择方法选择特征。如果机器资源充足,并且希望尽量保留所有信息,可以把阈值设置得比较高,或者只过滤离散型特征只有一个取值的特征。

    2. 单变量特征选择可以用于理解数据、数据的结构、特点,也可以用于排除不相关特征,但是它不能发现冗余特征。

    去掉取值变化小的特征方法和单变量特征选择方法都属于过滤式类特征筛选方法,但是学习算法无法向特征搜索算法传递对特征的需求。为了真正关注的是学习问题本身,我们将在《特征工程系列:特征筛选的原理与实现(下)》中继续介绍Wrapper方法和Embedded方法的原理与实现。

    参考文献:

    • [1] Feature selection – Part I: univariate selection. http://blog.datadive.net/selecting-good-features-part-i-univariate-selection/  

    • [2] Selecting good features – Part II: linear models and regularization. http://blog.datadive.net/selecting-good-features-part-ii-linear-models-and-regularization/  

    • [3] Feature selection. https://scikit-learn.org/stable/modules/feature_selection.html#univariate-feature-selection  

    • [4] https://gist.github.com/satra/aa3d19a12b74e9ab7941


    640?wx_fmt=png

    展开全文
  • sklearn的特征抽取和特征筛选

    千次阅读 2019-07-23 15:36:23
    我们都知道,特征值和特征向量在高等数学和线性代数中极为关键,特征工程,从表面上来说,就是从大大小小的数据中,筛选出有意义或者有用的条目,进而转换成一种数学表达,让机器和算法能够理解其中的意义。...

    数据分析过程中,往往需要处理很多类型的数据,数值型和非数值型,无论是在回归问题还是分类问题中,特征工程都是重中之重。
    我们都知道,特征值和特征向量在高等数学和线性代数中极为关键,特征工程,从表面上来说,就是从大大小小的数据中,筛选出有意义或者有用的条目,进而转换成一种数学表达,让机器和算法能够理解其中的意义。好比一个班上的每个学生,都有性别、年龄、身高、体重、成绩、性格特点等等特征,年龄、身高、体重、成绩属于数值型的特征,可以直接为我们所用,性别、性格特点属于非数值型特征,需要通过转换才能被算法理解。
    python的sklearn包,包含了特征工程常用的工具和api,主要有以下几个方面:

    特征抽取

    sklearn.feature_extraction:包含了常用的用于特征抽取的api

    • DictVectorizer(dtype=<class ‘numpy.float64’>, separator=’=’, sparse=True, sort=True)
      通过字典传入抽取特征,用于将标签型或非数值型数据的抽取和转换,sparse参数表示是否转换为稀疏矩阵
      >>> from sklearn.feature_extraction import DictVectorizer
      >>> v = DictVectorizer(sparse=False)
      >>> D = [{'foo': 1, 'bar': 2}, {'foo': 3, 'baz': 1}]
      >>> X = v.fit_transform(D)
      >>> X
      array([[2., 0., 1.],
             [0., 1., 3.]])
      
    • FeatureHasher(n_features=1048576, input_type=’dict’, dtype=<class ‘numpy.float64’>, alternate_sign=True)
      将输入转换为hash矩阵,n_features为特征的列数,也就是特征维数,input_type为输入的python数据类型,通常用于处理特征的维度较大的问题。
      >>> from sklearn.feature_extraction import FeatureHasher
      >>> h = FeatureHasher(n_features=10)
      >>> D = [{'dog': 1, 'cat':2, 'elephant':4},{'dog': 2, 'run': 5}]
      >>> f = h.transform(D)
      >>> f.toarray()
      array([[ 0.,  0., -4., -1.,  0.,  0.,  0.,  0.,  0.,  2.],
             [ 0.,  0.,  0., -2., -5.,  0.,  0.,  0.,  0.,  0.]])
      
    • image
      从图像中直接抽取特征
      • image.extract_patches_2d(image, patch_size, max_patches=None, random_state=None)
        从二维图像中抽取特征,patch_size为输出的色块或图像块的维度,是一个二维元祖,max_patches表示最大的色块维度,random_state表示当max_patches不为none时,是否采用随机数采样填充色块的值。输出的每个图像块均为一个RGB三通道构成
      	>>> from sklearn.datasets import load_sample_image
      	>>> from sklearn.feature_extraction import image
      	>>> # Use the array data from the first image in this dataset:
      	>>> one_image = load_sample_image("china.jpg")
      	>>> print('Image shape: {}'.format(one_image.shape))
      	Image shape: (427, 640, 3)
      	>>> patches = image.extract_patches_2d(one_image, (2, 2))
      	>>> print('Patches shape: {}'.format(patches.shape))
      	Patches shape: (272214, 2, 2, 3)
      	>>> # Here are just two of these patches:
      	>>> print(patches[1]) 
      	[[[174 201 231]
      	  [174 201 231]]
      	 [[173 200 230]
      	  [173 200 230]]]
      	>>> print(patches[800])
      	[[[187 214 243]
      	  [188 215 244]]
      	 [[187 214 243]
      	  [188 215 244]]]
      
      • image.grid_to_graph(n_x, n_y, n_z=1, mask=None, return_as=<class ‘scipy.sparse.coo.coo_matrix’>, dtype=<class ‘int’>)
      • image.img_to_graph(img, mask=None, return_as=<class ‘scipy.sparse.coo.coo_matrix’>, dtype=None)
        图像转换为连通图矩阵
      • image.reconstruct_from_patches_2d(patches, image_size)
        用图像块矩阵构造图片
      • image.PatchExtractor(patch_size=None, max_patches=None, random_state=None)
        同extract_patches_2d,用法不同
        >>> from sklearn.datasets import load_sample_images
        >>> from sklearn.feature_extraction import image
        >>> # Use the array data from the second image in this dataset:
        >>> X = load_sample_images().images[1]
        >>> print('Image shape: {}'.format(X.shape))
        Image shape: (427, 640, 3)
        >>> pe = image.PatchExtractor(patch_size=(2, 2))
        >>> pe_fit = pe.fit(X)
        >>> pe_trans = pe.transform(X)
        >>> print('Patches shape: {}'.format(pe_trans.shape))
        Patches shape: (545706, 2, 2)
        
    • text
      • text.CountVectorizer(input=’content’, encoding=’utf-8’, decode_error=’strict’, strip_accents=None, lowercase=True, preprocessor=None, tokenizer=None, stop_words=None, token_pattern=’(?u)\b\w\w+\b’, ngram_range=(1, 1), analyzer=’word’, max_df=1.0, min_df=1, max_features=None, vocabulary=None, binary=False, dtype=<class ‘numpy.int64’>)
        根据词典,矢量词频统计
      	>>> from sklearn.feature_extraction.text import CountVectorizer
      	>>> corpus = [
      	...     'This is the first document.',
      	...     'This document is the second document.',
      	...     'And this is the third one.',
      	...     'Is this the first document?',
      	... ]
      	>>> vectorizer = CountVectorizer()
      	>>> X = vectorizer.fit_transform(corpus)
      	>>> print(vectorizer.get_feature_names())
      	['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third', 'this']
      	>>> print(X.toarray())  
      	[[0 1 1 1 0 0 1 0 1]
      	 [0 2 0 1 0 1 1 0 1]
      	 [1 0 0 1 1 0 1 1 1]
      	 [0 1 1 1 0 0 1 0 1]]
      
      • text.HashingVectorizer(input=’content’, encoding=’utf-8’, decode_error=’strict’, strip_accents=None, lowercase=True, preprocessor=None, tokenizer=None, stop_words=None, token_pattern=’(?u)\b\w\w+\b’, ngram_range=(1, 1), analyzer=’word’, n_features=1048576, binary=False, norm=’l2’, alternate_sign=True, dtype=<class ‘numpy.float64’>)
        矢量词频统计,词典自动生成
      	>>> from sklearn.feature_extraction.text import HashingVectorizer
      	>>> corpus = [
      	...     'This is the first document.',
      	...     'This document is the second document.',
      	...     'And this is the third one.',
      	...     'Is this the first document?',
      	... ]
      	>>> vectorizer = HashingVectorizer(n_features=2**4)
      	>>> X = vectorizer.fit_transform(corpus)
      	>>> print(X.shape)
      	(4, 16)
      
      • text.TfidfTransformer(norm=’l2’, use_idf=True, smooth_idf=True, sublinear_tf=False)

      • text.TfidfVectorizer(input=’content’, encoding=’utf-8’, decode_error=’strict’, strip_accents=None, lowercase=True, preprocessor=None, tokenizer=None, analyzer=’word’, stop_words=None, token_pattern=’(?u)\b\w\w+\b’, ngram_range=(1, 1), max_df=1.0, min_df=1, max_features=None, vocabulary=None, binary=False, dtype=<class ‘numpy.float64’>, norm=’l2’, use_idf=True, smooth_idf=True, sublinear_tf=False)

    特征筛选

    sklearn.feature_selection,包含了特征筛选所用的api

    • GenericUnivariateSelect(score_func=, mode=’percentile’, param=1e-05)
      单变量筛选器,score_func为评价函数,mode为筛选策略,主要有{‘percentile’, ‘k_best’, ‘fpr’, ‘fdr’, ‘fwe’}几种,具体有什么意义见下文。param筛选策略的参数。

      >>> 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, 'k_best', param=20)
      >>> X_new = transformer.fit_transform(X, y)
      >>> X_new.shape
      (569, 20)
      

      评价函数分为以下几种:

      • f_classif
        方差分析中f值,也就是通常说的F检验,主要用于判断两个样本之间方差是否存在明显差异,主要用于特征对类别(标记)的分类任务中
      • mutual_info_classif
        变量和目标值之间的互信息,用于分类任务,计算公式如下。互信息是一种有用的信息度量,它可以看成是一个随机变量中包含的关于另一个随机变量的信息量,或者说是一个随机变量由于已知另一个随机变量而减少的不肯定性。
        在这里插入图片描述
      • chi2
        卡方检验,主要用于分类任务中
      • f_regression
        特征和类别(标记)的F值,主要用于回归分析
      • mutual_info_regression
        互信息,用于目标值为连续变量(非标记或类别)的分类任务。
    • SelectPercentile(score_func=, percentile=10)
      基于评价函数结果的百分位数来筛选特征,score_func为评价函数,percentile是百分比。例如选择卡方检验,选择10百分数,则输出结果会筛选出卡方检验值的前10%的特征作出输出特征。

      >>> 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)
      
    • SelectKBest(score_func=, k=10)
      基于评价函数结果筛选出最高的前K个特征

    • SelectFpr(score_func=, alpha=0.05)
      基于特征的假正率测试,筛选特征。假正率=被模型预测为正的负样本/(被模型预测为正的负样本+被模型预测为负的负样本),具体如下,主要用于二分类任务。score_func为评价函数,默认为f_classif,alpha评价函数的p值的上限值。


      预正预负
      实正真正(TP)假负(FN)
      实负假正(FP)正负(TN))
      • True Positive Rate(真正率 , TPR)或灵敏度(sensitivity)
        TPR = TP /(TP + FN)
        正样本预测结果数 / 正样本实际数
      • True Negative Rate(真负率 , TNR)或特指度(specificity)
        TNR = TN /(TN + FP)
        负样本预测结果数 / 负样本实际数
      • False Positive Rate (假正率, FPR)
        FPR = FP /(FP + TN)
        被预测为正的负样本结果数 /负样本实际数
      • False Negative Rate(假负率 , FNR)
        FNR = FN /(TP + FN)
        被预测为负的正样本结果数 / 正样本实际数
    • SelectFdr(score_func=, alpha=0.05)
      基于错误发现率(fdr)进行特征筛选,定义是错误拒绝(拒绝真的原假设)的个数占所有被拒绝的原假设个数的比例的期望值。通俗一点理解,就是实际为负的那部分样本中,通过特征计算得出的为负的样本所占的比例。alpha为p值的上限值。同样用于二分类任务

    • SelectFwe(score_func=, alpha=0.05)
      基于总Ⅰ型错误率筛选特征,关于FDR和FWE的知识,可参考链接

    • SelectFromModel(estimator, threshold=None, prefit=False, norm_order=1, max_features=None)
      基于模型选择特征,简单理解就是先采用模型对每个特征进行一次分类或回归任务,通过错误率或者误差筛选特征,estimator为评价器,也就是回归或分类模型,必须带有特征权重feature_importances_或者系数coef_;threshold为阈值,特征的权重大于或等于阈值的将会保留,否则就会被剔除;prefit是否直接fit筛选器;norm_order:规定的系数的个数;max_features=最大筛选特征量。

    • RFE(estimator, n_features_to_select=None, step=1, verbose=0)
      递归筛选特征,给定一个带权重或系数的评价器,RFE会对权重进行排序,首先对所有特征进行评价计算,进行迭代计算,每次迭代计算筛选出step个权重或系数最小的特征,直到剩余的特征数等于n_features_to_select。verbose用于是否输出过程。

      >>> from sklearn.datasets import make_friedman1
      >>> from sklearn.feature_selection import RFE
      >>> from sklearn.svm import SVR
      >>> X, y = make_friedman1(n_samples=50, n_features=10, random_state=0)
      >>> estimator = SVR(kernel="linear")
      >>> selector = RFE(estimator, 5, step=1)
      >>> selector = selector.fit(X, y)
      >>> selector.support_ 
      array([ True,  True,  True,  True,  True, False, False, False, False,
             False])
      >>> selector.ranking_
      array([1, 1, 1, 1, 1, 6, 4, 3, 2, 5])
      
    • RFECV(estimator, step=1, min_features_to_select=1, cv=’warn’, scoring=None, verbose=0, n_jobs=None)
      同RFE,加入了交叉验证的过程。

    • VarianceThreshold(threshold=0.0)
      方差阈值筛选,threshold是方差的阈值

    展开全文
  • python 机器学习——特征筛选实现

    千次阅读 2020-08-22 09:43:07
    特征筛选实现1、特征筛选2、特征筛选具体案例操作参考文献: 1、特征筛选 (1)含义 特征筛选/选择( Feature Selection )也称特征子集选择( Feature Subset Selection , FSS ),或属性选择( Attribute Selection )。...

    1、特征筛选

    (1)含义

    特征筛选/选择( Feature Selection )也称特征子集选择( Feature Subset Selection , FSS ),或属性选择( Attribute Selection )。是指从已有的 M 个特征( Feature )中选择 N 个特征使得系统的特定指标最优化,是从原始特征中选择出一些最有效特征以降低数据集维度的过程,是提高学习算法性能的一个重要手段,也是模式识别中关键的数据预处理步骤。对于一个学习算法来说,好的学习样本是训练模型的关键。

    (2)目的

    在有限的样本数目下,用大量的特征来设计分类器计算开销太大而且分类性能差。特征筛选可去掉一些冗余特征,提高模型的精度,减少计算量,减少特征数量、降维,使模型泛化能力更强,减少过拟合。

    (3)一些区别

    ① 特征筛选与特征提取区别:特征提取 ( Feature extraction )是指利用已有的特征计算出一个抽象程度更高的特征集,也指计算得到某个特征的算法。

    ② 特征筛选和 PCA 的区别:对于 PCA 而言,我们经常无法解释重建之后的特征,而特征筛选不存在对特征数值的修改,而更加侧重于寻找那些对模型的性能提升较大的少量特征。

    注意:降维和特征选择都是为了使数据维度降小,但实际上两者的区别很大,它们的本质是完全不同的: 降维本质上是从一个维度空间映射到另一个维度空间,特征的多少别没有减少,当然在映射的过程中特征的数值也会相应的变化(在这个过程中,特征发生了根本性的变化,原始的特征消失了);而特征选择就是单纯地从提取到的所有特征中选择部分特征作为训练集特征,特征在选择前和选择后不改变值,但是选择后的特征维数肯定比选择前小,因为只选择了其中的一部分特征(没有被舍弃的特征没有发生任何变化)。

    将高维空间的样本通过映射或者是变换的方式转换到低维空间,达到降维的目的,然后通过特征筛选删选掉冗余和不相关的特征来进一步降维。

    (4)特征选取的原则

    ① 获取尽可能小的特征子集

    ② 不显著降低分类精度

    ③ 不影响类分布

    ④ 特征子集应具有稳定适应性强等特点

    在筛选特征时需要注意:处理的数据类型、处理的问题规模、问题需要分类的数量、对噪声的容忍能力和无噪声环境下,产生稳定性好、最优特征子集的能力。

    (5)特征获取方法

    假设原始特征集中有 n 个特征(也称输入变量),那么存在 2 n − 1 2^n-1 2n1个可能的非空特征子集。搜索策略就是为了从包含 2 n − 1 2^n-1 2n1 个候选解的搜索空间中寻找最优特征子集而采取的搜索方法。按照特征子集的形成方式可以分为三种:穷举法( exhaustion )、启发法( heuristic )和随机法( random )。

    1)穷举式搜索它可以搜索到每个特征子集。缺点是它会带来巨大的计算开销,尤其当特征数较大时,计算时间很长。

    2)序列搜索它避免了简单的穷举式搜索,在搜索过程中依据某种次序不断向当前特征子集中添加或剔除特征,从而获得优化特征子集。比较典型的序列搜索算法如:前向后向搜索、等。序列搜索算法较容易实现,计算复杂度相对较小,但容易陷入局部最优。

    3)随机搜索由随机产生的某个候选特征子集开始,依照一定的启发式信息和规则逐步逼近全局最优解。例如:遗传算法(Genetic Algorithm, GA)、模拟退火算法(SimulatedAnnealing, SA)、粒子群算法(Particl Swarm Optimization,PSO)和免疫算法(Immune Algorithm, IA)等。

    综上穷举法需要遍历特征空间中所有的特征组合,所以方法复杂度最大,实用性不强;启发法通过采用期望的人工机器调度规则,重复迭代产生递增的特征子集,复杂度略低于穷举法,但是只能获取近似最优解;随即方法分为完全随机方法和概率随机方法两种,对参数设置的依赖性较强。

    2、特征筛选具体案例操作

    以“泰坦尼克号沉船事故”数据集为例:

    # 导入 pandas 并且更名为 pd。
    import pandas as pd
    # 从互联网读取 titanic 数据。
    titanic = pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt')
    # 分离数据特征与预测目标。
    y = titanic['survived']
    X = titanic.drop(['row.names', 'name', 'survived'], axis = 1)
    # 对对缺失数据进行填充。
    X['age'].fillna(X['age'].mean(), inplace=True)
    X.fillna('UNKNOWN', inplace=True)
    
    # 分割数据,依然采样 25% 用于测试。
    from sklearn.model_selection import train_test_split
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=33)
    # 类别型特征向量化。
    from sklearn.feature_extraction import DictVectorizer
    vec = DictVectorizer()
    X_train = vec.fit_transform(X_train.to_dict(orient='record'))
    X_test = vec.transform(X_test.to_dict(orient='record'))
    # 输出处理后特征向量的维度。
    print(len(vec.feature_names_))
    

    在这里插入图片描述

    我们可以看到特征向量的维度为474.

    # 使用决策树模型依靠所有特征进行预测,并作性能评估。
    from sklearn.tree import DecisionTreeClassifier
    dt = DecisionTreeClassifier(criterion='entropy')
    dt.fit(X_train, y_train)
    dt.score(X_test, y_test)
    

    在这里插入图片描述
    使用所有特征建立决策树得到的测试集准确率为0.8267

    # 从 sklearn 导入特征筛选器。
    from sklearn import feature_selection
    # 筛选前 20% 的特征,使用相同配置的决策树模型进行预测,并且评估性能。
    fs = feature_selection.SelectPercentile(feature_selection.chi2, percentile=20)
    X_train_fs = fs.fit_transform(X_train, y_train)
    dt.fit(X_train_fs, y_train)
    X_test_fs = fs.transform(X_test)
    dt.score(X_test_fs, y_test)
    

    在这里插入图片描述
    筛选前 20% 的特征建立决策树得到的测试集准确率为0.8298

    # 通过交叉验证(下一节将详细介绍)的方法,按照固定间隔的百分比筛选特征,并作图展示性能随特征筛选比例的变化。
    from sklearn.model_selection import cross_val_score
    import numpy as np
    percentiles = range(1, 100, 2)
    results = []
    for i in percentiles:
        fs = feature_selection.SelectPercentile(feature_selection.chi2, percentile = i)
        X_train_fs = fs.fit_transform(X_train, y_train)
        scores = cross_val_score(dt, X_train_fs, y_train, cv=5)
        results = np.append(results, scores.mean())
    print(results)
    # 找到体现最佳性能的特征筛选的百分比。
    opt = np.where(results == results.max())[0]
    print('Optimal number of features %d' %percentiles[int(opt)])
    

    在这里插入图片描述
    我们可以看到筛选7%的特征能够使得我们的训练集准确率达到最高。

    import pylab as pl
    pl.plot(percentiles, results)
    pl.xlabel('percentiles of features')
    pl.ylabel('accuracy')
    pl.show()
    

    在这里插入图片描述

    # 使用最佳筛选后的特征,利用相同配置的模型在测试集上进行性能评估。
    from sklearn import feature_selection
    fs = feature_selection.SelectPercentile(feature_selection.chi2, percentile=7)
    X_train_fs = fs.fit_transform(X_train, y_train)
    dt.fit(X_train_fs, y_train)
    X_test_fs = fs.transform(X_test)
    dt.score(X_test_fs, y_test)
    

    在这里插入图片描述
    由上面的输出结果可知:

    ① 经过初步的特征处理后,最终的训练与测试数据均有 474 个维度的特征;

    ② 如果直接使用全部 474 个维度的特征用于训练决策树模型进行分类预测,那么模型在测试集上的准确性约为 81.76% ;

    ③ 如果筛选前 20% 维度的特征,在相同的模型配置下进行预测,那么在测试集上表现的准确性约为 82.37% ;

    ④ 如果按照固定的间隔采用不同百分比的特征进行训练与测试,通过交叉验证得出的准确性有着很大波动,并且最好的模型性能表现在选取前 7% 的维度的特征的时候;

    ⑤ 如果使用前 7% 的维度的特征,那么最终决策树模型可以在该分类预测任务的测试集上表现出 85.71% 的准确性,比起最初使用全部特征的模型性能高出接近 4 个百分比。

    参考文献:

    [1] 范淼,李超.Python 机器学习及实践[M].清华大学出版社, 北京, 2016.
    [2] JasonDing.http://www.jianshu.com/p/ab697790090f
    [3] 苍梧.http://www.cnblogs.com/heaad/archive/2011/01/02/1924088.html

    展开全文
  • 建模-特征筛选

    2019-08-09 19:08:15
    第二次任务:对数据已经预处理的变量,使用IV和随机森林的...4、特征筛选 1、导入数据 #导入需要的包 import numpy as np import pandas as pd import LR as lr import matplotlib.pyplot as plt from sklearn.model...
  • 前言:之前的文章(高维数据中特征筛选方法的思考总结——单变量分析筛选法)中,对单变量分析筛选变量进行了初步考量,本文将进一步总结多变量分析筛选法。由于本文多处摘录网上的博客,只是进行了归纳整理,因此...
  • 2020华为杯研究生数学建模大赛的B题,辛烷值建模,需要先对众多变量进行特征筛选,再进行变量和输出之间的对应关系。所以可以用随机森林来进行变量的特征筛选。这个是py文件。
  • 数据挖掘中特征筛选方法策略

    热门讨论 2021-08-01 10:05:02
    前言 数据挖掘中我们经常会遇到高维数据...下面是我用得最多的几个方法,也是我个人觉得最实用方法,其他特征筛选方法大家可以自行查阅资料,这里不多介绍。 方差选择 卡方检验 相关系数 互信息 其他方法 写在最后 ...
  • 数据挖掘学习笔记-简单的特征筛选模型(二)特征筛选的意义利用logistics进行特征筛选logistics模型简述logistics的模型应用L1与L2惩罚项利用XGBoost进行特征筛选相关系数热力图绘制 注: 1.在完成前一部分的数据...
  • 为此,提出一种基于目标感知特征筛选的孪生网络跟踪算法。将经过裁剪处理后的模板帧和检测帧送入到ResNet50的特征提取网络分别提取目标和搜索区域的浅层、中层、深层特征;在目标感知模块中,通过设计一个回归损失函数...
  • 特征提升之特征筛选

    万次阅读 2017-09-05 18:23:21
    良好的数据特征组合不需太多,就可以使得模型的性能表现突出。冗余的特征虽然不会影响到模型的性能,但使得CPU的计算做了无用功。比如,PCA主要用于去除多余的线性相关的...然而特征筛选不存在对特征值的修改,从而更加
  • 包含5大类特征筛选方法,12小类特征筛选方法的原理以及python实现代码。
  • 基因组学、转录组学、蛋白组学及代谢组学等生信问题(高通量数据)中,面临的第一步往往就是降维(或者说筛选特征)。降维方法分为两大类:单变量分析降维法、多变量分析降维法。单变量降维常常使用FC值或者P值,多...
  • 特征筛选:重要性评估

    千次阅读 2020-07-22 21:50:09
    特征筛选的目的: 避免无用的特征(avoid useless features) 避免冗余的特征(avoid redundant features) 使用易于理解的简单特征(good features should easy to understand) 好的特征具有如下的特点: 有...
  • python 特征筛选

    2019-08-23 22:02:16
    #建议作为数值特征筛选方法,对于分类特征可以考虑每个类别的占比问题 ts = 0.5 vt = VarianceThreshold(threshold=ts) vt.fit(X_df) #查看各个特征的方差 dict_variance = {} for i,j in zip(X_df.columns....
  • 机器学习之特征筛选

    千次阅读 2019-07-13 15:42:45
    特征筛选与PCA这类通过选择主成分对特征进行重建的方法有所区别:PCA压缩之后的特征往往无法解释;但是特征筛选不存在对特征值的修改,而更加侧重于寻找那些对模型的性能提升较大的少量特征。 ##此模型采用的titanic...
  • 机器学习之 基于xgboost的特征筛选

    千次阅读 2020-03-19 01:15:43
    本文主要是基于xgboost进行...但其实在前面特征选择部分,基于xgboost进行特征筛选也大有可为。 #coding=utf-8 import pandas as pd import xgboost as xgb import os,random,pickle os.mkdir('featurescore'...
  • 4、特征选择与降维的关系:特征选择只筛选掉原本特征里和结果预测关系不大的,后者做特征的计算组合构成新特征。SVD、PCA降维也能解决一定的高纬度问题。 二、特征选择的方法: 1、过滤型(Filter): (1)...
  • 在数理统计中,方差是测算随机变量离散趋势最重要、最...sklearn库中的用于特征选择的函数,使用VarianceThreshold法,先要计算各个特征的方差,然后根据阈值,剔除方差大于阈值的特征。 # -*- coding:utf-8 -*- impor
  • 线性回归的特征筛选方法

    千次阅读 2019-12-13 00:08:53
    特征选择中,最适合在探索阶段使用的就是过滤式的方法,比如方差阈值法和单变量选择法。在上一篇文章中我们介绍了如何在sklearn中使用方差阈值法,那么今天我们就进一步介绍更加实用、有效的单变量选择法。 ...
  • 在机器学习数据集中,一个特征如果可以通过另一个或多个特征间接得到,则这个特征的信息可能是冗余的,特征之间的信息冗余不但会使数据集更加臃肿,降低模型效率,也会违背特征独立性的模型基本假设,影响模型的性能...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 69,162
精华内容 27,664
关键字:

特征筛选