机器学习之特征工程

什么是特征工程

特征:从数据中抽取出来对结果预测有用的信息。那么,现在有很多的数据,并不是每一个数据都有用,需要抽取。

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

数据采集

采集那些对预测结果有帮助的信息。能影响结果的,和结果有关联的,有表面的也有内部的,需要去辨别。

数据清洗

去掉脏数据。这个过程很花时间,但是能帮助你对业务的理解变得透彻。

有哪些角度去看呢?关键是合不合理,reasonable。包括,单维度考量,组合或者统计属性判定,统计方法,补齐可对应的缺省值。

数据采样:

  • 分类问题中,正负样本不均衡问题,大部分模型对正负样本不均衡敏感,因为它损失函数是对loss求和,如果不均衡,肯定倾向于更多的那一类。需要随机采样和分层采样。分层采样:先将总体的单位按某种特征分为若干次级总体(层),然后再从每一层内进行单纯随机抽样,组成一个样本。
  • 对于正负样本不均衡问题,若正样本远大于负样本,量很大,对正样本做下采样;若量不大,就要采集更多的数据;过采样,oversampleing(过拟合风险,需要处理数据);修改损失函数。

常见的特征工程

针对数据的类型,有不同的处理方法。

数值型
幅度调整,归一化

  • 为什么进行调整?每个column(特征)的数值表达的意思不同,那么幅度也应该不同。比如房子面积和卧室个数,这两个是不一样的幅度,那么进入模型之前如果不加调整,会更加偏向大的那个数据。

如何进行调整?幅度缩放,标准化,归一化

  • 幅度缩放(Scaling): x~ = ( x - xmin)/(xmax - xmin) 那么,数值型数据都在(0,1)
  • 标准化(standardization):x~ = ( x - mean(x)/var(x)) 把数值的分布进行调整
  • 归一化(Normalization): L2 Normalization x~ = x/||x||2 (|||x||2 = sqrt(xi))
  • 数值型特征python处理:
    #数值统计
    df.mean(1) #按行统计均值
    df.mean(0) #按列统计均值
    #离散化 pd.cut 和 pd.qcut
    pd.cut(arr/df, n) #把连续数值按数大小切分为n个桩,那么就有n-1个区域,这样可以给每个区域赋值0,1,2,3...等距划分
    pd.qcut(arr/df, n) #把连续数值按个数的分布切分为n个桩 等频划分 占我总数百分之十的区域是多少
    pd.cut(df,3)
    [(1,4],(4,9]] #切分为2个区域
    df['new_column'] = pd.cut(df,3) #创建一个新属性,新属性里面是区间的值(简单方法)
    
    
    

对数幅度变化
离散化(分箱,分桶)
高次或者四则运算特征
数值型变成类别型 
统计值 max,min,std,mean

类别型特征
one-hot编码/哑变量变换
dummies_cabin = pd.get_dummies(data['Cabin'], prefix = 'Carbin')
#为什么要这样?不能把类别做成 0,1,2,3,4么?
#比如红,黄,蓝三种颜色,如果不做one-hotencoding,仅仅只是把他们改成了数值,那么在模型中,这一列向量的x就有大小区别了,蓝色如果是3,红色是1
#那么蓝色3*θ 比 1*θ大二倍,那么loss function的计算会改变。
Hash技巧
分桶映射
时间型

比较特殊,包含的信息多,既可以处理成离散型,也可以是连续型。

  • 连续值 转换成持续时间或者间隔时间 (可以用pandas datetime去运算)
  • 离散值 转换成哪几个时间段(比如美团点餐中午点的多),哪天(节假日点餐多),周末还是工作日(周末点餐多)。
文本型
词袋:
from sklearn.feature_extraction.txt import CountVectorizer
TF-idf特征

评估一个字词对于一个文件集或者语料库中某份文件的重要程度;重要度应该是和在文件中的出现次数成正比增加(文件中一个词出现次数越多,重要度越高),同时和在整个语料库中出现的频率成反比(如果是大众化词,比如 this,that,就要检索整个语料库,整个语料库this肯定出现的很多,所以占比下降)。

TF: Term Frequency

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

IDF:

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

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

组合特征

  • 简单组合特征,拼接型 对于某个样本把两个特征简单拼接起来。
  • 树模型+LR 


特征选择方法

有什么用?

  • 冗余:特征之间相关度太高,消耗计算性能
  • 噪声:有些特征卵用都没有,还有负影响。
  • 特征选择和降维:前者是剔除原本特征里和结果相关度不大的,后者降维,保留了绝大部分的信息。

过滤式特征选择方式
评估单个特征和结果之间相关程度,排序留下top相关的特征部分。

方法:Pearson相关系数,互信息或者距离相关性

缺点:没考虑特征之间关联作用,可能会剔除有用的关联特征(当这个关联特征在单特征时关联不明显时)。

from scipy.stats import pearsonr
from sklearn.feature_selection import SelectKBest, chi2
包裹式(wrapper)特征选择 

把特征选择看成一个特征子集的搜索问题,筛选各种特征子集,用模型评估效果。
递归特征删除算法

怎么做?先用全量特征跑一个模型,根据线性模型的系数,看相关度和贡献度,删除5%-10%的弱特征,再跑一遍,看准确率/AUC的变化;如果变化不大,就说明被删除的没多少用,然后继续这样,直到变化出现雪崩。

from sklearn.feature_selection import RFR
嵌入型
根据模型来分析特征重要性
常用正则化来做特征选择
  • L1正则化 有一个截断性效应,最后会把不重要的特征权重直接变成0,最常见。
  • l2正则化
from sklearn.feature_selection import SelectFromModel








模型调优与融合

模型融合 Model Ensemble

ensemble learning是一组individual learner的组合。

Trainning mutiple learners and then combine them for use,with Boosting and Bagging as representatives.                     (http://www2.islab.ntua.gr/attachments/article/86/Ensemble%20methods%20-%20Zhou.pdf)

Some people prefer calling the learners individual learners or component learners to “base learners”, while the names “individual learners” and “component learners” can also be used for homogeneous base learners. 所以统一叫做base learner。

为什么要做模型融合?

空间上,假设空间h的平均更接近真实空间f

计算上,迭代求解很可能找到局部最优解,多个局部最优解取平均更趋近全局最优解。

表现上,真实的假设f可能并不在h空间中,取平均可能能够跳出h空间更接近空间外的f。

模型融合不同思路的策略:

  1. voting 投票器 单个模型很难控制过拟合 就只能多数表决。 from sklearn.ensemble import VotingClassifier
  2. bagging 应对欠拟合或者过拟合 过拟合常见 所以如何解决过拟合? from sklearn.ensemble import BaggingClassifier.
  3. RandomForest 基于树模型的bagging优化方法。特征是双重采样,先对样本随机采样,构建树时会对特征随机采样。
  4. stacking 利用别的分类器的结果作为特征再分类。先学习出三个独立的模型,得到预测结果;再用其他模型训练这三个结果,得到最终结果。但是容易过拟合。
  5. blending 弱化版的stacking,对第一次训练出来的结果做线性加权。也就是第二步不用复杂的模型。
  6. boosting 三个主要方面:重复迭代和训练;每次分配给错误样本更高的权重;最简单分类器叠加。比如:Adaboost

例子:Adaboost  

猜你喜欢

转载自blog.csdn.net/gaoyishu91/article/details/80074829