• 关于特征工程的一些学习、思考与错误的纠正


    特征工程的整体思路:

    1. 对于特征的理解、评估

    2. 特征处理:

      2.1 特征处理

        2.1.1 特征清洗

          清洗异常、采样

        2.1.2 预处理

          单特征情况:归一化、离散化、哑变量编码、缺失值填充等。数据变换例如log服从正态分布。

          多特征情况:

            降维:PCA、LDA(这个不太了解、待学习)

            特征选择:三种大方法,Filter——x与y之间的关联,Wrapper——目标函数检验(MSE),Embedded——机器学习方法,正则化、决策树、深度学习。

    3. 特征监控

    有效性分析和监控。

    Python相关:特征工程主要使用sklearn处理。

    预处理

    所谓无量纲化:

    1. 平常所说的标准化就是无量纲化的一种。

    from sklearn.preprocessing import StandardScaler
     
    #标准化,返回值为标准化后的数据
    StandardScaler().fit_transform(iris.data)

    2. 区间缩放,我记得吴恩达的机器学习教程就是这个方法。

    from sklearn.preprocessing import MinMaxScaler
    
    #区间缩放,返回值为缩放到[0, 1]区间的数据
    MinMaxScaler().fit_transform(iris.data)

    注意:标准化与归一化的区别,标准化按列处理,归一化按行处理。

    二值化:

    from sklearn.preprocessing import Binarizer
    
    #二值化,阈值设置为3,返回值为二值化后的数据
    Binarizer(threshold=3).fit_transform(iris.data)

    哑编码:

    from sklearn.preprocessing import OneHotEncoder
    
    #哑编码,对IRIS数据集的目标值,返回值为哑编码后的数据
    OneHotEncoder().fit_transform(iris.target.reshape((-1,1)))

    缺失值填充:

    这里写一个填充方法的备忘,其实个人认为相比于均值填充,众数和中位数填充更加准确

    from numpy import vstack, array, nan
    from sklearn.preprocessing import Imputer
    
    #缺失值计算,返回值为计算缺失值后的数据
    #参数missing_value为缺失值的表示形式,默认为NaN
    #参数strategy为缺失值填充方式,默认为mean(均值)
    Imputer().fit_transform(vstack((array([nan, nan, nan, nan]), iris.data)))

    数据变换:

    在吴恩达的机器学习非常明确的讲过这个理论,其实就是对原有feature进行“升维”的变换,也就是提升幂次。来达到突出更多特征的目的。

    from sklearn.preprocessing import PolynomialFeatures
    
    #多项式转换
    #参数degree为度,默认值为2
    PolynomialFeatures().fit_transform(iris.data)

    特征选择的思路:

    方差法,如果特征不发散即方差接近0,直接丢掉。

    特征与目标的相关性,相关性高的自然就与目标联系紧密,选择优先度高。

    特征选择方法:

    Filter(过滤法):发散性和相关性是评分指标,设定阈值选择特征的个数。

    方差:

    from sklearn.feature_selection import VarianceThreshold
    
    #方差选择法,返回值为特征选择后的数据
    #参数threshold为方差的阈值
    VarianceThreshold(threshold=3).fit_transform(iris.data)

    相关系数:

    from sklearn.feature_selection import SelectKBest
    from scipy.stats import pearsonr
    
    #选择K个最好的特征,返回选择特征后的数据
    #第一个参数为计算评估特征是否好的函数,该函数输入特征矩阵和目标向量,输出二元组(评分,P值)的数组,数组第i项为第i个特征的评分和P值。在此定义为计算相关系数
    #参数k为选择的特征个数
    SelectKBest(lambda X, Y: array(map(lambda x:pearsonr(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)

    卡方检验:

    from sklearn.feature_selection import SelectKBest
    from sklearn.feature_selection import chi2
    
    #选择K个最好的特征,返回选择特征后的数据
    SelectKBest(chi2, k=2).fit_transform(iris.data, iris.target)

    互信息法:

    from sklearn.feature_selection import SelectKBest
     from minepy import MINE
     
     #由于MINE的设计不是函数式的,定义mic方法将其为函数式的,返回一个二元组,二元组的第2项设置成固定的P值0.5
     def mic(x, y):
         m = MINE()
         m.compute_score(x, y)
         return (m.mic(), 0.5)
    
    #选择K个最好的特征,返回特征选择后的数据
    SelectKBest(lambda X, Y: array(map(lambda x:mic(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)

    Wrapper(包装法):目标函数评分,选择或派出若干特征。

    递归特征消除法:

    from sklearn.feature_selection import RFE
    from sklearn.linear_model import LogisticRegression
    
    #递归特征消除法,返回特征选择后的数据
    #参数estimator为基模型
    #参数n_features_to_select为选择的特征个数
    RFE(estimator=LogisticRegression(), n_features_to_select=2).fit_transform(iris.data, iris.target)

    Embedded(集成法):机器学习方法,得到的特征权值系数用来进行特征选择。

    feature_selection的方法之前使用过,不过没有针对性,L1惩罚项代码:

    from sklearn.feature_selection import SelectFromModel
    from sklearn.linear_model import LogisticRegression
    
    #带L1惩罚项的逻辑回归作为基模型的特征选择
    SelectFromModel(LogisticRegression(penalty="l1", C=0.1)).fit_transform(iris.data, iris.target)

    降维:

    这个之前尝试过,但是不知道出了什么错误或者使用的方法不对,结果奇差。还需学习。

    PCA:让映射后的样本具有最大的发散性,无监督降维

    LDA:让映射后的岩本有最好的分类性能,有监督降维

    from sklearn.decomposition import PCA
    
    #主成分分析法,返回降维后的数据
    #参数n_components为主成分数目
    PCA(n_components=2).fit_transform(iris.data)
    from sklearn.lda import LDA
    
    #线性判别分析法,返回降维后的数据
    #参数n_components为降维后的维数
    LDA(n_components=2).fit_transform(iris.data, iris.target)

    参考资料:http://www.cnblogs.com/jasonfreak/p/5448385.html

    感谢jasonfreak的博客给我的启发。

  • 相关阅读:
    可在广域网部署运行的QQ高仿版 -- GG叽叽(源码)
    区间合并
    二分查找算法模板
    神经网络详解(RNN/LSTM)
    反向传播算法推导过程(非常详细)
    机器学习-回归问题(Regression)
    从RNN到LSTM
    神经网络浅讲:从神经元到深度学习
    部署高并发python后端(Systemd+Nginx+Gunicorn+Gevent+Supervisor+Flask )
    产品笔记 | 软件版本号—规范与命名规则
  • 原文地址:https://www.cnblogs.com/fancyUtech/p/9254858.html
Copyright © 2020-2023  润新知