0%

机器学习和深度学习在实践中的一些经验

使用GBDT算法构造特征

​ Facebook 2014年的文章介绍了通过GBDT解决LR的特征组合问题。[1]GBDT思想对于发现多种有区分性的特征和组合特征具有天然优势,可以用来构造新的组合特征。

​ 在这篇论文中提出可以使用GBDT各棵数输出节点的索引号来作为新的特征,对各个树渠道的索引号做one-hot编码,然后与原始的特征一起新的特征输入到模型中往往会起到不错的效果

实践情况

​ 1.本人使用这种方式在ctr预估中已经进行过实验,准确率提升2%

​ 2.美团在外卖预计送达时间预测中进行了实验,各个时段平均偏差减少了3%

(1) 超参数选择

a. 首先为了节点分裂时质量和随机性,分裂时所使用的最大特征数目为√n。
b. GBDT迭代次数(树的数量)。

  • 树的数量决定了后续构造特征的规模,与学习速率相互对应。通常学习速率设置较小,但如果过小,会导致迭代次数大幅增加,使得新构造的特征规模过大。
  • 通过GridSearch+CrossValidation可以寻找到最合适的迭代次数+学习速率的超参组合。
    c. GBDT树深度需要足够合理,通常在4~6较为合适。
  • 虽然增加树的数量和深度都可以增加新构造的特征规模。但树深度过大,会造成模型过拟合以及导致新构造特征过于稀疏。

(2)训练方案

​ 将训练数据随机抽样50%,一分为二。前50%用于训练GBDT模型,后50%的数据在通过GBDT输出样本在每棵树中输出的叶子节点索引位置,并记录存储,用于后续的新特征的构造和编码,以及后续模型的训练。如样本x通过GBDT输出后得到的形式如下:x → [25,20,22,….,30,28] ,列表中表示样本在GBDT每个树中输出的叶子节点索引位置。

​ 由于样本经过GBDT输出后得到的x → [25,20,22,….,30,28] 是一组新特征,但由于这组新特征是叶子节点的ID,其值不能直接表达任何信息,故不能直接用于ETA场景的预估。为了解决上述的问题,避免训练过程中无用信息对模型产生的负面影响,需要通过独热码(OneHotEncoder)的编码方式对新特征进行处理,将新特征转化为可用的0-1的特征。

​ 以图5中的第一棵树和第二棵树为例,第一棵树共有三个叶子节点,样本会在三个叶子节点的其中之一输出。所以样本在该棵树有会有可能输出三个不同分类的值,需要由3个bit值来表达样本在该树中输出的含义。图中样本在第一棵树的第一个叶子节点输出,独热码表示为{100};而第二棵树有四个叶子节点,且样本在第三个叶子节点输出,则表示为{0010}。将样本在每棵树的独热码拼接起来,表示为{1000010},即通过两棵CART树构造了7个特征,构造特征的规模与GBDT中CART树的叶子节点规模直接相关。

Wide&Deep在推荐中应用

【参考文献】

  1. He X, Pan J, Jin O, et al. Practical Lessons from Predicting Clicks on Ads at Facebook[C]. Proceedings of 20th ACM SIGKDD Conference on Knowledge Discovery and Data Mining. ACM, 2014: 1-9.