之前比较相关的文章:
推荐系统中传统模型——LightGBM + LR融合
python - 机器学习lightgbm相关实践


1 深入FFM原理与实践

来自美团技术团队的,深入FFM原理与实践

FM和FFM模型是最近几年提出的模型,凭借其在数据量比较大并且特征稀疏的情况下,仍然能够得到优秀的性能和效果的特性,屡次在各大公司举办的CTR预估比赛中获得不错的战绩。美团技术团队在搭建DSP的过程中,探索并使用了FM和FFM模型进行CTR和CVR预估,并且取得了不错的效果。

  • 经过One-Hot编码之后,大部分样本数据特征是比较稀疏的。
  • One-Hot编码的另一个特点就是导致特征空间大。

同时通过观察大量的样本数据可以发现,某些特征经过关联之后,与label之间的相关性就会提高。
FFM主要用来预估站内的CTR和CVR,即一个用户对一个商品的潜在点击率和点击后的转化率。

CTR和CVR预估模型都是在线下训练,然后用于线上预测。两个模型采用的特征大同小异,主要有三类:用户相关的特征、商品相关的特征、以及用户-商品匹配特征。用户相关的特征包括年龄、性别、职业、兴趣、品类偏好、浏览/购买品类等基本信息,以及用户近期点击量、购买量、消费额等统计信息。商品相关的特征包括所属品类、销量、价格、评分、历史CTR/CVR等信息。用户-商品匹配特征主要有浏览/购买品类匹配、浏览/购买商家匹配、兴趣偏好匹配等几个维度。

为了使用FFM方法,所有的特征必须转换成“field_id:feat_id:value”格式,
field_id代表特征所属field的编号,feat_id是特征编号,value是特征的值

数值型的特征比较容易处理,只需分配单独的field编号,如用户评论得分、商品的历史CTR/CVR等。categorical特征需要经过One-Hot编码成数值型,编码产生的所有特征同属于一个field,而特征的值只能是0或1,如用户的性别、年龄段,商品的品类id等。除此之外,还有第三类特征,如用户浏览/购买品类,有多个品类id且用一个数值衡量用户浏览或购买每个品类商品的数量。这类特征按照categorical特征处理,不同的只是特征的值不是0或1,而是代表用户浏览或购买数量的数值。按前述方法得到field_id之后,再对转换后特征顺序编号,得到feat_id,特征的值也可以按照之前的方法获得。

2 案例

代码案例参考的是:wangru8080/gbdt-lr

其中FFM使用的是libffm库来训练,代码仅给出了构造数据输入的方法(FFMFormat),构造好输入格式后,直接使用libFFM训练即可。

这边libffm所需要的训练格式比较特别:

label field_id:feature_id:value field_id:feature_id:value field_id:feature_id:value …

  • field_id表示每一个特征域的id号
  • feature_id表示所有特征值的id号(可采用连续编码以及hash编码)
  • value:当特征域不是连续特征时,value=1,若为连续特征,value=该特征的值

对于pandas DataFrame格式数据来说:

label  category_feature  continuous_feature  vector_feature
=====  ================  ==================  ==============
0           x               1.1               1 2
1           y               1.2               3 4 5
0           x               2.2               6 7 8 9

本文仅有category_feature,continuous_feature,vector_feature。

wangru8080/gbdt-lr中,数据转化的代码为:

def FFMFormat(df, label, path, train_len, category_feature = [], continuous_feature = []):index = df.shape[0]train = open(path + 'train.ffm', 'w')test = open(path + 'test.ffm', 'w')feature_index = 0feat_index = {}for i in range(index):feats = []field_index = 0for j, feat in enumerate(category_feature):t = feat + '_' + str(df[feat][i])if t not in  feat_index.keys():feat_index[t] = feature_indexfeature_index = feature_index + 1feats.append('%s:%s:%s' % (field_index, feat_index[t], 1))field_index = field_index + 1for j, feat in enumerate(continuous_feature):feats.append('%s:%s:%s' % (field_index, feature_index, df[feat][i]))feature_index = feature_index + 1field_index = field_index + 1print('%s %s' % (df[label][i], ' '.join(feats)))if i < train_len:train.write('%s %s\n' % (df[label][i], ' '.join(feats)))else:test.write('%s\n' % (' '.join(feats)))train.close()test.close()

