一位小白零基础入门新闻推荐
学习目标
Task01 赛题理解+Baseline
理解阿里云天池新闻推荐的赛题数据和目标,学习理解Baseline中的原理,了解赛题的解题思路。
学习内容
1、 跑通Baseline
2、 学习看懂Baseline代码
3、 学习上一期推荐系统基础的基于物品的协同过滤和基于用户的协同过滤,学习评分指标方法。
学习收获
1、第一步,看代码之前首先搞懂了这些包库模块的作用,方便接下来的Baseline代码理解
import time, math, os
from tqdm import tqdm #Tqdm 是一个快速,可扩展的Python进度条
import gc #gc模块进行垃圾回收,时不时地进行内存回收
import pickle #python中几乎所有的数据类型(列表,字典,集合,类等)都可以用pickle来序列化,
import random
from datetime import datetime
from operator import itemgetter #用于获取对象的哪些维的数据
import numpy as np
import pandas as pd
import warnings #发出警告。警告消息通常用于提示用户一些错误或者过时的用法
import collections
from collections import defaultdict #用于产生一个带有默认值的dict。主要针对key不存在的情况下,也希望有返回值的情况。
warnings.filterwarnings('ignore') #忽略警告
2、先简单对五个数据表进行查空值检查
进行查空检查,五个数据表都没有存在空值。
3、
# debug模式:从训练集中划出一部分数据来调试代码
def get_all_click_sample(data_path, sample_nums=10000):
"""
训练集中采样一部分数据调试
data_path: 原数据的存储路径
sample_nums: 采样数目(这里由于机器的内存限制,可以采样用户做)
"""
all_click = pd.read_csv(data_path + 'train_click_log.csv')
all_user_ids = all_click.user_id.unique()
sample_user_ids = **np.random.choice**(all_user_ids, size=sample_nums, replace=False)
all_click = all_click[all_click['user_id'].isin(sample_user_ids)]
all_click = all_click.drop_duplicates((['user_id', 'click_article_id', 'click_timestamp']))
return all_click
# 读取点击数据,这里分成线上和线下,如果是为了获取线上提交结果应该讲测试集中的点击数据合并到总的数据中
# 如果是为了线下验证模型的有效性或者特征的有效性,可以只使用训练集
def get_all_click_df(data_path='./data_raw/', offline=True):
if offline:
all_click = pd.read_csv(data_path + 'train_click_log.csv')
else:
trn_click = pd.read_csv(data_path + 'train_click_log.csv')
tst_click = pd.read_csv(data_path + 'testA_click_log.csv')
all_click = trn_click.append(tst_click)
all_click = all_click.drop_duplicates((['user_id', 'click_article_id', 'click_timestamp']))
return all_click
# 全量训练集
all_click_df = get_all_click_df(offline=False)
all_click_df.head(10)
输出前10 行数据如下:
np.random.choice
numpy.random.choice(a, size=None, replace=True, p=None)
a : 如果是一维数组,就表示从这个一维数组中随机采样;如果是int型,就表示从0到a-1这个序列中随机采样。
size : 采样结果的数量,默认为1.可以是整数,表示要采样的数量;也可以为tuple,如(m, n, k),则要采样的数量为m * n * k,size为(m, n, k)。
replace : boolean型,采样的样本是否要更换?这个地方我不太理解,测了一下发现replace指定为True时,采样的元素会有重复;当replace指定为False时,采样不会重复。
p : 一个一维数组,制定了a中每个元素采样的概率,若为默认的None,则a中每个元素被采样的概率相同。
4、学习上一期推荐系统基础的基于物品的协同过滤和基于用户的协同过滤
学习了解到:
协同过滤算法方法主要有下面两种算法:
- 基于用户的协同过滤算法(UserCF): 给用户推荐和他兴趣相似的其他用户喜欢的产品
- 基于物品的协同过滤算法(ItemCF): 给用户推荐和他之前喜欢的物品相似的物品
不管是UserCF还是ItemCF算法, 其中非常重要的步骤之一就是计算用户和用户或者物品和物品之间的相似度。
在推荐系统基础中学习到了,三种相似性度量方法,分别是: - 杰卡德(Jaccard)相似系数
- 余弦相似度
- 皮尔逊相关系数
让我印象最深刻的是最后两种方法
余弦相似度使用cosine_similarity进行实现
from sklearn.metrics.pairwise import cosine_similarity#相似度
i = [1, 0, 0, 0]
j = [1, 0.5, 0.5, 0]
cosine_similarity([i, j])
运行结果:
array([[1. , 0.81649658],
[0.81649658, 1. ]])
皮尔逊相关系数使用cosine_similarity进行实现
from scipy.stats import pearsonr
i = [1, 0, 0, 0]
j = [1, 0.5, 0.5, 0]
pearsonr(i, j)
运行结果:
(0.816496580927726, 0.18350341907227397)
最后算法评估,使用到了召回率、召回率、准确率和新颖度。
本次学习总结
对于平台提交的结果数据是0.0984,还需要继续加油,继续改善。
希望接下来和小伙伴们一起学习,一起进步!