前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TIANCHI安泰杯 —跨境电商智能算法大赛Baseline

TIANCHI安泰杯 —跨境电商智能算法大赛Baseline

作者头像
Coggle数据科学
发布2019-09-12 16:54:52
6680
发布2019-09-12 16:54:52
举报
文章被收录于专栏:Coggle数据科学Coggle数据科学

写在前面

该文章主要内容是安泰杯 —跨境电商智能算法大赛的基本分析和Baseline.

基本介绍

本次比赛给出若干日内来自成熟国家的部分用户的行为数据,以及来自待成熟国家的A部分用户的行为数据,以及待成熟国家的B部分用户的行为数据去除每个用户的最后一条购买数据,让参赛人预测B部分用户的最后一条行为数据。

数据集特点

1)每个用户有至少7条购买数据;

2)测试数据中每个用户的最后一条购买数据所对应的商品一定在训练数据中出现过;

3)少量用户在两个国家有购买记录,评测中将忽略这部分记录;

预测目标

关于yy国的B部分用户每个用户的最后一条购买数据的预测Top30

评估方法

MRR(Mean Reciprocal Rank):

首先对选手提交的表格中的每个用户计算用户得分:

其中, 如果选手对该buyer的预测结果predict k命中该buyer的最后一条购买数据则s(buyer,k)=1s(buyer,k)=1; 否则s(buyer,k)=0s(buyer,k)=0. 而选手得分为所有这些score(buyer)的平均值。

完整代码

代码语言:javascript
复制
import numpy as np
import pandas as pd
import os 
from tqdm import tqdm_notebook
import lightgbm as lgb
import xgboost as xgb
import warnings
warnings.simplefilter(action='ignore', category=FutureWarning)
warnings.filterwarnings('ignore')

path = './input/'
item   = pd.read_csv(path+'Antai_AE_round1_item_attr_20190626.csv')
submit = pd.read_csv(path+'Antai_AE_round1_submit_20190715.csv', header=None)
test   = pd.read_csv(path+'Antai_AE_round1_test_20190626.csv')
train  = pd.read_csv(path+'Antai_AE_round1_train_20190626.csv')

def get_preprocessing(df_):
    df = df_.copy()   
    df['hour']  = df['create_order_time'].apply(lambda x:int(x[11:13]))
    df['day']   = df['create_order_time'].apply(lambda x:int(x[8:10]))
    df['month'] = df['create_order_time'].apply(lambda x:int(x[5:7]))
    df['year']  = df['create_order_time'].apply(lambda x:int(x[0:4]))
    df['date']  = (df['month'].values - 7) * 31 + df['day']    
    del df['create_order_time']    
    return df

train = get_preprocessing(train)
test  = get_preprocessing(test)

# 高频item_id
temp = train.loc[train.buyer_country_id=='yy']
temp = temp.drop_duplicates(subset=['buyer_admin_id','item_id'], keep='first')
item_cnts = temp.groupby(['item_id']).size().reset_index()
item_cnts.columns = ['item_id','cnts']
item_cnts = item_cnts.sort_values('cnts', ascending=False)
items = item_cnts['item_id'].values.tolist()

# 很多admin的历史行为不够30个item,所以就需要填充够30个
# 这里使用train下yy的数据构造item_id频次排序,然后依次填充
def item_fillna(tmp_):  
    tmp = tmp_.copy()   
    l = len(tmp)
    if l == 30:
        tmp = tmp
    elif l < 30:
        m = 30 - l
        items_t = items.copy()
        for i in range(m):
            for j in range(50):
                it = items_t.pop(0)
                if it not in tmp:
                    tmp.append(it)
                    break
    elif l > 30:
        tmp = tmp[:30]
    
    return tmp

# 获取top30的item
def get_item_list(df_):
    df = df_.copy()
    dic = {}
    flag = 0
    for item in df[['buyer_admin_id','item_id']].values:
        try:
            dic[item[0]].append(item[1])
        except:
            if flag != 0:
                # 去重
                tmp = []
                for i in dic[flag]:
                    if i not in tmp:
                        tmp.append(i)
                # 填充
                tmp = item_fillna(tmp)
                dic[flag] = tmp
                
                flag = item[0]
            else:
                flag = item[0]
            dic[item[0]] = [item[1]]

    return dic

test = test.sort_values(['buyer_admin_id','irank'])
dic = get_item_list(test)

# 最终提交
temp = pd.DataFrame({'lst':dic}).reset_index()
for i in range(30):
    temp[i] = temp['lst'].apply(lambda x:x[i])
del temp['lst']
temp.to_csv('submission.csv',index=False,header=None)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 写在前面
  • 完整代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档