天池新闻推荐入门赛之赛题理解+Baseline

【数据挖掘】天池挑战赛 新闻推荐 比赛网址:https://tianchi.aliyun.com/competition/entrance/531842/introduction 一、项目知识点 数据预处理; 数据可视化; 特征工程; 模型选择; 实验结果的评价; 二、实验过程 一、比赛任务分析 1.赛题背景 赛题以新闻APP中的新闻推荐为背景,要求选手根据用户历史浏览点击新闻文章的数据信息预测用户未来点击行为,即用户的最后一次点击的新闻文章 2.赛题数据 数据来自某新闻APP平台的用户交互数据,包括30万用户,近3 阅读详情

零基础入门推荐系统【赛题理解+Baseline】

赛题简介

赛题是以新闻APP中的新闻推荐为背景, 目的是要求我们根据用户历史浏览点击新闻文章的数据信息预测用户未来的点击行为, 即用户的最后一次点击的新闻文章, 这道赛题的设计初衷是引导大家了解推荐系统中的一些业务背景, 解决实际问题

数据概况

该数据来自某新闻APP平台的用户交互数据,包括30万用户,近300万次点击,共36万多篇不同的新闻文章,同时每篇新闻文章有对应的embedding向量表示。为了保证比赛的公平性,从中抽取20万用户的点击日志数据作为训练集,5万用户的点击日志数据作为测试集A,5万用户的点击日志数据作为测试集B。具体数据表和参数, 大家可以参考赛题说明。下面说一下拿到这样的数据如何进行理解, 来有效的开展下一步的工作。

在这里插入图片描述
train_click_log.csv:训练集用户点击日志

testA_click_log.csv:测试集用户点击日志

articles.csv:新闻文章信息数据表

articles_emb.csv:新闻文章embedding向量表示

字段表格数据样式:
在这里插入图片描述

Baseline

itemcf的物品相似度计算

# import packages
import time
import math
from tqdm import tqdm
import pickle
import numpy as np
import pandas as pd
import warnings
from collections import defaultdict
warnings.filterwarnings('ignore')

# data_path
data_path = './data/'
save_path = './result/'

# 节约内存的一个标配函数
def reduce_mem(df):
    starttime = time.time()
    numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']
    start_mem = df.memory_usage().sum() / 1024**2
    for col in df.columns:
        col_type = df[col].dtypes
        if col_type in numerics:
            c_min = df[col].min()
            c_max = df[col].max()
            if pd.isnull(c_min) or pd.isnull(c_max):
                continue
            if str(col_type)[:3] == 'int':
                if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:
                    df[col] = df[col].astype(np.int8)
                elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:
                    df[col] = df[col].astype(np.int16)
                elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:
                    df[col] = df[col].astype(np.int32)
                elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max:
                    df[col] = df[col].astype(np.int64)
            else:
                if c_min > np.finfo(np.float16).min and c_max < np.finfo(np.float16).max:
                    df[col] = df[col].astype(np.float16)
                elif c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max:
                    df[col] = df[col].astype(np.float32)
                else:
                    df[col] = df[col].astype(np.float64)
    end_mem = df.memory_usage().sum() / 1024**2
    print('-- Mem. usage decreased to {:5.2f} Mb ({:.1f}% reduction),time spend:{:2.2f} min'
          .format(end_mem, 100*(start_mem-end_mem)/start_mem, (time.time()-starttime)/60))
    return df


# 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/', 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


def get_user_item_time(click_df):
    # 根据点击时间获取用户的点击文章序列   {user1: [(item1, time1), (item2, time2)..]...}
    click_df = click_df.sort_values('click_timestamp')

    def make_item_time_pair(df):
        return list(zip(df['click_article_id'], df['click_timestamp']))

    user_item_time_df = click_df.groupby('user_id')['click_article_id', 'click_timestamp'].apply(
        lambda x: make_item_time_pair(x)) \
        .reset_index().rename(columns={0: 'item_time_list'})
    user_item_time_dict = dict(zip(user_item_time_df['user_id'], user_item_time_df['item_time_list']))

    return user_item_time_dict


