前言

CTR预估是推荐系统中重要的问题,根据历史数据,我们需要预测用户是否点击。CTR预估同样可以运用到广告中,预测广告的点击率等。

CTR数据形式

CTR预估问题的数据形式一般是这样的:

  • 列名:特征1,特征2,…,特征n,是否点击

这其实也是二分类问题,预测是否点击。

对于CTR这种二分类问题,我们可以用LR模型。由于LR模型是线性模型,我们需要对原始数据进行特征工程的时候,提取出原始特征的高阶组合特征。

比如,当特征有 国家 和 节日 这两项时,显然,不同国家在不同节日里,用户对某种商品的需求是不同的,或者说点击是不同的。这就意味着,用户点击明显受到 国家+节日 这个组合特征的影响。

考虑到人工提取特征的效率和费用,我们期望模型能够自动学习到高阶组合特征。FM算法是一个选择,它能够以较小的计算代价学习到二阶组合特征,但对于更高阶的特征,FM学习起来会很费力。

这里,我们有两种办法,

  • 使用GBDT来提取非线性特征,再用LR训练
  • 使用深度学习网络(DNN)来学习非线性特征

GBDT+LR

一般步骤是这样的,

  • 将数据分为训练集和测试集
  • 将训练集进一步分为GBDT训练集和LR训练集,防止过拟合
  • 利用训练过的GBDT模型,将LR训练集数据转化为新的特征向量(GBDT是一系列树的集合,将一个数据丢进去,最终都会落进每一棵树的某个叶节点,记录这些叶节点位置合并成一个向量,这就是这个数据被转化成的新的特征向量)
  • 对新的特征向量进行one-hot编码,为训练LR模型做准备
  • 利用LR模型进行训练
  • 做测试和预测的时候,同样要用上面训练好的GBDT做特征转化,然后再用LR模型给出预测结果

给一个简单例子吧。

# 第三方库
import pandas as pd
import numpy as np
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import roc_curve, roc_auc_score
from sklearn.preprocessing import OneHotEncoder
from sklearn.model_selection import KFold, train_test_split
import matplotlib.pyplot as plt
# 生成二分类数据,20万条数据,20个特征
X, y = make_classification(n_samples=200000, n_features=20, n_classes=2)
data = pd.DataFrame(X, columns=list('abcdefghijklmnopqrst'))
data['label'] = y
# 训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(data.iloc[:, :-1], data.iloc[:, -1], test_size=0.2)# 进一步将训练集分成GBDT训练集和LR训练集
X_train_gbdt, X_train_lr, y_train_gbdt, y_train_lr = train_test_split(X_train, y_train, test_size=0.5)
# 训练gbdt,确定最重要的参数,
#树的数量:n_estimators,
#树深度:max_depth,
#内部节点的样本数:min_samples_split,
#叶节点的样本数:min_samples_leaf
gbdt = GradientBoostingClassifier(n_estimators=20, max_depth=3, min_samples_split=3, min_samples_leaf=2)
# 训练好模型
gbdt.fit(X_train_gbdt, y_train_gbdt)
# gbdt得到的训练集中数据转化为对应特征向量
# 每一行对应一个数据
# 每一行向量是20维的,对应着gbdt的20棵树,输入x进入树后,落在叶子结点上,每一列数字就是第几个叶子结点
np.reshape(gbdt.apply(X_train_gbdt), (-1, 20))
# 输出
array([[ 3.,  3.,  3., ...,  4.,  4.,  4.],[ 7.,  7.,  7., ...,  4.,  6.,  7.],[10., 10., 10., ..., 14., 13., 10.],...,[ 3.,  4.,  3., ...,  7.,  4.,  4.],[10., 10., 10., ..., 10., 13., 10.],[10., 10., 10., ..., 10., 13., 10.]])
# 训练OneHotEncoder
oh = OneHotEncoder()
oh.fit(np.reshape(gbdt.apply(X_train_gbdt), (-1, 20)))
# 开始对LR训练集进行特征转换
# 对转换之后的训练集,用lr训练
lr = LogisticRegression(max_iter=1000)
lr.fit(oh.transform(np.reshape(gbdt.apply(X_train_lr), (-1, 20))), y_train_lr)
# 现在,lr已经训练完毕
# 现在对测试集进行测试
# 我们依然需要先对测试集进行gbdt的特征转换
pred = lr.predict_proba(oh.transform(np.reshape(gbdt.apply(X_test), (-1, 20))))[:,1]

