一、前言
相比协同过滤模型仅利用用户与物品的相互行为信息进行推荐,逻辑回归模型能够综合利用用户、物品、上下文等多种不同的特征,生成较为“全面”的推荐结果。逻辑回归模型已经将推荐问题转换成了一个点击率预测的问题,另外,逻辑回归的另一种表现形式“感知机”作为神经网络中最基础的单一神经元,是深度学习的基础性结构。因此,能够进行多特征融合的逻辑回归模型成了独立于协同过滤的推荐模型发展的另一个主要方向。
二、GBDT+LR
GBDT+LR模型
Facebook提出了一种利用GBDT自动进行特征筛选和组合, 进而生成新的离散特征向量, 再把该特征向量当做LR模型的输入, 来产生最后的预测结果, 这就是著名的GBDT+LR模型了。GBDT+LR 使用最广泛的场景是CTR点击率预估,即预测当给用户推送的广告会不会被用户点击。
模型的总体结构长下面这样:
训练时,GBDT 建树的过程相当于自动进行的特征组合和离散化,然后从根结点到叶子节点的这条路径就可以看成是不同特征进行的特征组合,用叶子节点可以唯一的表示这条路径,并作为一个离散特征传入 LR 进行二次训练。
预测时,会先走 GBDT 的每棵树,得到某个叶子节点对应的一个离散特征(即一组特征组合),然后把该特征以 one-hot 形式传入 LR 进行线性加权预测。
三、代码实现
这是criteo-Display Advertising Challenge比赛的部分数据集, 里面有train.csv和test.csv两个文件:
1、数据集处理
- Label: 目标变量, 0表示未点击, 1表示点击
- l1-l13: 13列的数值特征, 大部分是计数特征
- C1-C26: 26列分类特征, 为了达到匿名的目的, 这些特征的值离散成了32位的数据表示
下面进行数据处理,填充缺失值
# 简单的数据预处理
# 去掉id列, 把测试集和训练集合并, 填充缺失值
df_train.drop(['Id'], axis=1, inplace=True) #去掉ID列
df_test.drop(['Id'], axis=1, inplace=True)
df_test['Label'] = -1 #给测试集加上标签列,并设为-1
data = pd.concat([df_train, df_test]) #拼接训练集和测试集
data.fillna(-1, inplace=True) #缺失值填充-1
这里前几行还是train文件的,可以看到NaN值都被替换为-1
2、模型搭建
(1)逻辑回归模型
数值特征归一化处理
# 连续特征归一化
scaler = MinMaxScaler() #归一化函数
for col in continuous_fea:
data[col] = scaler.fit_transform(data[col].values.reshape(-1, 1))#变化后的值填充进去
就是将I1-I13的数全部限制到0-1之间,避免出现太大或者太小的数,下面是对比图