机器学习中的特征工程

一、前言

  1.特征工程与意义

    (1)特征:数据中抽取出来的对结果预测有用的信息

    (2)特征工程师使用专业的背景知识和技巧来处理数据,使得特征能在机器学习算法中发挥更好的作用的过程

    (3)意义:更好的特征意味着更强的灵活度

        更好的特征意味着只需要简单模型

        更好的特征意味着更好的结果

  2.实际工业界特征工程那些事儿

二、数据与特征处理

  1.特种选择/清洗/采样

    (1)数据采集:

    哪些数据对最后的结果预测有帮助?

    数据我们能够采集上吗?位置(pos)

    线上实时计算的时候获取是否便捷

    (2)举例:

    我们现在要预测用户对商品的下单情况,或者我要给用户做商品推荐,那我们需要采集哪些信息呢?

    店家的,商品的,用户的(埋点)

  2.数值型/类别型/日期型/文本型特征处理

    (1)数据格式化

      确定存储格式

    (2)数据清洗

      garbage in  ;garbage out

      算法大多数时候就是一个加工机器,治愈最后的产品如何,取决于原材料的好坏

      实际这个过程会花掉一大部分时间,而且他会使得你对于业务的理解非常透彻

      数据清洗做的事情===>去掉脏的数据

    (3)数据清洗示例/思考角度

      简单的impossible(利用分位数来考虑)

      身高3米的人?

      一个月买脸盆墩布买了10w的人

      。。。

      

          第二种是由组合或者统计属性判定

        号称在米国却ip一直都在中国大陆的新闻阅读用户

        你要判定一个人是否会买篮球鞋,样本中的女性用户为85%

       第三种是补齐对应的缺省值

        不可信的样本去掉,缺省值极多的字段不用

    (4)数据与特征处理

      很多情况下,正负样本是不均衡的

        电商用户点/买过的商品和没有行为的商品

        某些疾病的患者和健康人

        。。。。

      大多数模型对正负样本比是敏感的(比如LR)

      随机采样和分层抽样

    (5)正负样本不平衡处理办法

      正样本>>负样本,且量都很大===》下(欠)采样

      正样本>>负样本,量不大=》

        采样更多的数据

        oversampling(比如图像识别中的景象和旋转)

        修改损失函数/loss function

  3.数据组合与特征处理

    1)特征处理

      (1)数值型 

        调整幅度/归一化:幅度调整到[0,1]范围内。

        Log等数据域变化

        统计值max,min,mean,std

        离散化

        Hash分桶

        每个类别下对应的变量统计值histogram(分布状况)

        试试数值型=?类别型

        幅度缩放

        统计值(取到特征)

        离散化:把连续值分成一个段,单独把每个值列成一个特征,可以对每一段的数据单独处理。树模型不需要离散化,要做离散化的是逻辑回归和神经网络。等距切分,按照最大最小做一个阐述的边界。等频切分:做一些统计,把分位数取出来。

      (2)类别型(计算机完全懵逼)

        one-hot编码(独热向量编码)/哑变量变换

        哑变量 

        Hash与聚类处理

        统计每个类别变量下各个target比例,转成数值型

        类别型特征Python处理技巧:Hash技巧

          体现内容的倾向性,落在其中词的个数

        类别型特征Python处理:Histoream映射

      (3)时间型

        既可以看做连续值,也可以看做离散值

        连续值

          a)持续时间(单页浏览时间长度)

          b)间隔时间(上次购买/点击离现在的时间)

        离散值

          a)一天中哪个时间段(hour)

          b)一周中的星期几

          c)一年中的哪个季度

          d)工作日/周末

      (4)文本型

        词袋:文本数据预处理后,去掉停用词,剩下词组成list,在词库中的映射稀疏向量

           把词袋中的词扩充到n-gram

        使用Tf-idf特征

        TF-IDF是一种统计方法,用以评估一字词对于一个文件集或者一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但是同时会随着它在语料库中的出现的频率成反比下降

        TF:Term Frequency

          TF(t)=(词t在当前文中出现的次数)/(t在全部文档中出现的次数)

          IDF(t)=ln(总文档数/含t的的文档数)

          TF-IDF权重=TF(t)*IDF(t)

        词袋=》word2vec   将一个词映射成一个重义的词向量

      (5)统计型特征

        历届kaggle/天池比赛,天猫/京东排序和推荐业务线里模型用到的特征

        加减平均:商品价格高于平均价格多少,用户在某个品类下消费超过平均用户多少,用户连续登陆天数超过平均多少

        分位线:商品属于售出商品价格的多少分位线

        次序型:排在第几位

        比例型:电商中,好/中/差评的比例    你已经超过全国百分之。。。。的同学

      (6)特征处理之组合特征

        简单的组合特征:拼接型

        模型特征组合

          用GBDT产出特征组合路径

          组合特征和原始特征一起放进LR训练

          最早Facebook使用的方式,多家互联网公司在使用

  4.特征处理案例分析

三、特征选择

  0.原因:

    (1)冗余:部分特征的相关度太高了,消耗计算性能,消耗计算资源

    (2)噪声:部分特征是相对预测结果有了负影响

  1.特征选择VS降维

    (1)前者只是踢掉原本特征里和结果预测关系不大的,后者做特征的计算组合构成新特征

    (2)SVD或者PCA确实也能解决一定的高纬度问题

  2.常见特征选择方式之:过滤型

    (1)评估单个特征和结果值之间的相关程度,排序留下Top相关的特征部分

    (2)Pearson相关系数,互信息,距离相关度

    (3)缺点:没有考虑到特征之间的关联作用,可能把有用的关联特征错误的踢掉

  3.常见特征选择方式之包裹型

    (1)把特征选择看做一个特征子集搜索问题,筛选各种特征子集,用模型评估效果

    (2)典型的包裹型算法为“递归特征删除算法”

    (3)比如用逻辑回归,怎么做这个事情呢?

      用全量特征跑一个模型

      根据线性模型的系数,删掉5-10%的弱特征,观察准确率/auc变化

      逐步进行,直至准确率/auc出现大的下滑停止

  4.常见特征选择方式之嵌入型

    (1)根据模型来分析特征的重要性(有别于上面的方式,是从生产的模型权重等)

    (2)最常见的方式为用正则化方式来做特征选择

    (3)举个例子,最早在电商中用LR做CTR预估,在3-5亿维系数特征上用L1正则化的LR模型。剩余2-3千万的feature,意味着其他的feature重要程度不高

  3.Filter/Wrapper/Embedded三种特征选择方式以及开发包/案例

四、特征工程案例

posted @ 2019-02-23 17:19  stone1234567890  阅读(700)  评论(0编辑  收藏  举报