其中LightGBM 之后的叶子节点数据是离散的数据,

3 Kaggle: Pandas to libffm

网址:https://www.kaggle.com/mpearmain/pandas-to-libffm

import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
from sklearn.datasets import make_classification'''
Another CTR comp and so i suspect libffm will play its part, after all it is an atomic bomb for this kind of stuff.
A sci-kit learn inspired script to convert pandas dataframes into libFFM style data.The script is fairly hacky (hey thats Kaggle) and takes a little while to run a huge dataset.
The key to using this class is setting up the features dtypes correctly for output (ammend transform to suit your needs)Example below'''class FFMFormatPandas:def __init__(self):self.field_index_ = Noneself.feature_index_ = Noneself.y = Nonedef fit(self, df, y=None):self.y = ydf_ffm = df[df.columns.difference([self.y])]if self.field_index_ is None:self.field_index_ = {col: i for i, col in enumerate(df_ffm)}if self.feature_index_ is not None:last_idx = max(list(self.feature_index_.values()))if self.feature_index_ is None:self.feature_index_ = dict()last_idx = 0for col in df.columns:vals = df[col].unique()for val in vals:if pd.isnull(val):continuename = '{}_{}'.format(col, val)if name not in self.feature_index_:self.feature_index_[name] = last_idxlast_idx += 1self.feature_index_[col] = last_idxlast_idx += 1return selfdef fit_transform(self, df, y=None):self.fit(df, y)return self.transform(df)def transform_row_(self, row, t):ffm = []if self.y != None:ffm.append(str(row.loc[row.index == self.y][0]))if self.y is None:ffm.append(str(0))for col, val in row.loc[row.index != self.y].to_dict().items():col_type = t[col]name = '{}_{}'.format(col, val)if col_type.kind ==  'O':ffm.append('{}:{}:1'.format(self.field_index_[col], self.feature_index_[name]))elif col_type.kind == 'i':ffm.append('{}:{}:{}'.format(self.field_index_[col], self.feature_index_[col], val))return ' '.join(ffm)def transform(self, df):t = df.dtypes.to_dict()return pd.Series({idx: self.transform_row_(row, t) for idx, row in df.iterrows()})########################### Lets build some data and test ############################
### train, y = make_classification(n_samples=100, n_features=5, n_informative=2, n_redundant=2, n_classes=2, random_state=42)train=pd.DataFrame(train, columns=['int1','int2','int3','s1','s2'])
train['int1'] = train['int1'].map(int)
train['int2'] = train['int2'].map(int)
train['int3'] = train['int3'].map(int)
train['s1'] = round(np.log(abs(train['s1'] +1 ))).map(str)
train['s2'] = round(np.log(abs(train['s2'] +1 ))).map(str)
train['clicked'] = yffm_train = FFMFormatPandas()
ffm_train_data = ffm_train.fit_transform(train, y='clicked')
print('Base data')
print(train[0:10])
print('FFM data')
print(ffm_train_data[0:10])

