『Kaggle』Elo 用户忠诚度预测
发布时间:2025-07-29 编辑:游乐网
本文围绕Kaggle的Elo Merchant Category Recommendation比赛展开,介绍其赛题背景,包括巴西支付品牌Elo的业务与算法目标。还讲解了数据集情况,进行数据探索与清洗,接着开展特征工程,最后用随机森林模型预测并提交结果,为入门者展示机器学习竞赛完整流程。
前言: 本项目来源于Kaggle平台的Elo Merchant Category Recommendation,参考了《机器学习算法竞赛实战》和一些热心网友分享的资料,如果有侵权联系我删除就好,做这个项目的想法是,将这个比赛当做自己入门机器学习的学习赛,并且看到Aistudio上好像没有这个比赛的相关信息,因此就整理好分享出来,感兴趣的同学可以一块学习一下机器学习竞赛的完整流程,所用到的参考资料已放于最后引用
建议最开始使用 A100 及以上配置,数据集稍微有点大,训练部分可以切换为V100 32G(免得算力不够)
一、赛题背景介绍
- 巴西支付品牌Elo
本次竞赛其实是由巴西最大的支付品牌之一的Elo和Kaggle合作举办的比赛,奖金和数据都由Elo公司提供。谈到支付品牌,国内用户首先会想到类似支付宝、PayPal这些带有浓烈互联网色彩的支付品牌,但是在巴西,线上支付更多是由本地银行主导,且线上支付的信贷产品也主要以信用卡为主。Elo就是这样的一家公司,在2011年由巴西三家主要银行合资创立,主要负责线上支付业务,并且以信用卡作为核心金融产品,目前已发放超过1.1亿张信用卡,是巴西最大的本地在线支付品牌之一。

并且,Elo不仅是支付入口,更是一个“o2o”平台,通过App,用户可以查阅本地餐饮旅馆电影旅游机票等各项服务,并支持信用卡在线支付。形象点理解,就好比把美团主页移到支付宝,并且支付宝没有花呗,取而代之的是自己发行的信用卡。或者更加形象的理解,就类似国内招行信用卡掌上生活的业务模式:

- 业务目标:更好的进行本地服务推荐
在最新给出的说明中,我们不难发现,Elo使用机器学习算法技术的核心目的,是为了更好的在App内为用户推荐当地吃穿住行的商家服务,包括热门餐厅展示、优惠折扣提醒等(非常类似上图掌上生活首页的推荐)。也就是说,其根本目的是为了推荐,或者说为每个用户进行更加个性化的推荐,也就是赛题标题中的所写的:Merchant Category Recommendation(商户类别推荐)。但是,需要注意的是,本次竞赛的建模目标却和推荐系统并不直接相关。赛题说明中,在介绍完业务目标之后,紧接着就介绍了本次赛题的目标:对用户的忠诚度评分进行预测。
- 算法目标:用户忠诚度评分预测
所谓用户忠诚度评分,通过后续查看Evaluation不难发现,其实就是对每个用户的评分进行预测,本质上是个回归问题。
相信刚接触到本次赛题的小伙伴,一定会觉得赛题说明和建模目标有些“文不对题”,毕竟用户忠诚度评分貌似和个性化推荐并无直接关系,尤其此处用户忠诚度评分并不是针对某类商品或者某类商家的忠诚度评分。
围绕这个问题,赛题说明给出了非常笼统的解释,只是简单说到通过对用户忠诚度评分,能够为其提供最相关的机会(serve the most relevant opportunities to individuals),或者可以理解成是用户较为中意的线下服务,并且帮助ELo节省活动成本,为用户提供更好的体验。其实也就等于是没有解释忠诚度评分和推荐系统到底是什么关系。Kaggle本赛题论坛上也有很多相关讨论帖,最新给出的解释大意是通过忠诚度评分给用户推荐商铺和商品,这个过程并不是一个传统的协同过滤或者推荐系统进行推荐的过程,无论如何,先做好忠诚度预测就好。
二、数据集简介
2.1 数据整体情况介绍
本次赛题数据较多、数据量也相对较大,部分数据甚至无法直接通过普通Excel直接打开。接下来我们快速了解每个数据集的基本含义:

总的来说,上述7个数据文件大概可以分为三类,其一是基本信息类数据集,包括Data_Dictionary和sample_submission。其中Data_Dictionary数据集是所有数据的数据字典,即包括了所有数据各字段的含义,而sample_submission则是提交结果时的范例数据。
- Data Dictionary/Data_Dictionary:数据字典
所有其他数据表中每个字段的含义,相当于是其他各数据表的说明书。数据字典包含多个sheet,每个sheet对应一个数据表的字段和解释:

当然,我们可以通过如下方式直接使用pandas进行读取:(不过首先得导包和解压数据集)
In [5]
import osimport numpy as npimport pandas as pd
In [6]
# 解压数据集运行一次就好!unzip /home/aistudio/data/data184088/eloData.zip -d /home/aistudio/eloData/
Archive: /home/aistudio/data/data184088/eloData.zip inflating: /home/aistudio/eloData/Data Dictionary.xlsx inflating: /home/aistudio/eloData/historical_transactions.csv inflating: /home/aistudio/eloData/merchants.csv inflating: /home/aistudio/eloData/new_merchant_transactions.csv inflating: /home/aistudio/eloData/sample_submission.csv inflating: /home/aistudio/eloData/test.csv inflating: /home/aistudio/eloData/train.csv
- sample_submission:正确提交结果范例
In [7]
# 读取数据文件pd.read_csv('./eloData/sample_submission.csv', header=0).head(5)
card_id target0 C_ID_0ab67a22ab 01 C_ID_130fd0cbdd 02 C_ID_b709037bc5 03 C_ID_d27d835a9f 04 C_ID_2b5e3df5c2 0
In [8]
# 查看数据集基本信息pd.read_csv('./eloData/sample_submission.csv', header=0).info()
RangeIndex: 123623 entries, 0 to 123622Data columns (total 2 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 card_id 123623 non-null object 1 target 123623 non-null int64 dtypes: int64(1), object(1)memory usage: 1.9+ MB
最终建模结果提交格式,也就是以“一个id”+“对应预测结果”的格式进行提交。据此我们也能发现,实际上我们是需要预测每个card_id的用户忠诚度评分。

RMSE的计算过程如下:
RMSE=n1i=1∑n(yi−y^i)2
然后就是完成比赛的必要数据,也就是train和test两个数据集。顾名思义,train数据集就是训练数据,test就是测试数据集,二者特征一致,极简情况下我们可以直接在train上训练模型,在test上进行预测。
最后一类则是补充数据集,也就是 'historical_transactions.csv'、'new_merchant_transactions.csv'和'merchants.csv',其中前两个数据集记录了训练集和测试集信用卡的消费记录,而最后一个数据集则是前两个数据集中商铺信息(某特征)的进一步解释。在实际建模过程中,纳入更多数据进行规律挖掘,则有可能达到更好的效果。
2.2 train与test解读与初步探索
2.2.1 train和test数据集解读
首先先进行数据读取。当然考虑到后续数据集规模较大,我们可以提前导入gc包以进行内存管理。在实际清理内存时,我们可以先使用del删除对象、再使用gc.collect(),以达到手动清理内存的目的。
In [9]
# 数据读取import gctrain = pd.read_csv('./eloData/train.csv')test = pd.read_csv('./eloData/test.csv')# 查看数据集规模(train.shape, test.shape)
((201917, 6), (123623, 5))
- train: 训练数据集
训练数据基本情况如下
In [10]
# 查看前5条数据train.head(5)
first_active_month card_id feature_1 feature_2 feature_3