共计 2479 个字符,预计需要花费 7 分钟才能阅读完成。
背景痛点
Amazon Beauty 数据集是研究推荐系统的经典数据集之一,但它也带来了一些独特的挑战。这个数据集包含了用户对美容产品的评分和评论,但实际使用时会发现几个主要问题:

- 数据稀疏性 :大多数用户只评价了极少数商品,导致用户 - 商品交互矩阵非常稀疏。
- 长尾分布 :热门商品获得大量评价,而大多数商品只有少量评价。
- 噪声数据 :存在异常评分、重复记录和时间戳格式不统一等问题。
这些特点使得直接应用传统推荐算法效果不佳,需要进行专门的数据处理和特征工程。
技术方案
数据清洗
使用 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)]
特征工程
构建用户 - 商品交互矩阵有三种常用方法:
- CountVectorizer:简单统计用户与商品的交互次数
- TF-IDF:考虑商品在整个数据集中的重要性
- 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)
开放性问题
- 如何利用评论文本信息进一步提升推荐质量?
- 对于全新的用户和商品,有哪些更有效的冷启动策略?
希望这篇指南能帮助你快速上手 Amazon Beauty 数据集,并构建出高质量的推荐系统。在实际应用中,记得根据具体业务需求调整参数和方法。
正文完
