赛题分析

本届算法大赛的题目是“广告受众基础属性预估”。

赛题背景

众所周知,像用户年龄和性别这样的人口统计学特征是各类推荐系统的重要输入特征,其中自然也包括了广告平台。这背后的假设是,用户对广告的偏好会随着其年龄和性别的不同而有所区别。许多行业的实践者已经多次验证了这一假设。然而,大多数验证所采用的方式都是以人口统计学属性作为输入来产生推荐结果,然后离线或者在线地对比用与不用这些输入的情况下的推荐性能。本届大赛的题目尝试从另一个方向来验证这个假设,即以用户在广告系统中的交互行为作为输入来预测用户的人口统计学属性。
我们认为这一赛题的“逆向思考”本身具有其研究价值和趣味性,此外也有实用价值和挑战性。例如,对于缺乏用户信息的实践者来说,基于其自有系统的数据来推断用户属性,可以帮助其在更广的人群上实现智能定向或者受众保护。与此同时,参赛者需要综合运用机器学习领域的各种技术来实现更准确的预估。

赛题目标

在比赛期间,将为参赛者提供一组用户在长度为91 天(3 个月)的时间窗口内的广告点击历史记录作为训练数据集。每条记录中包含了日期(从 1 到 91)、用户信息 (年龄,性别),被点击的广告的信息(素材 id、广告 id、产品 id、产品类目 id、广告主 id、广告主行业 id 等),以及该用户当天点击该广告的次数。测试数据集将会是另一组用户 的广告点击历史记录。提供给参赛者的测试数据集中不会包含这些用户的年龄和性别信息。这可以被理解为一个分类问题。

数据说明

训练数据中包含三张表,分别是:click_log.csv,user.csv,ad.csv。测试数据为:click_log.csv,ad.csv。

lick_log.csv:

time: 天粒度的时间,整数值,取值范围[1, 91]。user_id:1到N随机编号生成的不重复的加密的用户id,其中N为用户总数目(训练集和测试集)。creative_id: 用户点击的广告素材的 id,采用类似于 user_id 的方式生成。click_times: 当天该用户点击该广告素材的次数。

user.csv:

user_idage: 分段表示的用户年龄,取值范围[1-10]。gender:用户性别,取值范围[1,2]

ad.csv:

creative_idad_id: 该素材所归属的广告的 id。每个广告可能包含多个可展示的素材。product_id: 该广告中所宣传的产品的 id。product_category: 该广告中所宣传的产品的类别 id。advertiser_id: 广告主的 id。industry: 广告主所属行业的 id

数据分析

click_log.csv文件是关于用户行为的数据,最为关键,首先对其进行分析。

len(df_log)
len(df_log['user_id'].unique()), min(df_log1['user_id']), max(df_log1['user_id'])
len(df_log['creative_id'].unique()), min(df_log1['creative_id']), max(df_log['creative_id'])

统计其总样本数,用户的人数、范围,和广告id的数量可知,共3000w条日志数据。用户共90w,id从1~900000,并未有缺失。广告素材id共248多万个,id从1~4445718,说明有些广告没有一个用户进行点击。

其次对ad_csv进行分析,可知product_id有缺失值,product_category为广告中产品类别,可以作为后续的特征。

最后对user.csv进行分析

import matplotlib.pyplot as plt
file3 = 'dataset/train/user.csv'
df_user = pd.read_csv(file3, low_memory=False)plt.hist(x=df_user['gender'])
plt.xlabel('gender')
plt.ylabel('numbers of user')plt.hist(x=df_user['age'])
plt.xlabel('age')
plt.ylabel('numbers of user')
plt.show()

可以观察发现,性别为1的大概占了3/2,年龄主要分布在2~4范围,其中3人数最多,即20~30岁的人,符合实际情况。

思路分析

首先需要进行特征处理,在上述特征中,首先只用creative_id特征。用于总creative_id有444w,若是直接做onehot,然后embedding,参数过大,很难进行训练。所以在这里可以借用Word2vec的思想,将每个用户访问过的所有creative_id当作一个“句子”,每个广告为一个“单词”。这样总共可以形成90w个长度不等的序列,然后通过Word2vec模型进行训练,每个creative_id可以形成一个K维的向量。

先通过groupby操作进行构造句子:

sentences = df_log.groupby(['user_id']).apply(lambda x: x['creative_id'].tolist()).tolist()

再导入第三方Python工具包Gensim,使用Word2vec模型进行训练:

