特征工程

前言

  机器学习领域的大神Andrew Ng(吴恩达)老师曾说“Coming up with features is difficult, time-consuming, requires expert knowledge. “Applied machine learning” is basically feature engineering. ”表达了特征工程是比较难,比较耗时的一个过程,需要较强的领域知识。我们也了解到,Kagglers比赛和天池比赛的冠军其实在比赛中并没有用到很高深的算法,大多数都是在特征工程这个环节做出了出色的工作,然后使用一些常见的算法,比如逻辑回归,就能得到出色的性能。可见特征工程在实际的实验研究中占着重要的位置。

  特征是数据中抽取出来的对结果预测有用的信息,可以是连续值(年龄)、文本。特征工程是使用专业背景知识(需要对场景、业务熟悉)和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。 

        更好的特征的作用(意义):只需要简单模型(例如CNN复杂模型,训练更困难,容易出错);更强的灵活性(如果用简单模型,加特征,很简单;复杂模型,加特征,是一个困难的事情);更好的结果。

 

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

  寒老师有多年的互联网从业经验,所以讲解的过程中结合了很多工业界的应用,更加的深入浅出。 
  数据采集:数据采集前需要明确采集哪些数据,一般的思路为:哪些数据对最后的结果预测有帮助?数据我们能够采集到吗?线上实时计算的时候获取是否快捷? 
  举例1:我现在要预测用户对商品的下单情况,或者我要给用户做商品推荐,那我需要采集什么信息呢? 
  -店家:店铺的评分、店铺类别…… 
  -商品:商品评分、购买人数、颜色、材质、领子形状…… 

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

        数据格式化:1)确定存储格式;时间,时间戳,第几天;

                                2)大多数情况下,需要关联非常多的Hive表和HDFS文件; 

   数据清洗: 数据清洗也是很重要的一步,机器学习算法大多数时候就是一个加工机器,至于最后的产品如何,取决于原材料的好坏。数据清洗就是要 去除脏数据,比如某些商品的刷单数据。 
  那么如何判定脏数据呢? 
  1) 简单属性判定:一个人身高3米+的人;一个人一个月买了10w的发卡。 
  2) 组合或统计属性判定:号称在米国却ip一直都是大陆的新闻阅读用户?你要判定一个人是否会买篮球鞋,样本中女性用户85%? 
  3) 补齐可对应的缺省值(映射关系数据项):不可信的样本丢掉, 缺省值极多的字段考虑不用。 

  数据采样:采集、清洗过数据以后,正负样本是不均衡的,大多数模型对正负样本比是敏感的(比如LR,决策树相关的模型要稍好)要进行数据采样。采样的方法有随机采样和分层抽样。但是随机采样会有隐患,因为可能某次随机采样得到的数据很不均匀,更多的是根据特征采用分层抽样(比如对不同年龄段抽不同数量出来)。

       正负样本不平衡处理办法? 
          正样本 >> 负样本, 且量都挺大 => downsampling(向下采样)
          正样本 >> 负样本, 量不大 =>
        1) 采集更多的数据
        2) 上采样/oversampling(比如图像识别中的镜像和旋转)
        3) 修改损失函数/loss function


2. 特征处理

  我们把特征工程的数据分别下面几种类型,分别来看一下其特点。

2.1 数值型

  1. 幅度调整/归一化:python中会有一些函数比如preprocessing.MinMaxScaler()将幅度调整到 [0,1] 区间。
  2. 统计值:包括max, min, mean, std(方差)等。python中用pandas库序列化数据后,可以得到数据的统计值。 
    这里写图片描述percentiles:分位数
  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编码成词向量: 
   bucket1、bucket2等是指一个个桶,代表word list·,可以代表某一主题(与给定的词集的相关程度有多高)。如上,把第一句话编码成了320这个向量。
  3. Histogram映射:把每一列的特征拿出来,根据target内容做统计,把target中的每个内容对应的百分比填到对应的向量的位置。优点是把两个特征联系起来。 
   这里写图片描述 
  上表中,我们来统计“性别与爱好的关系”,性别有“男”、“女”,爱好有三种,表示成向量 [散步、足球、看电视剧],分别计算男性和女性中每个爱好的比例得到:男[1/3, 2/3, 0],女[0, 1/3, 2/3]。即反映了两个特征的关系。

