【推荐系统】Facebook经典模型GBDT+LR代码实践

简介: 在CRT预估中,工业界一般是会采用逻辑回归进行处理,对用户特征画像进行建模,然后计算点击概率,评估用户是否会有点击的行为。

在CRT预估中,工业界一般是会采用逻辑回归进行处理,对用户特征画像进行建模,然后计算点击概率,评估用户是否会有点击的行为。


但是逻辑回归这个算法天生就会有个缺陷,它不能够区分非线性的数据,原因是逻辑回归是在普通的线性回归的基础之上添加了Sigmoid函数,处理的只能是线性数据,那么我们就需要获得线性可分的数据,这是如果采用人工进行组合特征,成本会非常的贵,而且需要有经验的专业人士,才能够获得提升模型效果的组合特征。


在2014年Facebook发表的一篇论文《Practical Lessons from Predicting Clicks on Ads at Facebook》,这篇论文提出了使用GBDT去产生高效的特征组合。


一、导库


import numpy as np

import pandas as pd


from sklearn.linear_model import LogisticRegression

from sklearn.model_selection import train_test_split

from sklearn.preprocessing import MinMaxScaler, OneHotEncoder, LabelEncoder

from sklearn.metrics import log_loss


import lightgbm as lgb


import gc

from scipy import sparse


import warnings

warnings.filterwarnings('ignore')


二、处理数据


path = 'data/'

df_train = pd.read_csv(path + 'kaggle_train.csv')

df_test = pd.read_csv(path + 'kaggle_test.csv')


# 合并训练集和测试集

df_train.drop(['Id'], axis=1, inplace=True)

df_test.drop(['Id'], axis=1, inplace=True)


df_test['Label'] = -1


data = pd.concat([df_train, df_test], axis=0)

data.fillna(-1, inplace=True)


# 将连续性和类别型特征分离

continuous_feature = ['I' + str(i+1) for i in range(13)]

category_feature = ['C' + str(i+1) for i in range(26)]


三、构建LR模型


def LR_model(data, continuous_feature, category_feature):

   # 将连续型特征归一化

   scaler = MinMaxScaler()

   for col in continuous_feature:

       data[col] = scaler.fit_transform(data[col].values.reshape(-1,1))

   

   # 将离散特征进行one-hot编码

   for col in category_feature:

       onehot_features = pd.get_dummies(data[col], prefix=col)

       data.drop([col], axis=1, inplace=True)

       data = pd.concat([data, onehot_features], axis=1)

   

   # 将训练集和测试集分开

   train_data = data[data['Label'] != -1]

   target = train_data.pop('Label')

   test_data = data[data['Label'] == -1]

   test_data.drop(['Label'], axis=1, inplace=True)

   

   # 划分数据集

   x_train, x_val, y_train, y_val = train_test_split(train_data, target, test_size=0.3, random_state=2021)

   

   # 构建模型

   LR = LogisticRegression()

   LR.fit(x_train, y_train)

   

   train_logloss = log_loss(y_train, LR.predict_proba(x_train)[:, 1])

   val_logloss = log_loss(y_val, LR.predict_proba(x_val)[:, 1])

   print('train_logloss: ',train_logloss)

   print('val_logloss:',val_logloss)

   

   # 模型预测

   y_pred = LR.predict_proba(test_data)[:, 1]


四、构建GBDT模型


def GBDT_model(data, continuous_feature, category_feature):

   # 将分类特征离散化

   for col in category_feature:

       onehot_feature = pd.get_dummies(data[col], prefix=col)

       data.drop([col], axis=1, inplace=True)

       data = pd.concat([data, onehot_feature], axis=1)

   

   # 将训练集和测试集分开

   train_data = data[data['Label'] != -1]

   target = train_data.pop('Label')

   test_data = data[data['Label'] == -1]

   test_data.drop(['Label'], axis=1, inplace=True)

   

   # 划分数据集

   x_train, x_val, y_train, y_val = train_test_split(train_data, target, test_size=0.3, random_state=2021)

   

   # 构建模型

   GBM = lgb.LGBMClassifier(boosting_type='gbdt',

                            objective='binary',

                            subsample=0.8,

                            min_child_weight=0.5,

                            colsample_bytree=0.7,

                            num_leaves=100,

                            max_depth=12,

                            learning_rate=0.01,

                            n_estimators=100,

                            silent=True

                           )

   

   GBM.fit(x_train, y_train,

           eval_set=[(x_train, y_train), (x_val, y_val)],

           eval_names=['train', 'val'],

           eval_metric='binary_logloss',

           early_stopping_rounds=100,

          )


   train_logloss = log_loss(y_train, GBM.predict_proba(x_train)[:, 1])

   val_logloss = log_loss(y_val, GBM.predict_proba(x_val)[:, 1])

   print('train_logloss: ',train_logloss)

   print('val_logloss:',val_logloss)

   

   # 模型预测

   y_pred = GBM.predict_proba(test_data)[:, 1]


