机器学习——新增用户预测
背景
今年8月末在一个机器学习方面的公众号上看到了一篇使用机器学习进行预测的比赛推文,本着参加Datawhale的AI夏令营拿个实习证明的想法(后来发现是实践证明)决定试一试,也为备战数模的练练手感。比赛链接:
问题重述
赛题数据由约62万条训练集、20万条测试集数据组成,共包含13个字段。其中uuid为样本唯一标识,eid为访问行为ID,udmap为行为属性,其中的key1到key9表示不同的行为属性,如项目名、项目id等相关字段,common_ts为应用访问记录发生时间(毫秒时间戳),其余字段x1至x8为用户相关的属性,为匿名处理字段。target字段为预测目标,即是否为新增用户。比赛的评价标准采用f1_score,分数越高,效果越好。
问题类似于鸢尾花分类,是一个分类预测,不过这应该只是一个二分类问题,常用的解决此类问题的模型有支持向量机、决策树、随机森林等等。
探索性数据分析(EDA)
-
数据处理
首先,直观地观察一下训练集
很明显,udmap和comm_ts这两个特征是需要进行处理的。对于udmap可以进行拆分,得到key1到key9和"isunknown"十个特征,这也是Datawhale给出的Baseline中的做法。对于common_ts,则可以一个时间戳中提取出日期、小时、分钟、秒等等多个时间特征。在本题中,我提取出的是小时、日期、分钟、星期、时钟+分钟。
-
特征提取
在上一步的基础上,进行特征提取,为了得到更多的特征用于特征筛选。
首先,观察到eid、x1、x2…x8中的一个特征内,取值只在几个值之中,推测这些值是某一些操作的代号。对此,从这些特征的其中一个中可以提取出两个特征,分别是所有取值它们各自出现的次数和一个特征中取某一个值时target为1的频率。
对于x1到x8,我还进行了目标编码,最终得到42个特征。
上述工作完成后,在进行查空补空,就可以进入下一项工作——探索性数据分析了。
-
EDA
-
相关性分析
从相关性热力图中发现,有些特征之间的相似度很高,达到了0.8、0.9。对于两个或多个相关性强的特征,只要保留其中一两个即可。**如何保留:**在这里我本来想用两个方法,选择保留特征的评判标准都是特征对于目标特征target的重要性。
法一:秩和检验。对于一个特征,将它分为两个列表,一部分是target为0的,另一部分是target为1的,将两个列表的值进行秩和检验,得到pvalue值,若值大于0.05,可以认为两个列表没有显著差异,也就可以认为是重要性较低的。
法二:将包含全部特征的训练集放进随机森林模型中进行训练,由模型根据该特征节点的平均深度给出特征的重要性。实际完成时我用的是法二。
-
特征 | 重要分数 |
---|---|
common_ts_hour_minute | 0.11770636674156788 |
x5 | 0.09159779450338466 |
common_ts_minute | 0.09044867249636006, |
common_ts_hour | 0.07109628463099216 |
… | … |
模型训练
模型训练中我使用的是xgboost+贝叶斯搜索,不过根据大佬的分享,用lightgbm的速度和训练效果也很不错。具体代码见github,最终得分:
体代码见github,最终得分:
[外链图片转存中…(img-L7IZtQoR-1697466482810)]
当时八月末时好像还能排个50名上下,后来没再调模型,排名应该不怎么高了。