2.3 时间型

  时间型特征的用处特别大,既可以看做连续值(持续时间,单页游览时长、间隔时间,上次购买、点击离现在的时间),也可以看做离散值(一天中的哪个时间段,一周中星期几、几月份)。数据挖掘中经常会用时间作为重要特征,比如电商可以分析节假日和购物的关系,一天中用户喜好的购物时间等。

2.4 文本型

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



4*9:4,有四个样本;9,词向量有9个(维度)。

  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)。自然语言处理中经常会用到。

    word2vec:把“我”这个词映射到指定维度的向量上,不像one-hot(只有一个位置是1,其它位置是0),一般会把它映射到300+维。例1:“国王”映射成一个500维度的向量,“女王”映射成一个500维度的向量,这两个向量可做减法(求距离),会发现他们之间的距离和“男人”和“女人”之间的距离是一致的。例2:“柏林”和“德国”这个两个向量的距离和“东京”到“日本”的距离是差不多等同的。这个编码的好处是:知道一个词相对于另外一个词的关系。

      

2.5 统计型 

  历届的Kaggle/天池比赛, 天猫/京东排序和推荐业务线里模型用到的特征(与业务贴合度非常高)。统计的内容包括加减平均、分位线、次序型、比例类等。 
  比如“天池大数据之移动推荐算法大赛”中,给比赛选手两张表,介绍用户和商品信息,要求预测把哪些商品推荐给用户,用户最有可能购买。下面是两张表的内容: 
  这里写图片描述 
  下面举例说明选手们是怎么进行特征处理的: 
  这里写图片描述 
  这里写图片描述 
  可见,选手需要进行制定规则、数据清洗、各个种类的特征处理等,对特征的研究是非常细化的。

2.6 组合特征

  1. 拼接型:简单的组合特征。例如挖掘用户对某种类型的喜爱,对用户和类型做拼接。正负权重,代表喜欢或不喜欢某种类型。 
  - user_id&&category: 10001&&女裙 10002&&男士牛仔 
  - user_id&&style: 10001&&蕾丝 10002&&全棉   
  2. 模型特征组合: 
  - 用GBDT产出特征组合路径 

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


男性&&省份&&上网方式——》路径


3. 特征选择

  特征选择,就是从多个特征中,挑选出一些对结果预测最有用的特征。因为原始的特征中可能会有冗余(消耗计算性能)和噪声(负影响)。 
  特征选择和降维有什么区别呢?前者只踢掉原本特征里和结果预测关系不大的, 后者做特征的计算组合构成新特征(SVD或者PCA)。

3.1 过滤型

   - 方法:  评估单个特征和结果值之间的相关程度, 排序留下Top相关的特征部分。 
   - 评价指标:Pearson相关系数, 互信息, 距离相关度。 
   - 缺点:只评估了单个特征对结果的影响,没有考虑到特征之间的关联作用, 可能把有用的关联特征误踢掉。因此工业界使用比较少。 

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



selectKBeat:只留下指定个数的特征,如上面就是2个;SelectPercentile,按照比例留下特征。

3.2 包裹型

  - 方法:把特征选择看做一个特征子集搜索问题, 筛选各种特 
征子集, 用模型评估效果。 
  - 典型算法:“递归特征删除算法”(rescursive feature elimination algorithm)。 
  - 应用在逻辑回归的过程:用全量特征跑一个模型;根据线性模型的系数(体现相关性),删掉5-10%的弱特征,观察准确率/auc的变化;(循环第二步)逐步进行, 直至准确率/auc出现大的下滑停止。 
  - python包:RFE 
  

3.3 嵌入型

   - 方法:根据模型来分析特征的重要性,最常见的方式为用正则化方式来做特征选择。 
   - 举例:最早在电商用LR做CTR预估, 在3-5亿维的系数特征上用L1正则化的LR模型。上一篇介绍了L1正则化有截断作用,剩余2-3千万的feature, 意味着其他的feature重要度不够。 
   - python包:feature_selection.SelectFromModel选出权重不为0的特征。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值