一、背景概述
特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程,指的是把原始数据转变为模型的训练数据的过程,它的目的是使模型的性能得到提升。
特征工程包括特征构建、特征提取、特征选择三个部分。特征构建是指从原始数据中人工的找出一些具有物理意义的特征,属性分割和结合是特征构建时常使用的方法。 特征提取与特征选择都是为了从原始特征中找出最有效的特征。特征提取强调通过数据转换的方式得到一组具有明显物理或统计意义的特征;而特征选择是从特征集合中挑选一组具有明显物理或统计意义的特征子集,能表示出每个特征的重要性对于模型构建的重要性。
二、特征构建
我们观察原始数据,思考问题并分析得到的数据,比如结构性的表格数据,可以尝试组合二个、三个不同的属性构造新的特征,如果存在时间相关属性,可以划出不同的时间窗口,得到同一属性在不同时间下的特征值,也可以把一个属性分解或切分,例如将数据中的日期字段按照季度和周期后者一天的上午、下午和晚上去构建特征。
数据预处理包括:
2.1 数值型
1. 幅度调整/归一化:python中会有一些函数比如preprocessing.MinMaxScaler()将幅度调整到 [0,1] 区间。
2.统计值:包括max, min, mean, std等。python中用pandas库序列化数据后,可以得到数据的统计值。
3.离散化:把连续值转成非线性数据。例如电商会有各种连续的价格表,从0.03到100元,假如以一元钱的间距分割成99个区间,用99维的向量代表每一个价格所处的区间,1.2元和1.6元的向量都是 [0,1,0,…,0]。pd.cut() 可以直接把数据分成若干段。
4.柱状分布:离散化后统计每个区间的个数做柱状图。
2.2 类别型
类别型一般是文本信息,比如颜色是红色、黄色还是蓝色,我们存储数据的时候就需要先处理数据。处理方法有:
1. one-hot编码,编码后得到哑变量。统计这个特征上有多少类,就设置几维的向量,pd.get_dummies()可以进行one-hot编码。
2. Hash编码成词向量
3. Histogram映射:把每一列的特征拿出来,根据target内容做统计,把target中的每个内容对应的百分比填到对应的向量的位置。优点是把两个特征联系起来。
2.3 时间型
时间型特征的用处特别大,既可以看做连续值(持续时间、间隔时间),也可以看做离散值(星期几、几月份)。
连续值
a) 持续时间(单页浏览时长)
b) 间隔时间(上次购买/点击离现在的时间)
离散值
a) 一天中哪个时间段(hour_0-23)
b) 一周中星期几(week_monday...)
2.4文本型
1. 词袋:文本数据预处理后,去掉停用词,剩下的词组成的list,在词库中的映射稀疏向量。Python中用CountVectorizer处理词袋.
2. 把词袋中的词扩充到n-gram:n-gram代表n个词的组合。比如“我喜欢你”、“你喜欢我”这两句话如果用词袋表示的话,分词后包含相同的三个词,组成一样的向量:“我 喜欢 你”。显然两句话不是同一个意思,用n-gram可以解决这个问题。如果用2-gram,那么“我喜欢你”的向量中会加上“我喜欢”和“喜欢你”,“你喜欢我”的向量中会加上“你喜欢”和“喜欢我”。这样就区分开来了。
3. 使用TF-IDF特征:TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF(t) = (词t在当前文中出现次数) / (t在全部文档中出现次数),IDF(t) = ln(总文档数/ 含t的文档数),TF-IDF权重 = TF(t) * IDF(t)。自然语言处理中经常会用到。
2.5统计型
加减平均:商品价格高于平均价格多少,用户在某个品类下消费超过平均用户多少,用户连续登录天数超过平均多少...
分位线:商品属于售出商品价格的多少分位线处
次序型:排在第几位
比例类:电商中,好/中/差评比例,你已超过全国百分之…的同学
2.6组合特征
1. 拼接型:简单的组合特征。例如挖掘用户对某种类型的喜爱,对用户和类型做拼接。正负权重,代表喜欢或不喜欢某种类型。
2. 模型特征组合:
- 用GBDT产出特征组合路径
- 组合特征和原始特征一起放进LR训练
三、特征提取
1. PCA主成分分析
2. LDA线性判别分析
3. ICA独立成分分析
四、特征选择
特征选择是剔除不相关或者冗余的特征,减少有效特征的个数,减少模型训练的时间,提高模型的精确度。特征提取通过特征转换实现降维,特征选择则是依靠统计学方法或者于机器学习模型本身的特征选择(排序)功能实现降维。特征选择是个重复迭代的过程,有时可能自己认为特征选择做的很好,但实际中模型训练并不太好,所以每次特征选择都要使用模型去验证,最终目的是为了获得能训练出好的模型的数据,提升模型的性能。下面介绍几个常用的方法
1. 运用统计学的方法,衡量单个特征与响应变量(Lable)之间的关系。
皮尔森相关系数(Pearson Correlation)
最大信息系数(MIC)
2. 基于机器学习模型的特征选择
线性模型和正则化
当特征和响应变量之间全部都是线性关系,并且特征之间均是比较独立的。可以尝试使用线性回归模型去做特征选择,因为越是重要的特征在模型中对应的系数就会越大,而跟输出变量越是无关的特征对应的系数就会越接近与0。在很多实际的数据当中,往往存在多个互相关联的特征,这时候模型就会变得不稳定,数据中细微的变化就可能导致模型的巨大变化(模型的变化本质上是系数,或者叫参数,可以理解成W),这会让模型的预测变得困难,这种现象也称为多重共线性。例如,假设我们有个数据集,它的真实模型应该是Y=X1+X2,当我们观察的时候,发现Y’=X1+X2+e,e是噪音。如果X1和X2之间存在线性关系,例如X1约等于X2,这个时候由于噪音e的存在,我们学到的模型可能就不是Y=X1+X2了,有可能是Y=2X1,或者Y=-X1+3X2。通过在模型中加入正则化项,也能起到特征选择的作用。L1正则化学到的是比较稀疏的模型,控制惩罚项系数alpha,会迫使那些弱的特征所对应的系数变为0,这个特征使得L1正则化成为一种很好的特征选择方法。L2正则化会使得系数的取值变得平均,对于关联特征,这意味则他们能够获得更加相近的对应系数。
随机森林模型
随机森林由多棵决策树构成,决策树中的每个节点,都是关于某个特征的条件,利用不纯度可以确定划分数据集的最优特征,对于分类问题,通常采用基尼不纯度或者信息增益,对于回归问题,通常采用方差或者最小二乘拟合。当训练决策树的时候,可以计算出每个特征减少了多少树的不纯度。对于一个决策树森林来说,可以算出每个特征平均减少了多少不纯度,并把它平均减少的不纯度作为特征选择的值。
另一种常用的特征选择方法就是直接度量每个特征对模型精确率的影响。主要思路是打乱每个特征的特征值顺序,并且度量顺序变动对模型的精确率的影响。很明显,对于不重要的变量来说,打乱顺序对模型的精确率影响不会太大,但是对于重要的变量来说,打乱顺序就会降低模型的精确率。
要记住:1、这种方法存在偏向,对具有更多类别的变量会更有利;2、对于存在关联的多个特征,其中任意一个都可以作为指示器(优秀的特征),并且一旦某个特征被选择之后,其他特征的重要度就会急剧下降,因为不纯度已经被选中的那个特征降下来了,其他的特征就很难再降低那么多不纯度了,这样一来,只有先被选中的那个特征重要度很高,其他的关联特征重要度往往较低。在理解数据时,这就会造成误解,导致错误的认为先被选中的特征是很重要的,而其余的特征是不重要的,但实际上这些特征对响应变量的作用确实非常接近的(这跟Lasso是很像的)。