前言:去年曾经参加过天猫移动推荐比赛。但是当时报名之后实验室安排了其他的新任务,导致这个比赛只是在最后几天粗略的做了一下,然后也只提交了一次结果。没能好好地做这个比赛也是我的一个遗憾。现在回过头来再尝试去做这个比赛,就当练练手了。
一.基本思路
题目的训练数据包含了抽样出来的一定量用户在一个月时间(11.18~12.18)之内的移动端行为数据(D),评分数据是这些用户在这个一个月之后的一天(12.19)对商品子集(P)的购买数据。参赛者要使用训练数据建立推荐模型,并输出用户在接下来一天对商品子集购买行为的预测结果。
拿到题目,首先是读取数据和初步观察数据是否有缺失值等等。我还是使用Pandas库来读取数据,但是在读取数据的时候遇到了memory error的错误。
上网查了一些资料,出现这个错误的原因是我的python是32位的,能访问的内存有限,而训练数据又比较大。所以不得已重装了64位python,然后又装了一片那一大堆的库
先读取部分数据,把重心放在后续的数据处理上。
首先是做数据预处理,观察数据的缺失值情况:
可知公布的数据应该是经过阿里官方清洗的,除了地理位置那一栏之外并不存在缺失数据的情况。而且主要的数据也不需要再转换成数值型数据的。这样一来,接下来就可以进入特征工程阶段。
训练集是11.18-12.16 用户与商品的交互记录,训练集的标签是12.17用户有木有购买相应的商品。我的方案是先针对有交互记录的数据进行处理。
正样本:12.17当天有购买,而且17号之前有互动记录的用户-商品对
负样本:12.17当天没有购买,而且17号之前有互动记录的用户-商品对
我习惯于先制作几个基本的特征,预留好接口。先把整个特征提取和模型训练的过程给跑通了,之后再去往里面加新的特征。所以初步设计了一些很简单的特征:
用户特征:点击(收藏或者加入购物车)转换成购买的比例
商品特征:点击(收藏或者加入购物车)转换成购买的比例
用户-商品对特征:测试日期前几天点击,收藏,加入购物车,购买的次数
由于对pandas的使用还不怎么熟练,花了一些时间才完成这些特征提取工作,当前的程序如下:
import numpy as np
import pandas as pd
import random as rd
import re
from sklearn import tree
from sklearn import preprocessing
from sklearn import cross_validation
from sklearn.ensemble import RandomForestClassifier
def sp_count(df,num):
return sum(df['behavior_type']==num)
def load_off_data():
global train_df,label_df,item_df,user_feature_dic,item_feature_dic,ui_feature_dic,label_dic
df = pd.read_csv('tianchi_mobile_recommend_train_user.csv')
user_feature_dic={};item_feature_dic={};ui_feature_dic={};label_dic={}
train_df = df[(df['time'].values>='2014-11-18 00') & (df['time'].values<'2014-12-17 00')]
label_df = df[(df['time'].values>='2014-12-17 00') & (df['time'].values<