def get_item_topk_click(click_df, k):
    # 获取近期点击最多的文章
    topk_click = click_df['click_article_id'].value_counts().index[:k]
    return topk_click


def itemcf_sim(df):
    """
        文章与文章之间的相似性矩阵计算
        :param df: 数据表
        :item_created_time_dict:  文章创建时间的字典
        return : 文章与文章的相似性矩阵
        思路: 基于物品的协同过滤(详细请参考上一期推荐系统基础的组队学习), 在多路召回部分会加上关联规则的召回策略
    """

    user_item_time_dict = get_user_item_time(df)

    # 计算物品相似度
    i2i_sim = {}
    item_cnt = defaultdict(int)
    for user, item_time_list in tqdm(user_item_time_dict.items()):
        # 在基于商品的协同过滤优化的时候可以考虑时间因素
        for i, i_click_time in item_time_list:
            item_cnt[i] += 1
            i2i_sim.setdefault(i, {})
            for j, j_click_time in item_time_list:
                if (i == j):
                    continue
                i2i_sim[i].setdefault(j, 0)

                i2i_sim[i][j] += 1 / math.log(len(item_time_list) + 1)

    i2i_sim_ = i2i_sim.copy()
    for i, related_items in i2i_sim.items():
        for j, wij in related_items.items():
            i2i_sim_[i][j] = wij / math.sqrt(item_cnt[i] * item_cnt[j])

    # 将得到的相似性矩阵保存到本地
    pickle.dump(i2i_sim_, open(save_path + 'itemcf_i2i_sim.pkl', 'wb'))

    return i2i_sim_


all_click_df = get_all_click_df(data_path, offline=False)  # 获取训练集
i2i_sim = itemcf_sim(all_click_df)  #  itemcf的物品相似度计算

训练过程

在这里插入图片描述

训练结果:得到.pkl

在这里插入图片描述

通过保存的.pkl然后得到给每个用户根据物品的协同过滤推荐文章


all_click_df = get_all_click_df(data_path, offline=False)  # 获取训练集
# i2i_sim = itemcf_sim(all_click_df)  #  itemcf的物品相似度计算

# 定义
user_recall_items_dict = collections.defaultdict(dict)

# 获取 用户 - 文章 - 点击时间的字典
user_item_time_dict = get_user_item_time(all_click_df)

# 去取文章相似度
i2i_sim = pickle.load(open(save_path + 'itemcf_i2i_sim.pkl', 'rb'))

# 相似文章的数量
sim_item_topk = 10

# 召回文章数量
recall_item_num = 10

# 用户热度补全
item_topk_click = get_item_topk_click(all_click_df, k=50)

for user in tqdm(all_click_df['user_id'].unique()):
    user_recall_items_dict[user] = item_based_recommend(
        user, user_item_time_dict, i2i_sim, sim_item_topk, recall_item_num, item_topk_click)

将召回字典转换为DataFrame并生成提交文件

# 生成提交文件
def submit(recall_df, topk=5, model_name=None):
    recall_df = recall_df.sort_values(by=['user_id', 'pred_score'])
    recall_df['rank'] = recall_df.groupby(['user_id'])['pred_score'].rank(ascending=False, method='first')

    # 判断是不是每个用户都有5篇文章及以上
    tmp = recall_df.groupby('user_id').apply(lambda x: x['rank'].max())
    assert tmp.min() >= topk

    del recall_df['pred_score']
    submit = recall_df[recall_df['rank'] <= topk].set_index(['user_id', 'rank']).unstack(-1).reset_index()

    submit.columns = [int(col) if isinstance(col, int) else col for col in submit.columns.droplevel(0)]
    # 按照提交格式定义列名
    submit = submit.rename(columns={'': 'user_id', 1: 'article_1', 2: 'article_2',
                                    3: 'article_3', 4: 'article_4', 5: 'article_5'})

    save_name = save_path + model_name + '_' + datetime.today().strftime('%m-%d') + '.csv'
    submit.to_csv(save_name, index=False, header=True)

# 将字典的形式转换成df
user_item_score_list = []

