【机器学习竞赛(2)】视频点击预测大赛解决方案

本文深入探讨了一次机器学习竞赛中的视频点击预测问题,采用单个LightGBM模型,重点介绍了数据探索、特征工程和模型优化过程。通过对用户行为数据的分析,构建了历史状态信息、曝光点击时间差和二阶特征交叉等特征,并在模型优化阶段通过特征重要性和阈值搜索提高预测准确率,最终达到约81%的单模准确率。
摘要由CSDN通过智能技术生成

【机器学习竞赛(1)】 一文从“Kaggle泰坦尼克之灾”入门机器学习竞赛
上文介绍了一篇基本流程,本文将从实战角度出发,看看我们在真实场景中还需要哪些进一步的工作。

首先复习“泰坦尼克之灾”的处理流程。首先是数据探索,主要探索的是属性列的一些统计特性和各个属性列与target之间的关联,然后是数据预处理,文中也将其称为特征工程,包括缺失值处理、类目属性one-hot化和数值归一化;最后就是建模与优化部分,建模不必多说,涉及到调参,优化部分也是极为重要的,包括属性关联度分析、欠/过拟合处理、模型融合。

其中最重要的几个部分包括数据的探索、特征工程和模型融合。

下面就详细的探索本竞赛的解决方案。

本次比赛使用的是单LightGBM模型,需提前学习了解。

0 题目理解

题目往往介绍的很简单,因此需要根据经验和数据集进行反复理解。

题目:参赛者通过构建推荐模型,预测待测试数据中用户在对应的视频上是否会产生点击行为。

从题目可以看出,我们的要解决的是一个二分类问题,因此我们可以选择的模型有很多,当然这里选择使用LightGBM,具有较好的性能和可解释性。

数据说明:

第一部分是用户在资讯全集上的移动端行为数据(D)。

训练数据包含了抽样出来的一定量用户在三天之内的移动端行为数据(D),评分数据是这些用户在之后一天对子集(P)的点击数据。参赛者要使用训练数据建立推荐模型,并输出用户在接下来一天点击行为的预测结果。

这里数据说明比前面题目更重要,对题目的理解更进一步。

1 数据探索

分别读取train和test数据集。

最开说一下数据集中和时间相关两个重要的属性,一个是timestamp,代表用户点击该视频的时间戳,未点击为NULL;另一个是ts,表示视频曝光给用户的时间戳。
1.数据读取

print('=============================================== read train ===============================================')
t = time.time()
train_df = pd.read_csv('/home/aistudio/data/data20187/train.csv')
#将曝光时间转换为日期,并提取出时分秒单独成列
train_df['date'] = pd.to_datetime(
    train_df['ts'].apply(lambda x: time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(x / 1000)))
)
train_df['day'] = train_df['date'].dt.day
train_df.loc[train_df['day'] == 7, 'day'] = 8
train_df['hour'] = train_df['date'].dt.hour
train_df['minute'] = train_df['date'].dt.minute
#保留样本数量和labels,后面会用到
train_num = train_df.shape[0]
labels = train_df['target'].values
print('runtime:', time.time() - t)

print('=============================================== click data ===============================================')
#后面特征工程用于统计前一天的点击次数
click_df = train_df[train_df['target'] == 1].sort_values('timestamp').reset_index(drop=True)
click_df['exposure_click_gap'] = click_df['timestamp'] - click_df['ts']
click_df = click_df[click_df['exposure_click_gap'] >= 0].reset_index(drop=True)
click_df['date'] = pd.to_datetime(
    click_df['timestamp'].apply(lambda x: time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(x / 1000)))
)
click_df['day'] = click_df['date'].dt.day
click_df.loc[click_df['day'] == 7, 'day'] = 8
del train_df['target'], train_df['timestamp']
for f in ['date', 'exposure_click_gap', 'timestamp', 'ts', 'target', 'hour', 'minute']:
    del click_df[f]
print('runtime:', time.time() - t)
print('=============================================== click data ===============================================')
click_df = train_df[train_df['target'] == 1].sort_values('timestamp').reset_index(drop=True)
#计算曝光-点击时间差,选取≥0的样本,后面使用
click_df['exposure_click_gap'] = click_df['timestamp'] - click_df['ts']
click_df = click_df[click_df['exposure_click_gap'] >= 0].reset_index(drop=True)
click_df['date'] = pd.to_datetime(
    click_df['timestamp'].apply(lambda x: time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(x / 1000)))
)
click_df['day'] = click_df['date'].dt.day
click_df.loc[click_df['day'] == 7, 'day'] = 8
del train_df['target'], train_df['timestamp']
for f in ['date', 'exposure_click_gap', 'timestamp', 'ts', 'target', 'hour', 'minute']:
    del click_df[f]
print('runtime:', time.time() - t)

2.类目特征处理

print('=============================================== cate enc ===============================================')
df['lng_lat'] = df['lng'].astype('str') + '_' + df['lat'].astype('str'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值