DS&ML_特征工程笔记

其他相关文章

DS&ML_关联分析笔记
DS&ML_分类算法笔记之支持自动机SVM模型
DS&ML_分类算法笔记之随机森林、梯度提升树、XGBoost模型
DS&ML_分类算法笔记之k-近邻、KD-Tree模型
DS&ML_降维算法笔记之主成分分析PCA模型
DS&ML_分类算法笔记之朴素贝叶斯模型
DS&ML_聚类算法笔记之k-means模型
DS&ML_分类算法笔记之决策树模型
DS&ML_分类算法笔记之逻辑回归模型

特征工程从零到整学习笔记

部分转自http://www.cnblogs.com/jasonfreak/p/5448385.html, 加入了我自己的理解和总结,全文偏理论,若追求代码请转去该文章。

特征工程定义

特征工程,是一项工程活动,目的是最大限度地从原始数据中提取特征以供算法和模型使用。以期减少算法模型受到的(如噪声的)干扰。

有一句话叫做数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。可见特征工程的重要性。

1. 特征使用方案

要实现我们的目标需要哪些数据:基于业务进行理解,尽可能找出对因变量有影响的所有自变量

可用性评估

  • 获取难度
  • 覆盖率
  • 准确率

2. 特征获取方案

如何获取这些特征

如何存储

3. 特征处理

特征清洗

  • 清洗异常样本(脏数据):比如刷单数据
    • 判定方法
      • 简单属性判定
        • 身高45米、一个人一个月买了10W的发卡
      • 组合或统计属性判定
        • 号称在米国却ip一直都是大陆的新闻阅读用户
        • 你要判定一个人是否会买篮球鞋,样本中女性用户85%?   
      • 补齐可对应的缺省值
        • 缺省值极多的字段考虑不用
        • 不可信的样本丢掉
  • 数据采样
    • 原因
      • 因为采集、清洗过后的数据,正负样本是不均衡的
      • 样本权重
    • 方法
      • 随机抽样:有可能导致得到的数据不均匀
      • 根据特征分层抽样

