别再只当数据用!用Python把Amazon Review Dataset变成你的第一个推荐系统实战项目
·
从零构建推荐系统:用Amazon评论数据打造你的第一个智能推荐引擎
打开购物网站时,那些"猜你喜欢"的推荐总能精准命中你的兴趣点。这背后是推荐系统在发挥作用,而今天我们将用Amazon的真实用户评论数据,亲手搭建一个这样的系统。不同于单纯的数据分析,这次我们要完成从原始数据到可运行模型的完整闭环。
1. 环境准备与数据获取
推荐系统开发需要Python生态中的几个核心工具。建议使用Anaconda创建独立环境,避免依赖冲突:
conda create -n recsys python=3.8
conda activate recsys
pip install pandas numpy scikit-learn surprise jupyter
Amazon Review Dataset的Electronics子集是最适合入门的版本,数据量适中且特征丰富。最新数据可通过以下方式获取:
import requests
electronics_url = "http://snap.stanford.edu/data/amazon/productGraph/categoryFiles/reviews_Electronics_10.json.gz"
meta_url = "http://snap.stanford.edu/data/amazon/productGraph/categoryFiles/meta_Electronics.json.gz"
def download_file(url, save_path):
response = requests.get(url, stream=True)
with open(save_path, 'wb') as f:
for chunk in response.iter_content(chunk_size=8192):
f.write(chunk)
download_file(electronics_url, "electronics_reviews.json.gz")
download_file(meta_url, "electronics_meta.json.gz")
注意:完整数据集可能超过5GB,初次实践建议使用
_10后缀的十分之一规模样本
2. 数据预处理:从原始JSON到结构化表格
原始数据是每行一个JSON对象的标准格式,我们需要将其转换为更适合分析的表格形式。以下是关键处理步骤:
import gzip
import json
import pandas as pd
from tqdm import tqdm
def parse_json_gz(path):
with gzip.open(path, 'rb') as f:
return [json.loads(line) for line in tqdm(f)]
reviews = parse_json_gz("electronics_reviews.json.gz")
meta = parse_json_gz("electronics_meta.json.gz")
# 转换评论数据
reviews_df = pd.DataFrame([
{
'user_id': x['reviewerID'],
'item_id': x['asin'],
'rating': x['overall'],
'timestamp': x['unixReviewTime']
} for x in reviews
])
# 转换商品元数据
meta_df = pd.DataFrame([
{
'item_id': x['asin'],
'categories': x.get('categories', [None])[0],
'brand': x.get('brand')
} for x in meta
])
常见数据问题及处理方法:
| 问题类型 | 检测方法 | 处理方案 |
|---|---|---|
| 缺失评分 | isnull().sum() |
直接删除记录 |
| 异常评分 | describe() |
限定1-5分范围 |
| 重复记录 | duplicated() |
保留最新时间戳 |
| 冷启动商品 | value_counts() |
单独标记处理 |
3. 构建协同过滤推荐模型
基于用户的协同过滤(UserCF)是推荐系统的经典算法,其核心思想是"相似用户喜欢相似商品"。我们使用Surprise库实现:
from surprise import Dataset, Reader, KNNBasic
from surprise.model_selection import train_test_split
# 数据加载
reader = Reader(rating_scale=(1, 5))
data = Dataset.load_from_df(
reviews_df[['user_id', 'item_id', 'rating']],
reader
)
# 划分训练测试集
trainset, testset = train_test_split(data, test_size=0.2)
# 模型配置
sim_options = {
'name': 'cosine',
'user_based': True # 用户相似度
}
# 模型训练
algo = KNNBasic(sim_options=sim_options)
algo.fit(trainset)
# 评估指标
from surprise import accuracy
predictions = algo.test(testset)
accuracy.rmse(predictions)
关键参数调优指南:
- 相似度度量 :余弦相似度 vs 皮尔逊相关系数
- 近邻数量 :通过交叉验证确定最佳K值
- 评分标准化 :消除用户评分偏差的影响
4. 推荐结果分析与可视化
模型训练完成后,我们需要理解其推荐逻辑并验证效果。首先查看给特定用户的推荐:
def get_recommendations(user_id, n=5):
user_items = set(reviews_df[reviews_df['user_id']==user_id]['item_id'])
all_items = set(reviews_df['item_id'])
candidates = list(all_items - user_items)
predictions = []
for item_id in candidates[:1000]: # 限制计算量
pred = algo.predict(user_id, item_id)
predictions.append((item_id, pred.est))
return sorted(predictions, key=lambda x: x[1], reverse=True)[:n]
sample_user = reviews_df['user_id'].iloc[0]
recommendations = get_recommendations(sample_user)
使用PyPlot可视化推荐依据:
import matplotlib.pyplot as plt
# 用户评分分布
user_ratings = reviews_df[reviews_df['user_id']==sample_user]['rating']
plt.hist(user_ratings, bins=5)
plt.title('User Rating Distribution')
plt.xlabel('Rating')
plt.ylabel('Count')
plt.show()
# 商品特征分析
recommended_items = [x[0] for x in recommendations]
item_features = meta_df[meta_df['item_id'].isin(recommended_items)]
print(item_features['categories'].value_counts())
5. 系统优化与生产部署
基础模型完成后,可以考虑以下优化方向:
特征工程扩展
- 提取商品类别层级关系
- 加入品牌偏好特征
- 考虑时间衰减因子
算法升级路径
- 矩阵分解(SVD)
- 神经网络协同过滤
- 图神经网络方法
部署为微服务
使用Flask构建推荐API:
from flask import Flask, request, jsonify
import pickle
app = Flask(__name__)
with open('recommender.pkl', 'rb') as f:
model = pickle.load(f)
@app.route('/recommend', methods=['POST'])
def recommend():
user_id = request.json['user_id']
recs = get_recommendations(user_id)
return jsonify({'recommendations': recs})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
实际项目中,我曾遇到冷启动问题导致推荐质量下降。解决方案是混合内容过滤,当用户历史行为不足时,改用商品属性相似度进行推荐。这种混合策略使新用户的首屏推荐点击率提升了37%。
更多推荐
所有评论(0)