推荐系统中传统模型——LightGBM + FFM融合相关推荐

  1. 【推荐实践】推荐系统中模型训练及使用流程的标准化

    文章作者:梁超 腾讯 高级工程师 编辑整理:Hoh Xil 内容来源:DataFun AI Talk 导读:本次分享的主题为推荐系统中模型训练及使用流程的标准化.在整个推荐系统中,点击率 ( CTR ...

  2. 【datawhale202206】pyTorch推荐系统:召回模型 DSSMYoutubeDNN

    小结 本次所涉及的模型用于推荐系统中的召回环节,该环节主要是一个embedding和筛选,本次所涉及的模型主要用于embedding过程. DSSM双塔模型是指,user和item的embedding ...

  3. Angel:深度学习在腾讯广告推荐系统中的实践

    分享嘉宾:郭跃超 腾讯 应用研究员 编辑整理:康德芬 出品平台:DataFunTalk 导读:Angel是腾讯自研的分布式高性能的机器学习平台,支持机器学习.深度学习.图计算以及联邦学习等场景.Ang ...

  4. 推荐系统中使用ctr排序的f(x)的设计-传统模型篇

    一. 什么是ctr? ctr即广告点击率,在推荐系统中,通常是按照ctr来对召回的内容子集进行排序,然后再结合策略进行内容的分发. 二. ctr预估模型的发展. ctr预估模型的公式:y = f(x) ...

  5. 全新的深度模型在推荐系统中的应用

    文章作者:周浩 第四范式 研究员 编辑整理:汪方野 出品平台:第四范式天枢.DataFunTalk 导读:如今,在电子商务.物联网等领域,推荐系统扮演着越来越重要的地位.如何根据用户的历史行为和项目的 ...

  6. 【实践】GPU在外卖场景推荐系统精排模型预估中的应用实践

    猜你喜欢0.2022年人才市场洞察及薪酬指南 1.[免费下载]2022年1月份热门报告 2.[实践]小红书推荐中台实践 3.微信视频号实时推荐技术架构分享 4.机器学习在B站推荐系统中的应用实践 5. ...

  7. FM模型及其在推荐系统中的应用

    推荐模型或者推荐场景下的排序模型,您脑子里第一个念头冒出的模型是哪个或哪几个? 如果你第一念头冒出来的仍然是SVD/矩阵分解啥的,那么明显你还停留在啃书本的阶段,实践经验不足:如果你第一念头是LR模型 ...

  8. 涨点利器:推荐系统中对双塔模型的各种改造升级(上)

    双塔各种改造方法概览: 大型推荐系统通常会将整个推荐链路拆分成召回.粗排.精排和重排等多个模块,以达到推荐效果和计算性能之间的平衡. 由于召回模型的候选item通常是海量的全库物品.粗排模型的候选it ...

  9. 【推荐实践】腾讯推荐系统中的深度匹配模型

    省时查报告-专业.及时.全面的行研报告库 省时查方案-专业.及时.全面的营销策划方案库 [免费下载]2022年6月热门报告合集从零开始了解推荐系统全貌机器学习在B站推荐系统中的应用实践微信视频号实时推 ...

最新文章

  1. mysql dml_详解MySQL---DDL语句、DML语句与DCL语句
  2. DCMTK学习之读取DcmDataset对应tag的值
  3. PHP中预定义的超全局数组
  4. 科大星云诗社动态20210520
  5. MMO游戏数值框架概述(偏模拟方向)
  6. hadoop/hbase/hive单机扩增slave
  7. smbclient用法
  8. 编译android模拟器,编译Android模拟器(make sdk),以及错误处理
  9. 看完《二舅》,我更内耗了
  10. jQuery-常用知识recap
  11. 计算机的文档库在哪哪里,电脑的word文档在哪里
  12. HTML作业简单注册界面
  13. Windows和iPad传输
  14. [DeeplearningAI笔记]序列模型3.3-3.5集束搜索
  15. 智慧城市赛道跑出独角兽,摘果子的为何是平安?
  16. 在 Domino 邮件服务器上配置 Verse On-Premises
  17. DataFrame添加数据
  18. SAP ABAP ME23N 采购订单打印输出
  19. 为什么要使用flowable工作流
  20. Chrome性能调优技巧

热门文章

  1. Keil下Debug随笔
  2. [Ajax] 如何使用Ajax传递多个复选框的值
  3. eclipse -- git 提示
  4. JS面向对象的程序设计
  5. 【译】UI设计基础(UI Design Basics)--启动与停止(Starting and Stopping)(五)
  6. Android TV 开发 (1)
  7. Web前端 — Bootstrap(2)
  8. 解决方案售前的知识管理解决方案
  9. selenium定位不到元素的原因。
  10. FPGA设计经验谈 —— 10年FPGA开发经验的工程师肺腑之言