为了评测预测效果,对于二分类问题,我们通常用Auc值。这种评测指标在博客最后面会介绍。

# 考虑roc曲线和auc值
fpr, tpr, thresholds = roc_curve(y_test, pred)# 把roc曲线画出来
plt.plot(fpr, tpr)
plt.xlabel('False positive rate')
plt.ylabel('True positive rate')
plt.show()print('Auc值为', roc_auc_score(y_test, pred))

DNN

为了提取高阶特征,我们还可以引入DNN。DNN天然就具有提取非线性特征的作用,因此,将DNN引入到CTR预估中就显得较为自然。

离散的特征经过one-hot编码之后,会非常稀疏且维数庞大,为了避免进入DNN后维度爆炸,需要进行dense embedding,将这样的特征变成稠密的规模较小的特征向量。一个方法就是利用FM,将每一个特征对应着一个k维隐向量,在一个filed内,只会有一个这样的k为隐向量,然后将所有field内的隐向量合并起来,作为embedding之后的结果。

  • FNN:通过上面的dense embedding之后,直接将特征向量送入DNN中,得到预测值
  • Wide & Deep:Deep部分和FNN一样,Wide部分与LR一样,最终将两部分结果综合起来考虑
  • DeepFM:将Wide部分换成FM

ROC曲线和AUC值

对于二分类问题,我们通常用auc值来说明好坏。Auc值是Roc曲线与横轴之间围成区域的面积,处于0到1之间,越是接近于1,说明模型越好;而越是接近0,则模型越差。

我们首先介绍ROC曲线。在二分类问题中,我们给出下面四个值,

  • FP:将负样本判断为正的数量
  • FN:将正样本判断为负的数量
  • TP:将正样本判断为正的数量
  • TN:将负样本判断为负的数量

有了上述定义,我们可以给出ROC曲线的横纵轴,

  • 横轴:FP rate,即fpr=FPFP+TNfpr = \frac{FP}{FP+TN}fpr=FP+TNFP,将负样本判断为正的概率
  • 纵轴:TP rate,即tpr=TPTP+FNtpr=\frac{TP}{TP+FN}tpr=TP+FNTP,将正样本判断为正的概率

显然,tpr越高越好,fpr越低越好。为了做出曲线,我们往往这样做,根据模型预测到的判断为正的概率,将整个测试集按照概率从大到小排序,我们的thresholds就依次选取这些概率。对于大于thresholds的概率,我们判断为正,小于thresholds的概率,我们判断为负。

举个例子,将样本按照预测为正的概率排序,

  • 样本类别,为正的概率
  • 正,0.9
  • 正,0.8
  • 负,0.7
  • 正,0.6
  • 负,0.5

依次选择这些概率作为threshold,并计算tpr和fpr,

  • 阈值,tpr,fpr
  • 0.9,1/3,0/2=0
  • 0.8,2/3,0/2=0
  • 0.7,2/3,1/2
  • 0.6,3/3=1,1/2
  • 0.5,3/3=1,2/2=1

依次连接这些点,就可以作出ROC曲线。