model = Word2Vec(sentences=sentences, min_count=1, sg=1, window=10, size=32, workers=25, seed=2020, iter=5)

这样就得到了每个creative_id的隐向量。由于每个用户点击了多个广告,可以对用户点击过的所有广告的隐向量做一个平均从而对训练集进行处理:

train_X = np.array(df_log.groupby(['user_id']).apply(lambda x: model[x['creative_id']]))

完整代码:

#!/usr/bin/env python
# coding=utf-8import pandas as pd
import numpy as np
import json
import csv
import os
import pickle
import re
import sys
import logging
import lightgbm as lgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import precision_score, recall_score, roc_auc_scorenp.set_printoptions(formatter={'float': lambda x: "{0:0.3f}".format(x)})
# logging.getLogger().setLevel(logging.INFO)def evaluation(y_true, y_pred_prob, threshold=0.5):# # eval# print('The rmse of prediction is:', mean_squared_error(y_test, y_pred) ** 0.5)# lightgbmy_pred = np.where(y_pred_prob > threshold, 1, 0)res = precision_score(y_true, y_pred)print("precision_score : {}".format(res))res = recall_score(y_true, y_pred)print("recall_score : {}".format(res))res = roc_auc_score(y_true, y_pred_prob)print("roc_auc_score : {}".format(res))def feature_importance(gbm):importance = gbm.feature_importance(importance_type='gain')names = gbm.feature_name()print("-" * 10 + 'feature_importance:')no_weight_cols = []for name, score in sorted(zip(names, importance), key=lambda x: x[1], reverse=True):if score <= 1e-8:no_weight_cols.append(name)else:print('{}: {}'.format(name, score))print("no weight columns: {}".format(no_weight_cols))def base_train(x_train, y_train, x_test, y_test, cate_cols=None, job='classification'):# create dataset for lightgbmif not cate_cols:cate_cols = 'auto'lgb_train = lgb.Dataset(x_train, y_train, categorical_feature=cate_cols)lgb_eval = lgb.Dataset(x_test, y_test, reference=lgb_train, categorical_feature=cate_cols)if job == 'classification':params = {'boosting_type': 'gbdt','objective': 'binary','metric': 'binary_logloss','num_leaves': 31,'learning_rate': 0.05,'feature_fraction': 0.9,'bagging_fraction': 0.8,'bagging_freq': 5,'verbose': 2,"use_missing": False,"boost_from_average": False,"n_jobs": -1}elif job == 'regression':params = {'boosting_type': 'gbdt','objective': 'regression','metric': {'l2', 'l1'},'num_leaves': 31,'learning_rate': 0.05,'feature_fraction': 0.9,'bagging_fraction': 0.8,'bagging_freq': 5,'verbose': 2,"n_jobs": -1}else:raise Exception("job error!")print('Starting training...')# traingbm = lgb.train(params,lgb_train,num_boost_round=1000,valid_sets=lgb_eval,early_stopping_rounds=5)# print('Saving model...')# gbm.save_model(model_path)y_pred_prob = gbm.predict(x_test, num_iteration=gbm.best_iteration)if job == 'classification':res_auc = roc_auc_score(y_test, y_pred_prob)print("AUC: {}".format(res_auc))# if res_auc < 0.75:#     logging.error("auc too low, maybe some error, please recheck it. AUC过低,可能训练有误,已终止!")#     sys.exit(3)for i in np.arange(0.1, 1, 0.1):print("threshold is {}: ".format(i))evaluation(y_test, y_pred_prob, threshold=i)elif job == 'regression':passfeature_importance(gbm)return gbm

