《推荐系统笔记(十)》CTR预估以及一般算法介绍(GBDT+LR)
前言
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)相关推荐
- 推荐系统之:CTR预估模型知识汇总!
猜你喜欢 0.2021年10月热门报告盘点:<2021年轻人性生活报告>稳居榜首! 1.基于知识图谱的推荐系统总结 2.内容推荐策略产品经理的方法与实践 3.京东推荐算法精排技术实践 4. ...
- 推荐系统笔记(十三):SGL算法的代码实现
前言 本算法是在LightGCN的代码上的基础实现的,LightGCN的代码和原理参考我前面几篇的博客:推荐系统笔记(六):LightGCN代码实现_甘霖那的博客-CSDN博客 由于L ...
- 数据挖掘之CTR预估(FM算法)
CTR预估有一个传统的方法叫做FM. 源数据如下: 由于都是categorical类型数据,所以需要进行one-hot编码转化为数值型 这里会发现数据变得很稀疏,这在现实问题中是十分常见的情况,并且o ...
- 推荐系统-排序算法:GBDT+LR
1. GBDT + LR 是什么 本质上GBDT+LR是一种具有stacking思想的二分类器模型,所以可以用来解决二分类问题.这个方法出自于Facebook 2014年的论文 Practical L ...
- 数据结构与算法笔记 —— 十大经典排序及算法的稳定性
一.十大经典排序算法 排序算法是<数据结构与算法>中最基本的算法之一. 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全 ...
- 最优化学习笔记(十九)——拟牛顿法(5)BFGS算法
一.BFGS算法的更新公式 为了推导BFGS算法,需要用到对偶或者互补的概念,前边已经讨论过hessian矩阵逆矩阵的近似矩阵需要满足以下条件: Hk+1Δg(i)=Δx(i)0≤i≤k \bolds ...
- 最优化学习笔记(十八)——拟牛顿法(4)DFP算法
秩2算法可以保证在任意第kk步迭代下, 只要一维搜索是精确的,近似矩阵Hk\boldsymbol{H}_k就是正定的. DFP算法 令k=0k=0,选择初始点x(0)\boldsymbol{x}^{( ...
- 《推荐系统笔记(三)》Adaboost算法 —— 弱分类器组合成强分类器的方法
前言 我们将介绍将弱分类器组合成强分类器的算法,Adaboost算法,以及该算法有效的证明. 对于这种提升方法,我们有 每次迭代加大误分类点的权重,这样下次生成的弱分类器能够更可能将该误分类点分类正确 ...
- 机器学习笔记 十四:k-近邻算法(kNN)的实现
目录 1. 什么是机器学习 2. k-近邻算法(kNN) 2.1 kNN的原理 2.2 k-近邻算法的一般流程 2.3 kNN伪代码 3. 函数介绍 3.1 get()函数:利用字典统计列表中元素出现 ...
最新文章
- CentOS 6 IPv6 关闭方法
- linux查找日期目录,详解Linux查找目录下的按时间过滤的文件
- cve-2017-12629 apache solr xxe rce 漏洞分析
- springmvc基础入门,你确定你真的理解_双亲委派_了吗?
- 不使用vue-cli来创建项目
- bzoj4773 负环
- 2020年周记(1/50)
- 双向绑定v-bind
- LeetCode 1290. 二进制链表转整数
- SCCM 2016 配置管理系列(Part4)
- sendmail邮件服务器的基本建立过程
- 服务器修改重生点,服务器设置重生点
- 8月29日见!卢伟冰:Redmi首款互联网电视将采用70英寸巨屏
- python实践作业_实践-python实现假设检验
- java. 三个人比赛怎么写_两个乒乓球队进行比赛,找出三队赛手的名单
- 让人心烦的TIME_WAIT状态与SO_REUSEADDR选项
- windows电脑上一些软件如画图/记事本变成了英文
- 赤兔oracle恢复软件 收费,赤兔Oracle数据库恢复软件下载 v11.6官方版-下载啦
- 超出ipc连接数范围_终端服务器超出了最大允许连接数的解决办法 (全文)
- 纸短情长用计算机破出来的数字,纸短情长简谱数字大全 一看就会的简谱