for user, items in tqdm(user_recall_items_dict.items()):
    for item, score in items:
        user_item_score_list.append([user, item, score])

recall_df = pd.DataFrame(user_item_score_list, columns=['user_id', 'click_article_id', 'pred_score'])

# 获取测试集
tst_click = pd.read_csv(data_path + 'testA_click_log.csv')
tst_users = tst_click['user_id'].unique()

# 从所有的召回数据中将测试集中的用户选出来
tst_recall = recall_df[recall_df['user_id'].isin(tst_users)]

# 生成提交文件
submit(tst_recall, topk=5, model_name='itemcf_baseline')

模型结果

在这里插入图片描述
在这里插入图片描述

提交结果

在这里插入图片描述
在这里插入图片描述

阿里天池新闻推荐项目:召回模型 用户和物品画像:提取user和item的画像信息,生成原始id和编码id之间的映射 (user_index_2_rawid, item_index_2_rawid)获取历史点击中点击数前k篇文章id:get_item_topk_click(trn_hist_click_df, k=50)获取历史点击中点击数前k篇文章id:get_item_topk_click(trn_hist_click_df, k=50)├── 提取用户最后一次点击的文章字典 (last_click_item_dict) 阅读详情

相关推荐

阿里云天池实验室训练自己的数据

本文章的所有代码和相关文章, 仅用于经验技术交流分享,禁止将相关技术应用到不正当途径,滥用技术产生的风险与本人无关。 本文章是自己学习的一些记录。 开始 前几天做实验训练使用google的服务器时间上到了总是掉,然后那天我的室友“画画的baby”和我说有一个类似于google colab的平台,可以训练,虽然也有8小时的显示,但是这两个我可以替换使用,甚至一起跑实验 显卡配置也可以 满足我的需求 这个平台就是 阿里云天池实验室 阿里天池实验室 这个就自己百度阿里云打开网站,选择天池Notebook:

hijacklei的博客 1万+

推荐系统 - 新闻推荐代码

# import packages import time, math, os from tqdm import tqdm import gc import pickle import random from datetime import datetime from operator import itemgetter import numpy as np import pandas as pd import warnings from collections import defaultdict imp

致大尽微 家国天下 2106

实现音乐推荐系统(源代码)

recommendation_engines.py Recommenders.py 推荐系统.ipynb

“天池“淘宝用户消费行为分析——数据导入(方法一)

在Navicat里面根据指示直接导入UserBehavior.csv数据表

weixin_46951551的博客 1351

Lumerical官方案例、FDTD时域有限差分法仿真学习(十八)——Y分支粒子群算法优化

组件优化是任何致力于开发高性能光子器件的设计过程的关键步骤。 此绝缘体上硅 Y 分支示例演示了适用于任意优化例程的通用组件形状参数化方法。 此示例中的算法是 Lumerical 的内置粒子群优化 (PSO),可通过用户界面轻松设置。 此外,建议的优化过程展示了如何将 varFDTD 与全 3D FDTD 求解器相结合,以显着减少优化时间,同时保持高精度。

weixin_45719141的博客 1万+

立创开源桌面激光雕刻机DIY全解析:从悬臂结构、Arduino主控到Marlin固件

本文详细解析了基于立创开源平台的桌面激光雕刻机DIY全过程。重点介绍了悬臂式机械结构的设计与优化,阐述了采用Arduino Mega 2560主控与RAMPS 1.4扩展板的经典控制方案,并深入讲解了Marlin固件的关键配置步骤,包括电机步数计算与激光功能启用,为创客和电子爱好者提供了一套完整的从硬件搭建到软件调试的实战指南。

weixin_42510201的博客 380

天池新闻推荐入门赛之【赛题理解+Baseline】

天池新闻推荐入门赛之【赛题理解+Baseline】Task01 赛题理解 ①赛题说明: 该赛题为推荐系统类,参赛者需要根据用户历史浏览和点击新闻文章的数据信息,预测用户未来的点击行为,即用户最后一次点击的新闻文章。 ②大概实现思路: 分类用户是否点击某篇文章+预测出某个用户最后一次对于某一篇文章会进行点击的概率,进行排序,概率最大的那篇文章为用户最后一次可能点击的新闻文章。 ③数据说明: 该比赛提供的数据集包括30万用户,近300万次点击,共36万多篇不同的新闻文章。三个数据集划分为一个训练集,一个测试集A