《推荐系统笔记(十)》CTR预估以及一般算法介绍(GBDT+LR)相关推荐

  1. 推荐系统之:CTR预估模型知识汇总!

    猜你喜欢 0.2021年10月热门报告盘点:<2021年轻人性生活报告>稳居榜首! 1.基于知识图谱的推荐系统总结 2.内容推荐策略产品经理的方法与实践 3.京东推荐算法精排技术实践 4. ...

  2. 推荐系统笔记(十三):SGL算法的代码实现

    前言         本算法是在LightGCN的代码上的基础实现的,LightGCN的代码和原理参考我前面几篇的博客:推荐系统笔记(六):LightGCN代码实现_甘霖那的博客-CSDN博客 由于L ...

  3. 数据挖掘之CTR预估(FM算法)

    CTR预估有一个传统的方法叫做FM. 源数据如下: 由于都是categorical类型数据,所以需要进行one-hot编码转化为数值型 这里会发现数据变得很稀疏,这在现实问题中是十分常见的情况,并且o ...

  4. 推荐系统-排序算法:GBDT+LR

    1. GBDT + LR 是什么 本质上GBDT+LR是一种具有stacking思想的二分类器模型,所以可以用来解决二分类问题.这个方法出自于Facebook 2014年的论文 Practical L ...

  5. 数据结构与算法笔记 —— 十大经典排序及算法的稳定性

    一.十大经典排序算法 排序算法是<数据结构与算法>中最基本的算法之一. 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全 ...

  6. 最优化学习笔记(十九)——拟牛顿法(5)BFGS算法

    一.BFGS算法的更新公式 为了推导BFGS算法,需要用到对偶或者互补的概念,前边已经讨论过hessian矩阵逆矩阵的近似矩阵需要满足以下条件: Hk+1Δg(i)=Δx(i)0≤i≤k \bolds ...

  7. 最优化学习笔记(十八)——拟牛顿法(4)DFP算法

    秩2算法可以保证在任意第kk步迭代下, 只要一维搜索是精确的,近似矩阵Hk\boldsymbol{H}_k就是正定的. DFP算法 令k=0k=0,选择初始点x(0)\boldsymbol{x}^{( ...

  8. 《推荐系统笔记(三)》Adaboost算法 —— 弱分类器组合成强分类器的方法

    前言 我们将介绍将弱分类器组合成强分类器的算法,Adaboost算法,以及该算法有效的证明. 对于这种提升方法,我们有 每次迭代加大误分类点的权重,这样下次生成的弱分类器能够更可能将该误分类点分类正确 ...

  9. 机器学习笔记 十四:k-近邻算法(kNN)的实现

    目录 1. 什么是机器学习 2. k-近邻算法(kNN) 2.1 kNN的原理 2.2 k-近邻算法的一般流程 2.3 kNN伪代码 3. 函数介绍 3.1 get()函数:利用字典统计列表中元素出现 ...

最新文章

  1. CentOS 6 IPv6 关闭方法
  2. linux查找日期目录,详解Linux查找目录下的按时间过滤的文件
  3. cve-2017-12629 apache solr xxe rce 漏洞分析
  4. springmvc基础入门,你确定你真的理解_双亲委派_了吗?
  5. 不使用vue-cli来创建项目
  6. bzoj4773 负环
  7. 2020年周记(1/50)
  8. 双向绑定v-bind
  9. LeetCode 1290. 二进制链表转整数
  10. SCCM 2016 配置管理系列(Part4)
  11. sendmail邮件服务器的基本建立过程
  12. 服务器修改重生点,服务器设置重生点
  13. 8月29日见!卢伟冰:Redmi首款互联网电视将采用70英寸巨屏
  14. python实践作业_实践-python实现假设检验
  15. java. 三个人比赛怎么写_两个乒乓球队进行比赛,找出三队赛手的名单
  16. 让人心烦的TIME_WAIT状态与SO_REUSEADDR选项
  17. windows电脑上一些软件如画图/记事本变成了英文
  18. 赤兔oracle恢复软件 收费,赤兔Oracle数据库恢复软件下载 v11.6官方版-下载啦
  19. 超出ipc连接数范围_终端服务器超出了最大允许连接数的解决办法 (全文)
  20. 纸短情长用计算机破出来的数字,纸短情长简谱数字大全 一看就会的简谱

热门文章

  1. Anaconda——复制Conda的虚拟环境
  2. 【less-7】sqli-labs靶场第七关(类似less-5)
  3. 给定一个9位数字的ISBN,求其校验位
  4. 元素增删事件DOMNodeInserted和DOMNodeRemoved
  5. input中radio对象的使用、获取方法
  6. 项目学习类容,日期处理,SQL语句查询,hashtable的运用,R语言包的环境配置
  7. ROS学习笔记三:创建ROS软件包
  8. 项目之爬虫入门(豆瓣TOP250)
  9. centos 云服务器部署Node.js项目
  10. 面试—每日一题(1)