预处理

  • 单个特征

    • 归一化标准化
    • 离散化
    • 虚拟编码Dummy Coding
      • 虚拟编码中的变量又叫哑变量,用以反映质的属性的一个人工变量,是量化了的自变量,通常取值为0或1。
    • 缺失值
    • 数据变换

      • log(基于对数函数的)基于单变元函数的数据变换可以使用一个统一的方式完成

        • 使用preproccessing库的FunctionTransformer对数据进行对数函数转换的代码如下:
          from numpy import log1p
          from sklearn.preprocessing import FunctionTransformer
          
          
          #自定义转换函数为对数函数的数据变换
          
          
          #第一个参数是单变元函数
          
          FunctionTransformer(log1p).fit_transform(iris.data)
      • 基于指数函数的
      • 基于多项式的

        • 使用preproccessing库的PolynomialFeatures类对数据进行多项式转换的代码如下:

          from sklearn.preprocessing import PolynomialFeatures
          
          
          #多项式转换
          
          
          #参数degree为度,默认值为2
          
          PolynomialFeatures().fit_transform(iris.data)
      • Box-Cox变换,Box-Cox变换是统计建模中常用的一种数据变换,用于连续的响应变量不满足正态分布的情况。Box-Cox变换,变换之后,可以一定程度上减小不可观测的误差和预测变量的相关性。
  • 多个特征

    • 特征选择

      • 要考虑的方面
        • 特征是否发散
          • 如果一个特征不发散,例如方差接近于0,也就是说样本在这个特征上基本上没有差异,这个特征对于样本的区分并没有什么用。
        • 特征与目标的相关性
          • 与目标相关性高的特征,应当优选选择。
      • 特征选择方法分类

        • Filter(过滤法):找自变量与目标变量之间的关联

          • 方差检验法

            • 使用方差选择法,先要计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征。使用feature_selection库的VarianceThreshold类来选择特征的代码如下:

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

              variancethreshold=VarianceThreshold(threshold=1)
              variancethreshold.fit_transform(train[features])
              
              
              #使用get_support方法,可以得到选择特征列的序号,
              
              
              #然后根据这个序号在原始数据中把对应的列名选择出来即可
              
              train[features].columns[variancethreshold.get_support()]
          • 相关系数

            • 使用相关系数法,先要计算各个特征对目标值的相关系数以及相关系数的P值。用feature_selection库的SelectKBest类结合相关系数来选择特征的代码如下:
              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)
              
              # 若运行出错尝试下面的代码
              
              print SelectKBest(lambda X, Y: tuple(array(map(lambda x:mic(x, Y), X.T)).T), k=2).fit_transform(iris.data, iris.target)
          • 卡方检验

            • 经典的卡方检验是检验定性自变量对定性因变量的相关性。假设自变量有N种取值,因变量有M种取值,考虑自变量等于i且因变量等于j的样本频数的观察值与期望的差距,构建统计量:χ2=sum((A-E)^2/E) 
            • 不难发现,这个统计量的含义简而言之就是自变量对因变量的相关性。用feature_selection库的SelectKBest类结合卡方检验来选择特征的代码如下:
              from sklearn.feature_selection import SelectKBest
              from sklearn.feature_selection import chi2
              
              
              #选择K个最好的特征,返回选择特征后的数据
              
              SelectKBest(chi2, k=2).fit_transform(iris.data, iris.target)
          • 信息增益、互信息

            • 互信息

              • 可以看成是一个随机变量中包含的关于另一个随机变量的信息量,或者说是一个随机变量由于已知另一个随机变量而减少的不肯定性,也就是自变量对因变量的相关性I(X;Y)=H(X)-H(X|Y)=H(X)+H(Y)-H(X,Y)。为了处理定量数据,最大信息系数法被提出,使用feature_selection库的SelectKBest类结合最大信息系数法来选择特征的代码如下:
                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(包装法):根据目标函数(通常是预测效果评分如AUC、MSE),决定每次是选择还是排除若干特征

          • 产生特征子集,评价
            • 完全搜索
            • 启发式搜索
            • 随机搜索
              • GA,启发式随机搜索
              • SA
          • 递归特征消除法

            • 递归消除特征法使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。使用feature_selection库的RFE类来选择特征的代码如下:
              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(集成法):先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。类似于Filter方法,但是是通过训练来确定特征的优劣。

          • 正则化(目标函数加一个惩罚项)

            • L1–应用:Lasso回归
            • L2–应用:岭回归(ridge regression)
            • 基于惩罚项的特征选择法(筛选出特征外也进行了降维)L1惩罚项降维的原理在于保留多个对目标值具有同等相关性的特征中的一个,所以没选到的特征不代表不重要。故,应结合L2惩罚项来优化。

              • 使用带惩罚项的基模型,除了筛选出特征外,同时也进行了降维。使用feature_selection库的SelectFromModel类结合带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)
          • 基于决策树模型的特征选择法

            • 树模型中GBDT也可用来作为基模型进行特征选择,使用sklearn中feature_selection库的SelectFromModel类结合GBDT模型
              from sklearn.feature_selection import SelectFromModel
              from sklearn.ensemble import GradientBoostingClassifier
              
              
              #GBDT作为基模型的特征选择
              
              SelectFromModel(GradientBoostingClassifier()).fit_transform(iris.data, iris.target)
              
          • 深度学习
    • 降维

      • 特征选择完成后,可以直接训练模型了,但是可能由于特征矩阵过大,导致计算量大,训练时间长的问题,因此降低特征矩阵维度也是必不可少的。
      • 本质是要将原始的样本映射到维度更低的样本空间中,但是PCA和LDA的映射目标不一样:PCA是为了让映射后的样本具有最大的发散性;而LDA是为了让映射后的样本有最好的分类性能。
      • PCA主成分分析

        • 使用decomposition库的PCA类选择特征的代码如下:
          from sklearn.decomposition import PCA
          
          
          #主成分分析法,返回降维后的数据
          
          
          #参数n_components为主成分数目
          
          PCA(n_components=2).fit_transform(iris.data)
      • LDA线性判别分析法,本身也是一个分类模型。

        • 使用lda库的LDA类选择特征的代码如下:
          from sklearn.lda import LDA
          
          
          #线性判别分析法,返回降维后的数据
          
          
          #参数n_components为降维后的维数
          
          LDA(n_components=2).fit_transform(iris.data, iris.target)
      • Embeddded中提到的基于L1惩罚项的模型
        1. 衍生变量

    对原始数据加工,生成有商业意义的变量。如通过每次登录的相关信息登陆表衍生出”最近30天的登录次数“这个变量。