执酌的博客 759

基于Arduino的智能垃圾桶

通过本次简单的Arduino智能垃圾桶小实验可以快速了解Arduino的基本用法 1、材料准备 Arduino UNO HC-SR04超声波模块 SG90舵机 杜邦线 电源 电脑 2、代码分析 电机的控制 #include<Servo.h> #define duoji D5 Servo myduoji; void setup() { myduoji.attach(duoji); //舵机连接 Serial.begin(115200); } void loop() { myduoji.w

weixin_41679960的博客 1万+

天池新闻推荐入门赛之【赛题理解+Baseline】Task01

天池新闻推荐入门赛之【赛题理解+Baseline】Task01赛题分析赛题简介数据概况评价方式赛题理解Baseline导包df节省内存函数读取采样或全量数据获取 用户 - 文章 - 点击时间字典获取点击最多的Topk个文章itemCF的物品相似度计算itemCF 的文章推荐给每个用户根据物品的协同过滤推荐文章召回字典转换成df生成提交文件总结1.赛题理解究竟是在理解什么?2.有了赛题理解之后,我们该做什么? 赛题分析 赛题简介 此次比赛是新闻推荐场景下的用户行为预测挑战赛, 该赛题是以新闻APP中的新闻推荐

weixin_44092142的博客 191

前端开发学习--登录和注册页面设计(html和css,可完成两个页面点击切换)

今天学习了登录和注册页面的设计,主要是HTML和CSS部分,注册和切换采用了Js代码进行,后面将通过js进行填写内容的验证,进而可通过JSP跳转到Servlet进行DAO数据的校验,这属于后端部分了。 总体设计思路:整个页面设计可以分为主体(content)、头部(content-header)、内容(content-body)三个部分组成,其中是主体是根部,包含了头部和内容,头部和内容各自下设两...

weixin_43691879的博客 1万+

专项1.CCS代码补全与快捷键优化全攻略

本文全面解析CCS开发环境的代码补全功能与快捷键优化技巧,包括内容辅助触发机制、快捷键自定义配置、编码效率提升方法等实用内容。通过详细步骤指导开发者优化CCS配置,实现高效的代码自动补全和个性化快捷键设置,显著提升嵌入式开发效率。

kotlin6android的博客 222

Task01 天池新闻推荐入门赛之【赛题理解+Baseline】

赛题理解: 根据赛题简介,我们首先要明确我们此次比赛的目标: 根据用户历史浏览点击新闻的数据信息预测用户最后一次点击的新闻文章。从这个目标上看, 会发现此次比赛和我们之前遇到的普通的结构化比赛不太一样, 主要有两点: 一、目标上, 要预测最后一次点击的新闻文章,也就是我们给用户推荐的是新闻文章, 并不是像之前那种预测一个数或者预测数据哪一类那样的问题。 二、数据上, 通过给出的数据我们会发现, 这种数据也不是我们之前遇到的那种特征+标签的数据,而是基于了真实的业务场景, 拿到的用户的点击日志。 所以拿到这个

suotanyu1595的博客 241

QT如何使用CTK插件搭建应用程序框架?

CTK框架,QT框架,插件系统

cs821984831的博客 735

datawhale 推荐系统(新闻推荐)天池新闻推荐入门赛之【赛题理解+Baseline】Task01

