11月28, 2018

lightGBM与FFM的模型组合

  • 在实际项目中数据和特征对最终的效果贡献是最大的,所以要花时间打造你的数据流,花时间多想一些特征,特征要算准。
  • ord2vec、FFM、XgBoost这些算法之所以能得到业界公认,是因为他们在各种数据集上都表现良好,而且对参数不太敏感。

LightGBM+FFM 用LightGBM根节点到每一个叶节点的路径作为一个组合特征,与原始特征拼接起来一同输给FFM去训练。FFM拿到的特征数等于所有叶节点的个数,一棵树有500个叶节点,lightgbm有300棵树,那一共就有150000个叶节点,维度很高,但实际上一个样本在一棵树上只会命中一个叶节点,所以一个样本上非0的维度等于树的个数。试验中我们只取了LightGBM的前100棵树(别忘了LightGBM在100棵树的时候AUC是0.78)。另外这里选用LightGBM而不是XGBoost,是因为LightGBM是leaf-wise生长的,max leaf是可以控制的(实际上每棵树都可以达到max leaf),这样在给所有叶节点编号时简单一些,仅此而已,并不是说XGBoost效果不好。

import xlearn
ffm_model = xlearn.create_ffm()
ffm_model.setTrain(ffm_train_file)
ffm_model.setValidate(ffm_test_file)
params = {
    'task': 'binary',  # 二分类。也可以设为reg
    'lr': 0.2,  # 学习率。adagrad的学习率是自适应的,这个学习率只是初始的学习率
    'lambda': 0,  # 正则系数
    'metric': 'auc',
    'opt': 'adagrad',  # sgd,ftlr。如果采用ftlr,则还可以指定其他参数alpha, beta, lambda_1, lambda_2
    'k':16,  # 隐因子个数。FFM中的k可以比FM中的k小很多
    'init': 0.5,  # 初始化参数
    'epoch': 50,
    'stop_window': 5,  # 连续5轮指标没有创建新高就停止迭代
}  # 不用设置核数,会自动把所有核都利用起来
# ffm_model.disableLockFree()
# ffm_model.setQuiet()#迭代时不做evaluation
# ffm_model.setOnDisk()#内存容不下所有训练数据时,数据存到磁盘,每次只加载一个block的数据,在params中可以设置block_size
ffm_model.setTXTModel(model_explain_file)
ffm_model.fit(params, ffm_model_file)

参考

本文链接:http://57km.cc/post/feature engineer with lightGBM.html

-- EOF --

Comments