推荐算法(9) CTR预测

一、CTR介绍
  在计算广告中,CTR是非常重要的一环。对于特征组合来说,业界通用的做法主要有两大类:FM系列和Tree系列。
  在传统的线性模型中,每个特征都是独立的,如果需要考虑特征与特征之间的相互作用,可能需要人工对特征进行交叉组合。非线性SVM可以对特征进行核变换,但是在特征高度稀疏的情况下,并不能很好的进行学习。现在有很多分解模型可以学习到特征之间的交互隐藏关系,基本上每个模型都只适用于特定的输入和场景。推荐系统是一个高度系数的数据场景,由此产生了FM系列算法。
  在推荐系统和计算广告业务中,点击率CTR(click-through rate)和转化率CVR(conversion rate)是衡量流量转化的两个关键指标。准确的估计CTR、CVR对于提高流量的价值,增加广告及电商收入有重要的指导作用。业界常用的方法有人工特征工程 + LR(Logistic Regression)、GBDT(Gradient Boosting Decision Tree) + LR、FM模型。

二、FM
Ⅰ 推导
1.LR中对特征进行单纯的线性组合,再通过sigmoid()结合。(没有考虑特征间的组合信息)

2.通过one-hot编码之后,数据过于稀疏。但是有的特征之间的组合是有意义的,例如,“男性”与“篮球”、“女性”与“化妆品”这样的关联特征。
这里加上了多项式特征xixj
在这里插入图片描述
其中, n代表样本的特征数量,xi是第i个特征的值, w0,wi,wij是模型参数。

3.但是计算wij的时候它的复杂度是(n*n-1)/2,复杂度太大了。 用一个矩阵的转置和矩阵的乘积,来代表整个大的W矩阵。
(1)我们想到wij是个实对称矩阵。根据实对称矩阵的性质:
任意的N×N实对称矩阵都有N个线性无关的特征向量。并且这些特征向量都可以正交单位化而得到一组正交且模为1的向量。故实对称矩阵A可被分解成:

\vec{A}=\vec{Q}\vec{\Lambda} \vec{Q}^{T}

其中Q为正交矩阵,为实对角矩阵。
(2)类似地,所有二次项参数Wij可以组成一个对称阵W,则W可以分解为W=VTV.。V的第j列Vj便是第j维特征Xj的隐向量。换句话说,特征分量 Xi和Xj的交叉项系数就等于Xi对应的隐向量与Xj对应的隐向量的内积,即每个参数w_{ij}=\left \langle v_{i}, ,这就是FM模型的核心思想

得到目标式:
在这里插入图片描述

Ⅱ 求解
上述是一个通用的拟合方程,可以采用不同的损失函数用于解决回归、二元分类等问题,比如可以采用MSE(Mean Square Error)损失函数来求解回归问题,也可以采用Hinge/Cross-Entropy 损失来求解分类问题。当然,在进行二元分类时,FM的输出需要经过sigmoid变换,这与Logistic回归是一样的。直观上看,FM的复杂度是 。但是,通过公式(3)的等式,FM的二次项可以化简,其复杂度可以优化到。由此可见,FM可以在线性时间对新样本作出预测。
在这里插入图片描述
在这里插入图片描述

三、FFM(在FM的基础上,对特征加上field熟悉,比如:某几个属性是与男人相关的,就把这几个属性放在feild里面)
1.理论
在CTR预估中,通常会遇到one-hot类型的变量,会导致数据特征的稀疏。未解决这个问题,FFM在FM的基础上进一步改进,在模型中引入类别的概念,即field。将同一个field的特征单独进行one-hot,因此在FFM中,每一维特征都会针对其他特征的每个field,分别学习一个隐变量,该隐变量不仅与特征相关,也与field相关。

假设样本的n个特征属于f个field,那么FFM的二次项有nf个隐向量。而在FM模型中,每一维特征的隐向量只有一个。FM可以看做FFM的特例,把所有特征都归属到一个field的FFM模型。其模型方程为:
在这里插入图片描述
如果隐向量的长度为k,那么FFM的二次参数有nfk个,远多于FM模型的nk个。

2.实现
损失函数
FFM将问题定义为分类问题,使用的是logistic loss,同时加入正则项
在这里插入图片描述
梯度下降
梯度下降方法有很多种,根据为提高效率分别衍生了批量梯度下降,随机梯度下降及小批量梯度下降,根据需求选择即可

3.应用
在DSP或者推荐场景中,FFM主要用来评估站内的CTR和CVR,即一个用户对一个商品的潜在点击率和点击后的转化率。
CTR和CVR预估模型都是在线下训练,然后线上预测。两个模型采用的特征大同小异,主要分三类:
用户相关的特征
年龄、性别、职业、兴趣、品类偏好、浏览/购买品类等基本信息,以及用户近期点击量/购买量/消费额等统计信息

商品相关的特征
商品所属品类、销量、价格、评分、历史CTR/CVR等信息

用户-商品匹配特征
浏览/购买品类匹配、浏览/购买商家匹配、兴趣偏好匹配等