`

2020腾讯广告算法大赛赛题复现相关推荐

  1. 2020腾讯广告算法大赛:赛题理解与解题思路

    写在前面 期待已久的2020腾讯广告算法大赛终于开始了,本届赛题"广告受众基础属性预估".本文将给出解题思路,以及最完备的竞赛资料,助力各位取得优异成绩!!! 报名链接:https ...

  2. 2020 腾讯广告算法大赛:突破高分瓶颈方案分享

    写在前面 期待已久的2020腾讯广告算法大赛终于开始了,本届赛题"广告受众基础属性预估".本文将给出解题思路,以及最完备的竞赛资料,助力各位取得优异成绩!!! 报名链接:https ...

  3. 百万奖池,鹅厂offer,2020腾讯广告算法大赛等你来战!

    允中 发自 凹非寺  量子位 编辑 | 公众号 QbitAI 2020腾讯广告算法大赛再度起航,即日起至5月31日,赛事正式面向全社会启动线上招募,一场算法之间的"巅峰对决"即将上 ...

  4. 【竞赛经验分享】2020腾讯广告算法大赛:如何突破分数瓶颈?

    写在前面 期待已久的2020腾讯广告算法大赛终于开始了,本届赛题"广告受众基础属性预估".本文将给出解题思路,以及最完备的竞赛资料,助力各位取得优异成绩!!! 报名链接:https ...

  5. 备战2020腾讯广告算法大赛:(2017-2019比赛开源和数据等)

    期待与各位在2020腾讯社交广告算法大赛中相遇!!! 写在前面 最近突然之间讨论腾讯广告赛的人多了不少,也有很多人加我微信讨论19年腾讯赛的方案和代码.虽然2020腾讯赛还未开始,不过大家已经提前进入 ...

  6. 最强战队出炉,2020腾讯广告算法大赛圆满落幕

    8月3日,2020腾讯广告算法大赛决赛在深圳腾讯滨海大厦顺利举行. 十强战队集结腾讯,花式解密"逆算"难题. 腾讯广告副总裁蒋杰.微众银行首席AI官杨强.科大讯飞副总裁刘鹏.腾讯数 ...

  7. 万人报名2020腾讯广告算法大赛,顶级技术争锋正式开战!

    由腾讯广告携手腾讯云.腾讯大数据.腾讯招聘及腾讯高校合作等合作伙伴举办的2020腾讯广告算法大赛,报名阶段于5月31日正式结束.自4月15日赛事开展至今,本届赛事已成功吸引2万多名技术人才高度关注.最 ...

  8. 谁与争锋,2020腾讯广告算法大赛初赛正式启动

    5月7日,2020腾讯广告算法大赛进入初赛赛段,汇聚了近万名多领域技术人才的硬核算法比拼正式开启! 为了更有效地推动产学研的交流与融合,培养技术人才.本届算法大赛通过"逆向思考"巧 ...

  9. 冠军奖金50万,2020腾讯广告算法大赛广发“英雄帖”

    由腾讯广告主办,腾讯云.腾讯大数据.腾讯招聘及腾讯高校合作等合作伙伴联袂举办的2020腾讯广告算法大赛现已启动,5月31日前皆可报名参加! 百万奖金池重磅加码,"逆算"赛题趣味竞技 ...

  10. 2020腾讯广告算法大赛十强名单出炉!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale推荐 2020年腾讯广告算法大赛 - 决赛答辩 经过近3个月的激烈角逐,202 ...

最新文章

  1. java redis 下载_redis Java源代码 redis.rar - 下载 - 搜珍网
  2. hive同时不包含一些字符串_Hive中常用的字符串操作
  3. 基于Springboot实现田径运动会管理系统
  4. python魔法方法和普通方法_Python龙珠训练营九:魔法方法
  5. 璧山哪里可以学基础计算机,璧山学电脑在哪里
  6. 【10】48. Rotate Image
  7. CMake基础 第2节 分离编译
  8. 34988 Happy Reversal(二进制去取反)
  9. linux日常笔记5
  10. Docker的今生前世,关于Docker的一些见解
  11. Redis 的 Sentinel哨兵介绍与源码分析(1):初始化部分
  12. Week04《Java程序设计》第四周学习总结
  13. 一个人如果控制不住自己乱消费,等同于废物
  14. ps分辨率像素英寸和厘米的区别_南南带你免费学习超级强大的做图软件-PS(第一章:第二节)...
  15. 【转】 pycharm快捷键、常用设置、配置管理(后两者详见原博客)
  16. 大学mysql期末试题_大学期末考试综合实训试题一
  17. [51nod1206]Picture
  18. VS:无法将“char *”转换为“const wchar_t *”/不能将参数从“const char []”转换为“const wchar_t *”
  19. NBSI2内部功能实现大揭谜
  20. SpringSecurity实现自定义登录界面

热门文章

  1. 《网易云音乐小程序》开发总结
  2. 物联网之智能家居系统设计和实现
  3. Win10怎么设置自动锁屏? win10自动锁屏的两种方法
  4. 魔兽争霸3地图加密,支持重制版-魔兽争霸3地图加密实操,魔兽地图加密工具
  5. 微信公众号跳转小程序,详细教程
  6. 特征选择:嵌入法---《菜菜机器学习笔记》
  7. VC操作Word书签模板
  8. mysql常用语句梳理
  9. element表格表头显示斜杠
  10. 大数据整体技术流程及架构