Amazon Beauty数据集实战指南:从数据清洗到推荐系统构建

1次阅读
没有评论

共计 2479 个字符,预计需要花费 7 分钟才能阅读完成。

image.webp

背景痛点

Amazon Beauty 数据集是研究推荐系统的经典数据集之一,但它也带来了一些独特的挑战。这个数据集包含了用户对美容产品的评分和评论,但实际使用时会发现几个主要问题:

Amazon Beauty 数据集实战指南:从数据清洗到推荐系统构建

  1. 数据稀疏性 :大多数用户只评价了极少数商品,导致用户 - 商品交互矩阵非常稀疏。
  2. 长尾分布 :热门商品获得大量评价,而大多数商品只有少量评价。
  3. 噪声数据 :存在异常评分、重复记录和时间戳格式不统一等问题。

这些特点使得直接应用传统推荐算法效果不佳,需要进行专门的数据处理和特征工程。

技术方案

数据清洗

使用 Pandas 进行数据清洗是第一步。我们需要处理缺失值、异常值,并标准化时间戳。

import pandas as pd
import numpy as np

# 加载数据
df = pd.read_csv('amazon_beauty.csv')

# 处理缺失值
df = df.dropna(subset=['reviewText', 'overall'])

# 标准化时间戳
df['unixReviewTime'] = pd.to_datetime(df['unixReviewTime'], unit='s')
df['reviewTime'] = pd.to_datetime(df['reviewTime'])

# 检测并处理异常评分
mean_rating = df['overall'].mean()
std_rating = df['overall'].std()
df = df[(df['overall'] >= mean_rating - 3*std_rating) & 
        (df['overall'] <= mean_rating + 3*std_rating)]

特征工程

构建用户 - 商品交互矩阵有三种常用方法:

  1. CountVectorizer:简单统计用户与商品的交互次数
  2. TF-IDF:考虑商品在整个数据集中的重要性
  3. Word2Vec:捕捉用户行为和商品之间的语义关系
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from gensim.models import Word2Vec

# CountVectorizer 方法
cv = CountVectorizer()
user_item_matrix = cv.fit_transform(df.groupby('reviewerID')['asin'].apply(' '.join))

# TF-IDF 方法
tfidf = TfidfVectorizer()
user_item_matrix_tfidf = tfidf.fit_transform(df.groupby('reviewerID')['asin'].apply(' '.join))

# Word2Vec 方法
sentences = [[item for item in group['asin']] 
             for _, group in df.groupby('reviewerID')]
model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, workers=4)

模型实现

LightFM 是一个优秀的混合推荐系统框架,特别适合处理冷启动问题。

from lightfm import LightFM
from lightfm.data import Dataset

# 创建数据集
dataset = Dataset()
dataset.fit(users=df['reviewerID'].unique(), 
           items=df['asin'].unique(),
           item_features=df['category'].unique())

# 构建交互矩阵和特征
(interactions, weights) = dataset.build_interactions([(row['reviewerID'], row['asin']) 
                                                     for _, row in df.iterrows()])
item_features = dataset.build_item_features([(row['asin'], [row['category']]) 
                                            for _, row in df.iterrows()])

# 训练模型
model = LightFM(loss='warp')
model.fit(interactions, item_features=item_features, epochs=20)

避坑指南

交叉验证防止数据泄漏

在推荐系统中,时间顺序非常重要。我们应该使用时序交叉验证:

from lightfm.evaluation import auc_score

train = interactions[:int(0.8*len(df))]
test = interactions[int(0.8*len(df)):]

model.fit(train, epochs=20)
test_auc = auc_score(model, test, train_interactions=train).mean()

负采样策略

对于隐式反馈数据,合理的负采样可以显著提升模型性能:

from lightfm import LightFM

# 使用 BPR 损失函数,它自动处理负采样
model = LightFM(loss='bpr')
model.fit(interactions, epochs=20)

性能优化

Cython 加速

LightFM 本身使用 Cython 优化,但我们还可以进一步加速特征计算:

# 在模型初始化时设置线程数
model = LightFM(loss='warp', num_threads=4)

分布式训练

对于大数据集,可以使用分布式训练:

# 使用多核并行训练
model.fit(interactions, epochs=20, num_threads=8)

开放性问题

  1. 如何利用评论文本信息进一步提升推荐质量?
  2. 对于全新的用户和商品,有哪些更有效的冷启动策略?

希望这篇指南能帮助你快速上手 Amazon Beauty 数据集,并构建出高质量的推荐系统。在实际应用中,记得根据具体业务需求调整参数和方法。

正文完
 0
评论(没有评论)