4.细节
样本归一化:FFM默认是进行样本数据的归一化,即 为真;若此参数设置为假,很容易造成数据inf溢出,进而引起梯度计算的nan错误。因此,样本层面的数据是推荐进行归一化的。
特征归一化:CTR/CVR模型采用了多种类型的源特征,包括数值型和categorical类型等。但是,categorical类编码后的特征取值只有0或1,较大的数值型特征会造成样本归一化后categorical类生成特征的值非常小,没有区分性。例如,一条用户-商品记录,用户为“男”性,商品的销量是5000个(假设其它特征的值为零),那么归一化后特征“sex=male”(性别为男)的值略小于0.0002,而“volume”(销量)的值近似为1。特征“sex=male”在这个样本中的作用几乎可以忽略不计,这是相当不合理的。因此,将源数值型特征的值归一化到 是非常必要的。
省略零值特征:从FFM模型的表达式可以看出,零值特征对模型完全没有贡献。包含零值特征的一次项和组合项均为零,对于训练模型参数或者目标值预估是没有作用的。因此,可以省去零值特征,提高FFM模型训练和预测的速度,这也是稀疏样本采用FFM的显著优势。

四、DeepFM
1.FM的结构:
在这里插入图片描述

2.DNN结构(全连接神经网络)
在这里插入图片描述
3.DeepFM
在这里插入图片描述
DeepFM目的是同时学习低阶和高阶的特征交叉,主要由FM和DNN两部分组成,底部共享同样的输入。模型可以表示为: 在这里插入图片描述
FM部分
原理如上,数学表达为:
在这里插入图片描述
Deep部分
深度部分是一个前馈神经网络,与图像或语音类的输入不同,CTR的输入一般是极其稀疏的,因此需要重新设计网络结构。在第一层隐藏层之前,引入一个嵌入层来完成输入向量压缩到低位稠密向量:

嵌入层的结构如上图所示,有两个有趣的特性:
1) 尽管不同field的输入长度不同,但是embedding之后向量的长度均为k
2) 在FM中得到的隐变量Vik现在作为嵌入层网络的权重

效果:
在这里插入图片描述
https://blog.youkuaiyun.com/hiwallace/article/details/81333604
https://blog.youkuaiyun.com/baymax_007/article/details/83931698

### 使用Python实现FM算法进行CTR预测 为了使用Python实现因子分解机(Factorization Machine, FM)来进行点击率(Click-Through Rate, CTR)预测,可以采用`pylibfm`库。该库提供了简单易用的接口来构建和训练FM模型。 #### 安装依赖包 首先需要安装必要的软件包: ```bash pip install numpy scipy scikit-learn pylibfm pandas ``` #### 数据准备 假设有一个CSV文件作为输入数据源,其中包含了用户行为记录以及相应的标签(是否发生点击)。这里展示了一个简单的例子,用于说明如何加载并转换这些原始特征向量以便于后续处理[^3]。 ```python import pandas as pd from sklearn.feature_extraction import DictVectorizer from sklearn.model_selection import train_test_split # 加载数据集 data = pd.read_csv('click_data.csv') # 提取特征列名 feature_columns = data.columns[:-1] # 将DataFrame中的每一行转化为字典形式,并存储在一个列表里 X_dict = [{col: val for col, val in zip(feature_columns, row)} for index, row in data.iterrows()] # 初始化DictVectorizer实例 vectorizer = DictVectorizer() # 转换为稀疏矩阵格式 X_sparse = vectorizer.fit_transform(X_dict) # 获取目标变量y y = data['label'].values # 划分训练集与测试集 X_train, X_test, y_train, y_test = train_test_split(X_sparse, y, test_size=0.2, random_state=42) ``` #### 构建与训练FM模型 接下来定义一个函数用来创建、配置并拟合FM分类器。此过程中指定了隐含层维度(`num_factors`)和其他超参数设置。 ```python from pylibfm import FM def build_and_fit_fm_model(X_train, y_train): # 创建Factorization Machines模型 fm_classifier = FM( num_factors=5, num_iter=200, task='classification', initial_learning_rate=0.001, learning_rate_schedule="optimal" ) # 训练模型 fm_classifier.fit(X_train, y_train) return fm_classifier ``` 调用上面定义好的函数完成实际训练操作: ```python model = build_and_fit_fm_model(X_train, y_train) ``` #### 预测性能评估 最后,在验证集上应用已训练完毕的FM模型执行预测任务,并通过混淆矩阵或其他指标衡量其表现效果。 ```python from sklearn.metrics import accuracy_score, confusion_matrix predictions = model.predict(X_test) predicted_labels = (predictions >= 0.5).astype(int) print(f'Accuracy Score: {accuracy_score(y_test, predicted_labels):.4f}') print("Confusion Matrix:") print(confusion_matrix(y_test, predicted_labels)) ``` 以上就是基于Python实现FM算法进行CTR预测的一个基本流程介绍及其对应的代码片段示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值