预处理之常用数据属性处理方法

  • 时间戳处理
    • 时间戳属性通常需要分离成多个维度比如年、月、日、小时、分钟、秒钟。但是在很多的应用中,大量的信息是不需要的。比如在一个监督系统中,尝试利用一个’位置+时间‘的函数预测一个城市的交通故障程度,这个实例中,大部分会受到误导只通过不同的秒数去学习趋势,其实是不合理的。并且维度’年’也不能很好的给模型增加值的变化,我们可能仅仅需要小时、日、月等维度。因此当我们在呈现时间的时候,试着保证你所提供的所有数据是你的模型所需要的。
    • 并且别忘了时区,假如你的数据源来自不同的地理数据源,别忘了利用时区将数据标准化。
  • 分解类别属性
    • 一些属性是类别型而不是数值型,举一个简单的例子,由{红,绿、蓝}组成的颜色属性,最常用的方式是把每个类别属性转换成二元属性,即从{0,1}取一个值。因此基本上增加的属性等于相应数目的类别,并且对于你数据集中的每个实例,只有一个是1(其他的为0),这也就是独热(one-hot)编码方式(类似于转换成哑变量)。
    • 能够将类别属性转换成一个标量,最有效的场景应该就是只有两个类别的情况。即{0,1}对应{类别1,类别2}。这种情况下,并不需要排序,并且你可以将属性的值理解成属于类别1或类别2的概率。
  • 分箱/分区
    • 有时候,将数值型属性转换成类别呈现更有意义,同时能使算法减少噪声的干扰,通过将一定范围内的数值划分成确定的块。举个例子,我们预测一个人是否拥有某款衣服,这里年龄是一个确切的因子。其实年龄组是更为相关的因子,所有我们可以将年龄分布划分成1-10,11-18,19-25,26-40等。而且,不是将这些类别分解成2个点,你可以使用标量值,因为相近的年龄组表现出相似的属性。
    • 只有在了解属性的领域知识的基础,确定属性能够划分成简洁的范围时分区才有意义。即所有的数值落入一个分区时能够呈现出共同的特征。在实际应用中,当你不想让你的模型总是尝试区分值之间是否太近时,分区能够避免出现过拟合。例如,如果你所感兴趣的是将一个城市作为整体,这时你可以将所有落入该城市的维度值进行整合成一个整体。分箱也能减小小错误的影响,通过将一个给定值划入到最近的块中。如果划分范围的数量和所有可能值相近,或对你来说准确率很重要的话,此时分箱就不适合了。
  • 交叉特征
    • 交叉特征算是特征工程中非常重要的方法之一了,交叉特征是一种很独特的方式,它将两个或更多的类别属性组合成一个。当组合的特征要比单个特征更好时,这是一项非常有用的技术。数学上来说,是对类别特征的所有可能值进行交叉相乘。
    • 假如拥有一个特征A,A有两个可能值{A1,A2}。拥有一个特征B,存在{B1,B2}等可能值。然后,A&B之间的交叉特征如下:{(A1,B1),(A1,B2),(A2,B1),(A2,B2)},并且你可以给这些组合特征取任何名字。但是需要明白每个组合特征其实代表着A和B各自信息协同作用。
    • 一个更好地诠释好的交叉特征的实例是类似于(经度,纬度)。一个相同的经度对应了地图上很多的地方,纬度也是一样。但是一旦你将经度和纬度组合到一起,它们就代表了地理上特定的一块区域,区域中每一部分是拥有着类似的特性。

4. 特征监控

  • 特征有效性分析:特征重要性、权重
  • 特征监控:监控重要特征:防止特征质量下降,影响模型效果

2

你可能感兴趣的:(学习笔记,Python,D.S.,and,M.L.,数据科学与机器学习,特征工程)