遇到的问题 1.服务器上直接用wget 网址的方式下载天池数据失败, baseline采用了传统的CF协同过滤技术,协同过滤的特点就是完全没有利用到物品本身或者是用户自身的属性, 仅仅利用了用户与物品的交互信息就可以实现推荐,比较简单高效, 但这也是它的一个短板所在, 由于无法有效的引入用户年龄, 性别,商品描述,商品分类,当前时间,地点等一系列用户特征、物品特征和上下文特征, 这就造成了有效信息的遗漏,不能充分利用其它特征数据。 具体代码: ```python # import packages imp

sinat_39470268的博客 522

Sigrity Power DC Package Multi-Resistor Compact ET Model Extraction模式提取封装基板电热阻模型

DIE(定义DIE的参数):material设置为silicon(硅),Attach material(贴片的材料,设置为Die Attach),Attach thickness(贴片的材料的厚度,厚度设置为0.001mm,点击ok。Cap为覆盖材料,Material定义材料类型,thickness定义厚度,length和width定义长宽,Adhesive Material为胶的材料,Adhesive Material为胶的厚度,本例不定义,跳过即可。

weixin_54787054的博客 437

OpenLayers6入门,快速搭建Vue+OpenLayers地图脚手架项目

本章针对Vue初学者,对Vue不熟悉,甚至还不会Vue的入门学生读者。本章会详细讲解从环境到环境的各个步骤,再到使用脚手架快速生成项目,以及添加地图库依赖,编写简单的高德地图显示页面的。如果已有VUE项目或者熟悉VUE的读者可以不用看本章,直接添加ol依赖到VUE项目中即可。

GIS技术方向,GIS地图技术分享(GIS入门、Openlayers教程、Leaflet教程),做最好的GIS地图开发教程。关注博主公众号:eguid 5440

基于协同过滤的新闻推荐

这里写自定义目录标题赛题定义以及相关资料代码 赛题定义以及相关资料 新闻推荐赛题:https://tianchi.aliyun.com/competition/entrance/531842/introduction 相关资料: 1天池新闻推荐入门赛之【赛题理解+Baseline】Task01 http://datawhale.club/t/topic/196 2 推荐系统组队学习之协同过滤 http://datawhale.club/t/topic/41 代码 # import packages impo

sukeee的博客 940

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Datawhale新闻推荐竞赛学习总结:Baseline

- 推荐算法:ItemCF,如何计算相似度,如何根据用户历史交互行为推荐 - code:读取采样数据,df 内存优化,Python进度条 tqdm库

Explore 584

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

天池新闻推荐入门赛持续跟进——First one!

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、赛题二、使用步骤1.引入库2.读入数据总结 前言 DataWhale组队学习 Task01 欢迎各方小伙伴一起交流讨论 本文主要内容为针对阿里云天池大赛—— “零基础入门推荐系统之新闻推荐场景下的用户行为预测挑战赛”所做的赛题分析及baseline的初步探究。 一、赛题 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码如下(示例): imp

qq_45068574的博客 1485

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

阿里天池新闻推荐项目:特征工程

使用get_hist_and_last_click函数把训练集、验证集和测试集分别进行历史和最后一次的划分"""获取当前数据的历史点击和最后一次点击:param all_click: 用户全部点击日志:return: 历史点击信息,最后一次点击信息"""# 如果用户只有一个点击,hist为空了,会导致训练的时候这个用户不可见,此时默认泄露一下else:print("划分历史点击信息和最后一次点击信息!")

qq_34517343的博客 1580

(附源码)计算机毕业设计SSM音乐推荐系统

项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:SSM + mybatis + Maven + Vue 等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。

计算机毕设程序设计 4275

天池新闻推荐入门赛-TASK03-多路召回

目录前言一、多路召回概念二、多路召回代码及结果导包读取数据数据预处理数据浏览1.用户点击日志文件(训练集)2.测试集用户点击日志3.新闻文章信息数据表4.新闻文章embedding向量表示数据分析1.用户重复点击2.用户点击环境变化分析3.用户点击新闻数量的分布4.新闻点击次数分析5.新闻共现频次:两篇新闻连续出现的次数6.新闻文章信息7.用户点击的新闻类型的偏好8.用户查看文章的长度的分布9.用户点击新闻的时间分析三、总结 前言 此文是作者参加阿里天池与Datawhale联合发起的新闻推荐场景下的用户行为

liaojq2020的博客 2397
上一篇: pycharm使用笔记
下一篇: 天池新闻推荐入门赛之数据分析
Thinkobj
博客等级 码龄8年 10粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值