Press "Enter" to skip to content

机器学习:特征工程工作流程

前言

 

特征是数据中抽取出来的对结果预测有用的信息,可以是文本或者数据。特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。过程包含了特征提取、特征构建、特征选择等模块。

 

特征工程的目的是筛选出更好的特征,获取更好的训练数据。因为好的特征具有更强的灵活性,可以用简单的模型做训练,更可以得到优秀的结果。“工欲善其事,必先利其器”,特征工程可以理解为利其器的过程。互联网公司里大部分复杂的模型都是极少数的数据科学家在做,大多数工程师们做的事情基本是在数据仓库里搬砖,不断地数据清洗,再一个是分析业务不断地找特征。 例如,某广告部门的数据挖掘工程师,2周内可以完成一次特征迭代,一个月左右可以完成模型的小优化,来提升auc。

 

1. 数据采集 / 清洗 / 采样

 

数据采集:数据采集前需要明确采集哪些数据,一般的思路为:哪些数据对最后的结果预测有帮助?数据我们能够采集到吗?线上实时计算的时候获取是否快捷?

 

举例1:我现在要预测用户对商品的下单情况,或者我要给用户做商品推荐,那我需要采集什幺信息呢?

 

-店家:店铺的评分、店铺类别……

 

-商品:商品评分、购买人数、颜色、材质、领子形状……

 

-用户:历史信息(购买商品的最低价最高价)、消费能力、商品停留时间……

 

数据清洗: 数据清洗也是很重要的一步,机器学习算法大多数时候就是一个加工机器,至于最后的产品如何,取决于原材料的好坏。数据清洗就是要去除脏数据,比如某些商品的刷单数据。

 

那幺如何判定脏数据呢?

 

1) 简单属性判定:一个人身高3米+的人;一个人一个月买了10w的发卡。

 

2) 组合或统计属性判定:号称在米国却ip一直都是大陆的新闻阅读用户?你要判定一个人是否会买篮球鞋,样本中女性用户85%?

 

3) 补齐可对应的缺省值:不可信的样本丢掉,缺省值极多的字段考虑不用。

 

数据采样:采集、清洗过数据以后,正负样本是不均衡的,要进行数据采样。采样的方法有随机采样和分层抽样。但是随机采样会有隐患,因为可能某次随机采样得到的数据很不均匀,更多的是根据特征采用分层抽样。

 

正负样本不平衡处理办法:

 

正样本 >> 负样本,且量都挺大 => downsampling

 

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

 

1)采集更多的数据

 

2)上采样/oversampling(比如图像识别中的镜像和旋转)

 

3)修改损失函数/loss function (设置样本权重)

 

2. 特征处理

 

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中的每个内容对应的百分比填到对应的向量的位置。优点是把两个特征联系起来。

 

 

上表中,我们来统计“性别与爱好的关系”,性别有“男”、“女”,爱好有三种,表示成向量 [散步、足球、看电视剧],分别计算男性和女性中每个爱好的比例得到:男[1/3, 2/3, 0],女[0, 1/3, 2/3]。即反映了两个特征的关系。

 

2.3 时间型

 

时间型特征的用处特别大,既可以看做连续值(持续时间、间隔时间),也可以看做离散值(星期几、几月份)。

 

连续值

 

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

 

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

 

离散值

 

a) 一天中哪个时间段(hour_0-23)

 

b) 一周中星期几(week_monday…)

 

c) 一年中哪个星期

 

d) 一年中哪个季度

 

e) 工作日/周末

 

数据挖掘中经常会用时间作为重要特征,比如电商可以分析节假日和购物的关系,一天中用户喜好的购物时间等。

 

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. 拼接型:简单的组合特征。例如挖掘用户对某种类型的喜爱,对用户和类型做拼接。正负权重,代表喜欢或不喜欢某种类型。

 

– user_id&&category: 10001&&女裙 10002&&男士牛仔

 

– user_id&&style: 10001&&蕾丝 10002&&全棉

 

2. 模型特征组合:

 

– 用GBDT产出特征组合路径

 

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

 

3. 特征选择

 

特征选择,就是从多个特征中,挑选出一些对结果预测最有用的特征。因为原始的特征中可能会有冗余和噪声。

 

特征选择和降维有什幺区别呢?前者只踢掉原本特征里和结果预测关系不大的, 后者做特征的计算组合构成新特征。

 

3.1 过滤型

 

– 方法:? 评估单个特征和结果值之间的相关程度, 排序留下Top相关的特征部分。

 

– 评价方式:Pearson相关系数, 互信息, 距离相关度。

 

– 缺点:只评估了单个特征对结果的影响,没有考虑到特征之间的关联作用, 可能把有用的关联特征误踢掉。因此工业界使用比较少。

 

– python包:SelectKBest指定过滤个数、SelectPercentile指定过滤百分比。

 

3.2 包裹型

 

– 方法:把特征选择看做一个特征子集搜索问题, 筛选各种特征子集, 用模型评估效果。

 

