【Datawhale组队学习】零基础入门推荐系统 - 新闻推荐
参加了Datawhale第19期的组队学习之零基础入门推荐系统 - 新闻推荐,分享Task 02: 数据分析的学习经历。
Tesk 02:数据分析
目标:
1、提高得分
当特征工程和模型调参已经很难继续提高分数时,从新的角度出发重新去分析数据,力求找到提分的灵感。
2、有助于选择召回策略及特征工程
数据分析的价值主要在于熟悉了解整个数据集的基本情况包括每个文件里有哪些数据,具体的文件中的每个字段表示什么实际含义,以及数据集中特征之间的相关性,在推荐场景下主要就是分析用户本身的基本属性、文章基本属性、以及用户和文章交互的一些分布,这些都有利于后面的召回策略的选择,以及特征工程。
步骤:
1、读取数据:分别读取训练集点击记录train_click_log.csv、文章articles.csv、测试集点击记录testA_click_log.csv等3个数据文件
path = './data_raw/'
#train data
trn_click = pd.read_csv(path+'train_click_log.csv')
#articles data
item_df = pd.read_csv(path+'articles.csv')
#重命名,方便后续match,因为trn_click里用的是click_article_id
item_df = item_df.rename(columns={'article_id': 'click_article_id'})
#item_emb data
item_emb_df = pd.read_csv(path+'articles_emb.csv')
#test data
tst_click = pd.read_csv(path+'testA_click_log.csv')
2、查看trn_click和item_df的信息
trn_click.head()
item_df.head()
3、数据预处理
1)计算用户点击时间戳的排名rank
# 对每个用户的点击时间戳进行排名:groupby根据['user_id']的值对['click_timestamp']列数据聚合排序,并把相应的结果存储在新的列rank里
#先对每个用户进行分组,对每一组(即每个用户),对该用户某时间戳(点)的点击次数进行升序排名
trn_click['rank'] = trn_click.groupby(['user_id'])['click_timestamp'].rank(ascending=False).astype(int)
tst_click['rank'] = tst_click.groupby(['user_id'])['click_timestamp'].rank(ascending=False).astype(int)
2)计算用户点击文章的次数,并添加新的一列count
#计算用户点击文章的次数,并添加新的一列count
trn_click['click_cnts'] = trn_click.groupby(['user_id'])['click_timestamp'].transform('count')
tst_click['click_cnts'] = tst_click.groupby(['user_id'])['click_timestamp'].transform('count')
3)数据浏览
trn_click.head()
4)将训练数据trn_click与文章数据item_df合并,并查看
# 将trn_click与item_df按click_article_id合并(trn_click存储train_click_log.csv的数据,item_df存储文章数据articles.csv的df)
trn_click = trn_click.merge(item_df, how='left', on=['click_article_id'])
train_click_log.csv文件数据中每个字段的含义
- user_id: 用户的唯一标识
- click_article_id: 用户点击的文章唯一标识
- click_timestamp: 用户点击文章时的时间戳
- click_environment: 用户点击文章的环境
- click_deviceGroup: 用户点击文章的设备组
- click_os: 用户点击文章时的操作系统
- click_country: 用户点击文章时的所在的国家
- click_region: 用户点击文章时所在的区域
- click_referrer_type: 用户点击文章时,文章的来源
trn_click.head()
trn_click.info()
trn_click.describe()
#由结果为200000可知,训练集中的用户数量为20w
trn_click.user_id.nunique()
# 由结果为2可知,训练集中每个用户至少点击了两篇文章
trn_click.groupby('user_id')['click_article_id'].count().min()
5)画直方图了解各属性的分布
# value_counts()用法:
# 1、是Series的方法, 一般在DataFrame中使用时,需要指定对哪一列或行使用;
# 2、查看列中有哪些不同的值,并计算每个值有多少个重复值;
# 3、value_counts()默认会按从大到小排序显示出某列中不同值的重复次数,会打乱原有的index,此时的DataFrame或Series数据不再有连续的索引
# reset_index()用法:重置索引,可在括号内加参数drop=True,默认 False。括号内不加参数时,直接把原不连续的index保存成新的数据列,并自动创建新的连续的index
# v[col]是Series,不是df, 可用isinstance(v[col], pd.Series)判断
plt.figure()
plt.figure(figsize=(15, 20))
i = 1
for col in ['click_article_id', 'click_timestamp', 'click_environment', 'click_deviceGroup', 'click_os', 'click_country',
'click_region', 'click_referrer_type', 'rank', 'click_cnts']:
plot_envs = plt.subplot(5, 2, i)
i += 1
v = trn_click[col].value_counts().reset_index()[:10]
fig = sns.barplot(x=v['index'], y=v[col])
print(v)
# print(isinstance(v[col], pd.Series))
for item in fig.get_xticklabels():
item.set_rotation(90)
plt.title(col)
plt.tight_layout()
plt.show()
个人感觉,value_counts()和reset_index()组合在一起使用是个很大的坑……,现将两个函数分解开,并输出每个函数的值进行理解并解释:
# 查看列click_article_id中有哪些不同的值,并计算每个值有多少个重复值
v = trn_click['click_article_id'].value_counts()
print(v)
# 解释下面的输出结果:文章号为234698的出现了11886次,依此类推
v = trn_click['click_article_id'.value_counts().reset_index()[:10]
print(v)
# 解释下面的输出结果:使用reset_index()重置索引后,直接把原index234698保存成了一列新的数据列,命名为v['index'],原有的v['click_article_id']不变,并自动创建新的连续的index,依此类推
贴出其他属性的统计结果如下:
# 查看列click_environment中有哪些不同的值,并计算每个值有多少个重复值
# 根据结果,点击环境为4的一共有1084627条记录(这1084627条记录中存在重复的user_id)
# 点击设备组为1的一共有678187条记录
v = trn_click['click_environment'].value_counts().reset_index()[:10]
print(v)
v = trn_click['click_deviceGroup'].value_counts().reset_index()[:10]
print(v)
v = trn_click['click_os'].value_counts().reset_index()[:10]
print(v)
可对照所画的柱状图进行分析,用户点击文章时的操作系统17的一共有648777条记录,柱状图的纵坐标为记录数,即操作系统17在数据表中重复出现的次数,注意:648777次不等同648777个用户,由于有相同的user_id存在。
6)分析
- 从点击时间clik_timestamp来看,分布较为平均,可不做特殊处理。由于时间戳是13位的,后续将时间格式转换成10位方便计算。
- 从点击环境click_environment来看,仅有2102次(占0.1%)点击环境为1;仅有25894次(占2.3%)点击环境为2;剩余(占97.6%)点击环境为4。
- 从点击设备组click_deviceGroup来看,设备1占大部分(60.4%),设备3占36%。
——未完待续——