五、构建GBDT+LR融合模型


def GBDT_LR_model(data, continuous_feature, category_feature):

   # 将分类特征离散化

   for col in category_feature:

       onehot_feature = pd.get_dummies(data[col], prefix=col)

       data.drop([col], axis=1, inplace=True)

       data = pd.concat([data, onehot_feature], axis=1)

   

   # 将训练集和测试集分开

   train_data = data[data['Label'] != -1]

   target = train_data.pop('Label')

   test_data = data[data['Label'] == -1]

   test_data.drop(['Label'], axis=1, inplace=True)

   

   # 划分数据集

   x_train, x_val, y_train, y_val = train_test_split(train_data, target, test_size=0.2, random_state=2021)

   

   # 构建模型

   GBM = lgb.LGBMClassifier(boosting_type='gbdt',

                            objective='binary',

                            subsample=0.8,

                            min_child_weight=0.5,

                            colsample_bytree=0.7,

                            num_leaves=100,

                            max_depth=12,

                            learning_rate=0.01,

                            n_estimators=100,

                            silent=True

                           )

   

   GBM.fit(x_train, y_train,

           eval_set=[(x_train, y_train), (x_val, y_val)],

           eval_names=['train', 'val'],

           eval_metric='binary_logloss',

           early_stopping_rounds=100,

          )

   

   model = GBM.booster_

   

   gbdt_feats_train = model.predict(train_data, pred_leaf=True)

   gbdt_feats_test = model.predict(test_data, pred_leaf=True)

   gbdt_feats_name = ['gbdt_leaf_' + str(i) for i in range(gbdt_feats_train.shape[1])]

   df_train_gbdt_feats = pd.DataFrame(gbdt_feats_train, columns = gbdt_feats_name)

   df_test_gbdt_feats = pd.DataFrame(gbdt_feats_test, columns = gbdt_feats_name)


   train = pd.concat([train_data, df_train_gbdt_feats], axis = 1)

   test = pd.concat([test_data, df_test_gbdt_feats], axis = 1)

   train_len = train.shape[0]

   data = pd.concat([train, test])

   del train

   del test

   gc.collect()

   

   # 将连续特征归一化

   scaler = MinMaxScaler()

   for col in continuous_feature:

       data[col] = scaler.fit_transform(data[col].values.reshape(-1, 1))

   

   # 将叶子节点特征进行one-hot编码

   for col in gbdt_feats_name:

       onehot_feats = pd.get_dummies(data[col], prefix = col)

       data.drop([col], axis = 1, inplace = True)

       data = pd.concat([data, onehot_feats], axis = 1)

   

   train = data[: train_len]

   test = data[train_len:]

   del data

   gc.collect()

   

   # 划分数据集

   x_train, x_val, y_train, y_val = train_test_split(train, target, test_size = 0.3, random_state = 2021)

   

   # 构建LR模型

   LR = LogisticRegression()

   LR.fit(x_train, y_train)

   

   train_logloss = log_loss(y_train, LR.predict_proba(x_train)[:, 1])

   val_logloss = log_loss(y_val, LR.predict_proba(x_val)[:, 1])

   print('train-logloss: ', train_logloss)

   print('val-logloss: ', val_logloss)

   

   # 模型预测

   y_pred = LR.predict_proba(test)[:, 1]


六、评估结果


# 训练和预测LR模型

LR_model(data.copy(), continuous_feature, category_feature)


# 模型训练和预测GBDT模型

GBDT_model(data.copy(), continuous_feature, category_feature)