– 典型算法:“递归特征删除算法”。

 

– 应用在逻辑回归的过程:用全量特征跑一个模型;根据线性模型的系数(体现相关性),删掉5-10%的弱特征,观察准确率/auc的变化;逐步进行, 直至准确率/auc出现大的下滑停止。

 

– python包:RFE

 

3.3 嵌入型

 

– 方法:根据模型来分析特征的重要性,最常见的方式为用正则化方式来做特征选择。

 

– 举例:最早在电商用LR做CTR预估, 在3-5亿维的系数特征上用L1正则化的LR模型。上一篇介绍了L1正则化有截断作用,剩余2-3千万的feature, 意味着其他的feature重要度不够。

 

– python包:feature_selection.SelectFromModel选出权重不为0的特征。

 

首先看下总图:

 

 

4.模型选择:

 

1)交叉验证

 

交叉验证集做参数/模型选择

 

测试集只做模型效果评估

 

2)K折交叉验证:

 

 

在Python中有这样的函数用于在交叉验证过程中对参数的选择

 

 

5.模型的状态

 

a. 过拟合:过拟合(overfitting)是指在模型参数拟合过程中的问题,由于训练数据包含抽样误差,训练时,复杂的模型将抽样误差也考虑在内,将抽样误差也进行了很好的拟合。

 

b. 欠拟合 :模型在训练过程中没有训练充分,导致模型很好的表现出数据原有性质。

 

 

模型状态验证工具:学习曲线

 

通过在给定训练样本增加的时候,测试机和训练集中准确率的变化趋势可以看到现在模型的状态。

 

 

怎幺防止过拟合呢?

 

获取更多数据: 让模型「看见」尽可能多的「例外情况」,它就会不断修正自己,从而得到更好的结果;

 

a)从数据源头采集更多数据

 

b) 通过一定规则扩充数据集,如加入随机噪声,图的旋转平移缩放

 

c) 采样技术

 

减小模型的复杂度:减少数的棵树,网络层数等;

 

减少训练时间 Early stopping:提前终止(当验证集上的效果变差的时候);

 

加入正则项 / 增大正则化系数:这类方法直接将权值的大小加入到 Cost 里,在训练的时候限制权值变大;

 

使用集成学习:综合多个学习器的结果;

 

Dropout:类似于集成学习,是的网络结构发生了改变

 

怎样防止欠拟合? (一般很少出现)

 

找更多的特征

 

减小正则化系数

 

6.模型分析

 

1)线下模型权重分析:线性或者线性kernel的model

 

Linear Regression

 

Logistic Regression

 

LinearSVM

 

2)对权重绝对值高/低的特征

 

做更细化的工作

 

特征组合

 

3) Bad-case分析

 

分类问题

 

哪些训练样本分错了?

 

我们哪部分特征使得它做了这个判定?

 

这些bad cases有没有共性

 

是否有还没挖掘的特性

 

回归问题

 

哪些样本预测结果差距大,为什幺?

 

7.模型融合

 

1)平均法

 

1. 简单平均法(simple averaging)

 

 

2. 加权平均法(weighted averaging)

 

 

注意:必须使用非负权重才能确保集成性能优于单一最佳个体学习器,因此在集成学习中一般对学习器的权重法以非负约束。

 

简单平均法其实是加权平均法令w=1/T的特例。集成学习中的各种结合方法其实都可以视为加权平均法的特例或变体。加权平均法的权重一般是从训练数据中学习而得。由于现实任务中样本不充分或存在噪声,使得学得的权重不完全可靠,有时加权平均法未必一定优于简单平均法。

 

2)投票法

 

对分类任务来说,最常见的结合策略使用投票法

 

1. 绝对多数投票法(majority voting):即若某标记得票过半数,则预测为该标记;否则拒绝预测

 

2. 相对多数投票法(plurality voting):即预测为得票最多的标记,若同时有多个标记获最高票,则从中随机选取一个。

 

3. 加权投票法(weighted voting):绝对多数投票法在可靠性要求较高的学习任务中是一个很好的机制,若必须提供结果,则使用相对多数投票法。

 

类标记:使用类标记的投票亦称“硬投票”(hard voting)。

 

类概率:使用类概率的投票亦称“软投票”(soft voting)。

 

以上两种不能混用,若基学习器产生分类置信度,例如支持向量机的分类间隔值,需使用一些技术如Platt缩放、等分回归、等进行校准后才能作为类概率使用。若基学习器的类型不同,则其类概率值不能直接进行比较,可将类概率输出转化为类标记输出然后再投票。

 

3)Stacking:Stacking方法是指训练一个模型用于组合其他各个模型。首先我们先训练多个不同的模型,然后把之前训练的各个模型的输出为输入来训练一个模型,以得到一个最终的输出。理论上,Stacking可以表示上面提到的两种Ensemble方法,只要我们采用合适的模型组合策略即可。但在实际中,我们通常使用logistic回归作为组合策略。

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注