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

本文涉及的产品
交互式建模 PAI-DSW,5000CU*H 3个月
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
模型训练 PAI-DLC,5000CU*H 3个月
简介: 【推荐系统】Facebook经典模型GBDT+LR代码实践

2021人工智能领域新星创作者,带你从入门到精通,该博客每天更新,逐渐完善推荐系统各个知识体系的文章,帮助大家更高效学习。

在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)


目录
相关文章
|
4月前
|
机器学习/深度学习 搜索推荐 算法
推荐系统的算法与实现:深入解析与实践
【6月更文挑战第14天】本文深入探讨了推荐系统的原理与实现,包括用户和项目建模、协同过滤、内容过滤及混合推荐算法。通过收集用户行为数据,系统预测用户兴趣,提供个性化推荐。实践中,涉及数据处理、建模、算法选择及结果优化。随着技术发展,推荐系统将持续改进,提升性能和用户体验。
|
11天前
|
搜索推荐 算法
模型小,还高效!港大最新推荐系统EasyRec:零样本文本推荐能力超越OpenAI、Bert
【9月更文挑战第21天】香港大学研究者开发了一种名为EasyRec的新推荐系统,利用语言模型的强大文本理解和生成能力,解决了传统推荐算法在零样本学习场景中的局限。EasyRec通过文本-行为对齐框架,结合对比学习和协同语言模型调优,提升了推荐准确性。实验表明,EasyRec在多个真实世界数据集上的表现优于现有模型,但其性能依赖高质量文本数据且计算复杂度较高。论文详见:http://arxiv.org/abs/2408.08821
33 7
|
2月前
|
机器学习/深度学习 搜索推荐 数据可视化
【2023年第十一届泰迪杯数据挖掘挑战赛】C题:泰迪内推平台招聘与求职双向推荐系统构建 建模及python代码详解 问题二
本文介绍了2023年第十一届泰迪杯数据挖掘挑战赛C题的解决方案,重点讲解了如何构建招聘与求职双向推荐系统的建模过程和Python代码实现,并对招聘信息和求职者信息进行了详细分析和画像构建。
55 1
|
2月前
|
存储 人工智能 搜索推荐
【2023年第十一届泰迪杯数据挖掘挑战赛】C题:泰迪内推平台招聘与求职双向推荐系统构建 27页论文及实现代码
本文介绍了2023年第十一届泰迪杯数据挖掘挑战赛C题的解决方案,详细阐述了如何构建泰迪内推平台的招聘与求职双向推荐系统,包括数据收集、分析、画像构建、岗位匹配度和求职者满意度模型的建立,以及履约率最优化的推荐模型,提供了27页的论文和实现代码。
50 0
【2023年第十一届泰迪杯数据挖掘挑战赛】C题:泰迪内推平台招聘与求职双向推荐系统构建 27页论文及实现代码
|
4月前
|
机器学习/深度学习 搜索推荐 算法
基于深度学习神经网络协同过滤模型(NCF)的图书推荐系统
登录注册 热门图书 图书分类 图书推荐 借阅图书 购物图书 个人中心 可视化大屏 后台管理
13100 2
基于深度学习神经网络协同过滤模型(NCF)的图书推荐系统
|
3月前
|
机器学习/深度学习 数据采集 搜索推荐
打开黑盒神经网络!港大推出全新会说话的推荐系统大模型XRec,从黑盒预测到可解释
【7月更文挑战第2天】港大研发XRec模型,将可解释性引入推荐系统。XRec结合大型语言模型的语义理解与协同过滤,生成推荐的文本解释,提升透明度。该模型无关设计允许与各类推荐系统配合,增强用户体验。然而,计算资源需求高、数据质量和用户理解能力可能影响其效果。[查看论文](https://arxiv.org/pdf/2406.02377)**
55 11
|
3月前
|
机器学习/深度学习 搜索推荐 算法
深度学习在推荐系统中的应用:技术解析与实践
【7月更文挑战第6天】深度学习在推荐系统中的应用为推荐算法的发展带来了新的机遇和挑战。通过深入理解深度学习的技术原理和应用场景,并结合具体的实践案例,我们可以更好地构建高效、准确的推荐系统,为用户提供更加个性化的推荐服务。
|
4月前
|
机器学习/深度学习 人工智能 搜索推荐
构建基于AI的个性化新闻推荐系统:技术探索与实践
【6月更文挑战第5天】构建基于AI的个性化新闻推荐系统,通过数据预处理、用户画像构建、特征提取、推荐算法设计及结果评估优化,解决信息爆炸时代用户筛选新闻的难题。系统关键点包括:数据清洗、用户兴趣分析、表示学习、内容及协同过滤推荐。实践案例证明,结合深度学习的推荐系统能提升用户体验,未来系统将更智能、个性化。
|
5月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue的新闻推荐系统附带文章和源代码
基于SpringBoot+Vue的新闻推荐系统附带文章和源代码
193 3
|
5月前
|
JavaScript Java 测试技术
微信小程序松江大学城就餐推荐系统附带文章和源代码
微信小程序松江大学城就餐推荐系统附带文章和源代码
37 1