1、用户数据
2、商品数据
3、评价数据
4、行为数据
参赛者需要使用京东多个品类下商品的历史销售数据,构建算法模型,预测用户在未来5天内,对某个目标品类下商品的购买意向。对于训练集中出现的每一个用户,参赛者的模型需要预测该用户在未来5天内是否购买目标品类下的商品以及所购买商品的SKU_ID。评测算法将针对参赛者提交的预测结果,计算加权得分。
为了能够进行上述清洗,在此首先构造了简单的用户(user)行为特征和商品(item)行为行为特征,对应于两张表user_table和item_table
user_table特征包括: user_id(用户id),age(年龄),sex(性别), user_lv_cd(用户级别),browse_num(浏览数), addcart_num(加购数),delcart_num(删购数), buy_num(购买数),favor_num(收藏数), click_num(点击数),buy_addcart_ratio(购买加购转化率), buy_browse_ratio(购买浏览转化率), buy_click_ratio(购买点击转化率), buy_favor_ratio(购买收藏转化率) item_table特征包括: sku_id(商品id),attr1,attr2, attr3,cate,brand,browse_num, addcart_num,delcart_num, buy_num,favor_num,click_num, buy_addcart_ratio,buy_browse_ratio, buy_click_ratio,buy_favor_ratio, comment_num(评论数), has_bad_comment(是否有差评), bad_comment_rate(差评率)比赛的题目是高潜用户购买意向预测, 那么理解清楚什么是高潜用户对于数据分析,特征抽取,以及之后的建立模型有着至关重要的作用. 简单来讲,作为训练集的高潜用户应该具有以下特征:
必须有购买行为对一个商品购买和其他交互行为(浏览,点击,收藏等)时间差应该多于一天 因为根据赛题,我们需要预测未来5天的购买情况,那么如果用户对某商品在同一天完成所有的交互行为(包括购买), 我们无法从这种交易中指导未来的预测.用户相关特征:
主要根据用户数据集,对用户原本的年龄、性别、用户等级,采用独热编码。
def convert_age(age_str): if age_str == u'-1': return 0 elif age_str == u'15岁以下': return 1 elif age_str == u'16-25岁': return 2 elif age_str == u'26-35岁': return 3 elif age_str == u'36-45岁': return 4 elif age_str == u'46-55岁': return 5 elif age_str == u'56岁以上': return 6 else: return -1 user = pd.read_csv(user_path, encoding='gbk') user['age'] = user['age'].map(convert_age) age_df = pd.get_dummies(user["age"], prefix="age") sex_df = pd.get_dummies(user["sex"], prefix="sex") user_lv_df = pd.get_dummies(user["user_lv_cd"], prefix="user_lv_cd") user = pd.concat([user['user_id'], age_df, sex_df, user_lv_df], axis=1)商品相关特征:
根据商品数据集和评论数据集,对商品属性特征a1、a2、a3,和评论数量comment_num,进行独热编码
product = pd.read_csv(product_path) attr1_df = pd.get_dummies(product["a1"], prefix="a1") attr2_df = pd.get_dummies(product["a2"], prefix="a2") attr3_df = pd.get_dummies(product["a3"], prefix="a3") product = pd.concat([product[['sku_id', 'cate', 'brand']], attr1_df, attr2_df, attr3_df], axis=1) comments = comments[(comments.dt >= comment_date_begin) & (comments.dt < comment_date_end)] df = pd.get_dummies(comments['comment_num'], prefix='comment_num') comments = pd.concat([comments, df], axis=1) # type: pd.DataFrame comments = comments[['sku_id', 'has_bad_comment', 'bad_comment_rate', 'comment_num_1', 'comment_num_2', 'comment_num_3', 'comment_num_4']]提取商品在某段时间内的浏览购买转化率,加入购物车购买转化率,收藏购买转化率,点击购买转化率,可展现该商品在近期的人气与热门程度,方便我们预测该商品是否为用户可能购买的高潜商品。 actions = get_actions(start_date, end_date) df = pd.get_dummies(actions['type'], prefix='action') actions = pd.concat([actions['sku_id'], df], axis=1) actions = actions.groupby(['sku_id'], as_index=False).sum() actions['product_action_1_ratio'] = actions['action_4'] / actions['action_1'] actions['product_action_2_ratio'] = actions['action_4'] / actions['action_2'] actions['product_action_3_ratio'] = actions['action_4'] / actions['action_3'] actions['product_action_5_ratio'] = actions['action_4'] / actions['action_5'] actions['product_action_6_ratio'] = actions['action_4'] / actions['action_6']
用户行为相关特征:
提取从起始日期start_date到截止日期end_date内的行为数据集,对用户行为类型type做one-hot编码,然后使用聚合函数groupby,对user_id,sku_id进行聚合分组,对组内的其他特征进行相加,即可统计出在此期间用户对商品的各种行为类型的累计交互次数。
这个函数方便我们后面采用划窗方式,多次提取不同时间段的用户行为累计特征。
actions = actions[(actions.time >= start_date) & (actions.time < end_date)] actions = actions[['user_id', 'sku_id', 'type']] df = pd.get_dummies(actions['type'], prefix='%s-%s-action' % (start_date, end_date)) actions = pd.concat([actions, df], axis=1) # type: pd.DataFrame actions = actions.groupby(['user_id', 'sku_id'], as_index=False).sum() 提取按时间衰减的累计行为特征,使用匿名函数lambda提取出每条行为数据发生时间与截止日期的相隔天数,然后对相隔天数取反,作为对数函数的指数。这样若发生交互行为的数据离我们要预测的日期离得越远,那么它对我们的预测所占的权重指数就越小。 actions = actions[(actions.time >= start_date) & (actions.time < end_date)] df = pd.get_dummies(actions['type'], prefix='action') actions = pd.concat([actions, df], axis=1) # type: pd.DataFrame #近期行为按时间衰减 actions['weights'] = actions['time'].map(lambda x: datetime.strptime(end_date, '%Y-%m-%d') - datetime.strptime(x, '%Y-%m-%d %H:%M:%S')) #actions['weights'] = time.strptime(end_date, '%Y-%m-%d') - actions['datetime'] actions['weights'] = actions['weights'].map(lambda x: math.exp(-x.days)) actions['action_1'] = actions['action_1'] * actions['weights'] actions['action_2'] = actions['action_2'] * actions['weights'] actions['action_3'] = actions['action_3'] * actions['weights'] actions['action_4'] = actions['action_4'] * actions['weights'] actions['action_5'] = actions['action_5'] * actions['weights'] actions['action_6'] = actions['action_6'] * actions['weights'] actions = actions.groupby(['user_id', 'sku_id', 'cate', 'brand'], as_index=False).sum()通过提取用户的点击购买转化率,加入购物车后购买转化率,以及浏览购买转换率,我们可以更深刻的刻画该用户是否我们要寻找的高潜购买用户对象
actions = get_actions(start_date, end_date) df = pd.get_dummies(actions['type'], prefix='action') actions = pd.concat([actions['user_id'], df], axis=1) actions = actions.groupby(['user_id'], as_index=False).sum() actions['user_action_1_ratio'] = actions['action_4'] / actions['action_1'] actions['user_action_2_ratio'] = actions['action_4'] / actions['action_2'] actions['user_action_3_ratio'] = actions['action_4'] / actions['action_3'] actions['user_action_5_ratio'] = actions['action_4'] / actions['action_5'] actions['user_action_6_ratio'] = actions['action_4'] / actions['action_6']我们已经完成特征工程部分,接下来主要就是从特征工程生成的许多特征中选出有用的特征,然后对模型参数进行调优。
我们使用xgboost模型对用户模型进行建模,然后由于xgboost是基于树模型的分类器,那么在建树的过程中也就自动完成了对特征的选择。