KDD Cup 2020 - Debiasing:user-item feature

这篇博客分析了KDD Cup 2020的数据,探讨了用户-项目点击分布、用户画像特征(性别、年龄、城市)与点击的关系。研究发现,有用户画像的用户更倾向于多次点击稀有物品,点击分布具有周期性和正态性,并且年龄和性别可能影响点击行为。
摘要由CSDN通过智能技术生成

Written by wanping7

from datetime import datetime

# data process
import numpy as np, pandas as pd
from  datetime import datetime, timedelta

# visualize
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
%config ZMQInteractiveShell.ast_node_interactivity='all'

import plotly.express as px
import plotly.graph_objects as go
import plotly.figure_factory as ff
from plotly.subplots import make_subplots

# sys
import os, sys


import warnings
warnings.filterwarnings('ignore')

# 大小设置
sns.set(rc={
   'figure.figsize':(13,7)})
# 风格设置
sns.set_style("whitegrid")


PATH = "../data/"

结论

每个CSV文件用户-项目点击分布

  • 用户点击:呈现右尾分布,log1p近似正态。
  • 项目被点击:呈现右尾分布,但是在点击量很高的商品中也出现了一个峰,可能是热点商品。
  • 时间【最小,90分位数,最大】分布:发现时间随文件重心慢慢转移,说明文件分割是有一定时间顺序。每个均为四个峰左右,说明是四五天左右的数据。
  • 每个文件:用户量1700 、项目项4100
  • 整体文件:用户量2900 、项目项8900

整体CSV文件用户-项目点击分布

  • 1546265点击中,将近一半有重复点击
  • 时间分布:
    • 9个峰,大概是前后9天的数据
    • 最左边与最右边数据量较中间小,可能左右并非完整的一天数据或者中间包含节假日、促销等成分

用户画像与用户点击

  • 用户画像中有6786个用户,整个训练点击数据用户量在29128,说明有用户画像的只是一部分。
  • 用户画像中三个用户重复信息:两个用户年龄变化(更新),一个用户城市变化。

合并数据分布

以下分析均为有用户画像的点击数据

  • 这些有用户画像的数据:
    • 用户点击量较整体大
    • 项目点击量较整体小
    • 总结:这些有用户画像的人,更爱多次点击那种稀有的物件(可能是需要反复对比的奢饰品牌)

有用户画像——性别、年龄、城市分布

  • 男女随时间点击趋势均呈现周期性(天)
  • 各年龄阶段的访问量大致呈正态分布
  • 从城市level看不出城市背后的真实等级
  • 男女在年龄上的点击量存在差异性,比如年龄阶段6
  • 男女在城市上的点击量差异性看不出。
TEST_PATH = PATH + "underexpose_test/"
TEST_DIRS = os.listdir(TEST_PATH)
TEST_FILES = [i for i in TEST_DIRS if ("underexpose_test_" in i) and ".csv" in i]
TEST_FILES
# # 输出所有文件和文件夹
# for file in dirs:
#     print(file)
['underexpose_test_click-0.csv',
 'underexpose_test_click-1.csv',
 'underexpose_test_click-2.csv',
 'underexpose_test_click-3.csv',
 'underexpose_test_click-4.csv',
 'underexpose_test_click-5.csv',
 'underexpose_test_qtime-0.csv',
 'underexpose_test_qtime-1.csv',
 'underexpose_test_qtime-2.csv',
 'underexpose_test_qtime-3.csv',
 'underexpose_test_qtime-4.csv',
 'underexpose_test_qtime-5.csv']
TRAIN_PATH = PATH + "underexpose_train/"
TRAIN_DIRS = os.listdir(TRAIN_PATH)
TRAIN_FILES = [i for i in TRAIN_DIRS if ("underexpose_" in i) and ".csv" in i]
TRAIN_FILES
# # 输出所有文件和文件夹
# for file in dirs:
#     print(file)
['underexpose_item_feat.csv',
 'underexpose_train_click-0.csv',
 'underexpose_train_click-1.csv',
 'underexpose_train_click-2.csv',
 'underexpose_train_click-3.csv',
 'underexpose_train_click-4.csv',
 'underexpose_train_click-5.csv',
 'underexpose_user_feat.csv']
TRAIN_PATH = PATH + "underexpose_train/"

Click特征

  • underexpose_train_click-T.csv/underexpose_test_click-T.csv

    • user_id
    • item_id
    • time:点击事件发生时的时间戳,即(unix_timestamp - random_number_1)/ random_number_2

1 训练Click特征

1.1 每个CSV文件用户-项目点击分布

  • 用户点击:呈现右尾分布,log1p近似正态。
  • 项目被点击:呈现右尾分布,但是在点击量很高的商品中也出现了一个峰,可能是热点商品。
  • 时间【最小,90分位数,最大】分布:发现时间随文件重心慢慢转移,说明文件分割是有一定时间顺序。每个均为四个峰左右,说明是四五天左右的数据。
  • 每个文件:用户量1700 、项目项4100
  • 整体文件:用户量2900 、项目项8900
# 大小设置
sns.set(rc={
   'figure.figsize':(17, 3)})
# 风格设置
sns.set_style("whitegrid")


TRAIN_CLICK_FILES = [i for i in TRAIN_FILES if "underexpose_train_click" in i]
names=["user_id", "item_id", "time"]
for i, TRAIN_CLICK_FILE in enumerate(TRAIN_CLICK_FILES):

    train_click = pd.read_csv(TRAIN_PATH + TRAIN_CLICK_FILE, header=None, names=names)
    #################### 拼接所有train_click数据
    if i == 0:
        merge_train_click = train_click
    else:
        merge_train_click = pd.concat([merge_train_click, train_click], axis=0)
    #################### 用户click统计
    user = train_click[["user_id"]].groupby(["user_id"]).size().reset_index()
    user.columns = ["user_id", "click"]
    #################### 项目click统计
    item = train_click[["item_id"]].groupby(["item_id"]).size().reset_index()
    item.columns = ["item_id", "click"]

    #################### 用户、项目click可视化
    f, axes = plt.subplots(1, 5)
    ######## user-click
    g0 = sns.kdeplot(user["click"], color="Red", shade = True, ax=axes[0])
    x = g0.set_xlabel("user-click")
    x = g0.set_ylabel("Frequency")
    g = g0.legend([TRAIN_CLICK_FILE])
    ## user-click log
    g01 = sns.kdeplot(np.log(user["click"]), color="Red", shade = True, ax=axes[1])
    x = g01.set_xlabel("LOG_user-click")
    x = g01.set_ylabel("Frequency")
    g = g01.legend([TRAIN_CLICK_FILE])
    ######## item-click
    g1 = sns.kdeplot(item["click"], color="Blue", shade = True, ax=axes[2])
    x = g1.set_xlabel("item-click")
    x = g1.set_ylabel("Frequency")
    g1 = g1.legend([TRAIN_CLICK_FILE])
    ## item-click log
    g11 = sns.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值