# 训练和预测GBDT+LR模型

GBDT_LR_model(data.copy(), continuous_feature, category_feature)

目录
相关文章
|
1月前
|
机器学习/深度学习 搜索推荐 大数据
深度解析:如何通过精妙的特征工程与创新模型结构大幅提升推荐系统中的召回率,带你一步步攻克大数据检索难题
【10月更文挑战第2天】在处理大规模数据集的推荐系统项目时,提高检索模型的召回率成为关键挑战。本文分享了通过改进特征工程(如加入用户活跃时段和物品相似度)和优化模型结构(引入注意力机制)来提升召回率的具体策略与实现代码。严格的A/B测试验证了新模型的有效性,为改善用户体验奠定了基础。这次实践加深了对特征工程与模型优化的理解,并为未来的技术探索提供了方向。
97 2
深度解析:如何通过精妙的特征工程与创新模型结构大幅提升推荐系统中的召回率,带你一步步攻克大数据检索难题
|
1月前
|
机器学习/深度学习 算法 搜索推荐
django调用矩阵分解推荐算法模型做推荐系统
django调用矩阵分解推荐算法模型做推荐系统
30 4
|
1月前
|
数据采集 搜索推荐
推荐系统实践之新闻推荐baseline理解
推荐系统实践之新闻推荐baseline理解
29 1
|
1月前
|
数据采集 搜索推荐
推荐系统实践之新闻推荐baseline理解
推荐系统实践之新闻推荐baseline理解
54 1
|
1月前
|
机器学习/深度学习 搜索推荐 TensorFlow
使用Python实现智能电子商务推荐系统:深度学习模型详解
使用Python实现智能电子商务推荐系统:深度学习模型详解
180 4
|
2月前
|
搜索推荐 算法
模型小,还高效!港大最新推荐系统EasyRec:零样本文本推荐能力超越OpenAI、Bert
【9月更文挑战第21天】香港大学研究者开发了一种名为EasyRec的新推荐系统,利用语言模型的强大文本理解和生成能力,解决了传统推荐算法在零样本学习场景中的局限。EasyRec通过文本-行为对齐框架,结合对比学习和协同语言模型调优,提升了推荐准确性。实验表明,EasyRec在多个真实世界数据集上的表现优于现有模型,但其性能依赖高质量文本数据且计算复杂度较高。论文详见:http://arxiv.org/abs/2408.08821
63 7
|
1月前
|
机器学习/深度学习 搜索推荐 算法
推荐系统的矩阵分解和FM模型
推荐系统的矩阵分解和FM模型
21 0
|
3月前
|
机器学习/深度学习 搜索推荐 数据可视化
【2023年第十一届泰迪杯数据挖掘挑战赛】C题:泰迪内推平台招聘与求职双向推荐系统构建 建模及python代码详解 问题二
本文介绍了2023年第十一届泰迪杯数据挖掘挑战赛C题的解决方案,重点讲解了如何构建招聘与求职双向推荐系统的建模过程和Python代码实现,并对招聘信息和求职者信息进行了详细分析和画像构建。
79 1
|
3月前
|
存储 人工智能 搜索推荐
【2023年第十一届泰迪杯数据挖掘挑战赛】C题:泰迪内推平台招聘与求职双向推荐系统构建 27页论文及实现代码
本文介绍了2023年第十一届泰迪杯数据挖掘挑战赛C题的解决方案,详细阐述了如何构建泰迪内推平台的招聘与求职双向推荐系统,包括数据收集、分析、画像构建、岗位匹配度和求职者满意度模型的建立,以及履约率最优化的推荐模型,提供了27页的论文和实现代码。
77 0
【2023年第十一届泰迪杯数据挖掘挑战赛】C题:泰迪内推平台招聘与求职双向推荐系统构建 27页论文及实现代码
|
4月前
|
机器学习/深度学习 搜索推荐 算法
深度学习在推荐系统中的应用:技术解析与实践
【7月更文挑战第6天】深度学习在推荐系统中的应用为推荐算法的发展带来了新的机遇和挑战。通过深入理解深度学习的技术原理和应用场景,并结合具体的实践案例,我们可以更好地构建高效、准确的推荐系统,为用户提供更加个性化的推荐服务。
下一篇
无影云桌面