1.1赛题背景:
根据顾客的历史购买记录,预测Instacart的消费者将再次购买哪些产品?
1.2数据集详情:
aisle.csv 产品摆放位置说明
- 包含了aisle_id和aisle两列数据
departments.csv 产品所属类别
- 包含了department_id和department两列数据
products.csv 产品详情说明
- 包含product_id、product_name、aisle_id、department_id四列数据
orders.csv 订单详情说明
- 包含了order_id、user_id、eval_set、order_number、order_dow、order_hour_of_day、days_since_prior_order七列数据
orders_products__prior.csv 历史订单购买情况记录
- 包含了order_id、product_id、add_to_cart_order、reordered四列数据
orders_products__train.csv 训练集订单购买情况记录
- 包含了order_id、product_id、add_to_cart_order、reordered四列数据
sample_submission.csv 提交文件参考格式说明
1.3评分指标:
1.4提交格式:
包含order_id和products,如下图所示
2.数据探索分析(EDA)
2.1数据导入
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
path='/home/WLY/learn/Kaggle_example_learn/Instacart/Data/'
aisles=pd.read_csv(path+'aisles.csv')
departments = pd.read_csv(path + 'departments.csv')
products = pd.read_csv(path + 'products.csv')
orders = pd.read_csv(path + 'orders.csv')
order_products__train = pd.read_csv(path + 'order_products__train.csv')
order_products__prior = pd.read_csv(path + 'order_products__prior.csv')
sample_submission = pd.read_csv(path + 'sample_submission.csv')
2.2数据探索性分析
1.aisles数据集分析
- aisles数据集大小为134*2,共有134个不同的取值,代表产品摆放位置
1.查看数据集的大小,前五行数据,以及各列数据的不同取值情况
aisles.shape
aisles.head()
aisles.nunique()
2.departments数据集分析
- departments数据集大小为21*2,共有21个不同的取值,代表产品所属类别
departments.shape
departments.head()
departments.nunique()
3.products数据集分析
- products数据集中大小为49688*4,共有49688个取值,代表产品名称
products.shape
products.head()
products.nunique()
4.orders数据集分析
- orders数据集大小为3421083*7
- 上一单与本单的时间间隔(days_since_prior_order)含有缺失值,原因是order_number=1也就是第一单时,无上一单可言
- order_number=1数目和用户id数目相同。说明order_number代表用户购买顺序
- eval_set有三个类别取值(prior,train,test)即历史数据,训练数据,测试数据
- 查看用户购买总次数,即user_id出现的次数,得知最少购买次数为4,最大购买次数为100
- order_dow一周七天,order_hour_of_day一天24小时
- 训练集和测试集中的用户均在历史数据集中出现过,但训练集和测试集的用户无交集,且为用户最新购买(购买顺序最大)
orders.shape
orders.head()
orders.nunique()
根据数据分布可以看出最后一列数据有缺失值。下一步对缺失值进行分析
将最后一列数据提取出来,判断是否为nan值,并定位在数据集中有缺失值的行,分析原因
结论:当有缺失值时,订购顺序为1,不存在上一单的情况,所以为nan
orders.loc[orders.days_since_prior_order.isnull()].head()
eval_set有3个类别取值,查看取值情况
结论:分别为历史数据,训练数据,测试数据
orders.eval_set.value_counts()
统计order_number=1的数目.
结论:order_number=1的数目和用户id数目相同,说明order_number代表用户购买顺序
print('There are %d samples with order_number=1'%np.sum(orders['order_number']==1))
查看剩余两列数据的基础信息
结论:order_dow,order_hour_of_day属于正常值,一周7天,一天24小时
orders[['order_dow','order_hour_of_day']].describe()
查看用户购买总次数情况,即用户的记录
结论:一个用户最多记录为100,最少为4
orders['user_id'].value_counts()
orders['user_id'].value_counts()[:5]
orders['user_id'].value_counts()[-5:]
绘制用户购买总次数的分布图,横轴为用户购买总次数,纵轴为购买人数
tmp=pd.DataFrame(orders['user_id'].value_counts().values,columns=['user_correspoding_samples'])
tmp=tmp['user_correspoding_samples'].value_counts()
sns.barplot(x=tmp.index,y=tmp.values)
查看历史数据集,训练数据和测试数据之间用户的交叉情况,因为用户在推荐问题中都是一个很重要的特征变量
结论:train中所有用户均在prior中出现,test中所有用户均在prior中出现,但是train和test无相交用户情况
因此可知用户id在模型预测时,可能并不能带来增益,可以考虑删除
len(set(orders.loc[orders['eval_set']=='prior','user_id'])-set(orders.loc[orders['eval_set']=='train','user_id&#