在构建推荐系统时,协同过滤算法的性能很大程度上取决于超参数的选择。传统的调优方法往往面临实验跟踪困难、结果对比不直观、重复实验资源浪费等问题。在一次电商推荐系统项目中,我选择了Weights & Biases(W&B)这一MLOps平台来系统化地管理和优化我的协同过滤算法,取得了显著成效。
Weights & Biases提供了一个完整的实验管理生态系统,具有以下突出优势:
项目使用Surprise库实现基于矩阵分解的协同过滤,需要系统化地优化以下超参数:
pip install wandb surprise pandas numpy scikit-learn
import wandb
from surprise import Dataset, Reader, SVD
from surprise.model_selection import cross_validate
import pandas as pd
# 初始化W&B项目
wandb.init(project="collaborative-filtering-optimization",
config={
"learning_rate": 0.005,
"regularization": 0.02,
"n_factors": 100,
"n_epochs": 30
})
# 加载数据
data = pd.read_csv('ratings.csv')
reader = Reader(rating_scale=(1, 5))
surprise_data = Dataset.load_from_df(data[['user_id', 'item_id', 'rating']], reader)
# 基准模型配置
config = wandb.config
# 创建并评估模型
model = SVD(
lr_all=config.learning_rate,
reg_all=config.regularization,
n_factors=config.n_factors,
n_epochs=config.n_epochs,
verbose=False
)
# 交叉验证
results = cross_validate(model, surprise_data, measures=['RMSE', 'MAE'], cv=5, verbose=False)
# 记录结果到W&B
wandb.log({
"rmse": results['test_rmse'].mean(),
"mae": results['test_mae'].mean(),
"fit_time": results['fit_time'].mean(),
"test_time": results['test_time'].mean()
})
wandb.finish()
def train():
# 初始化W&B运行
run = wandb.init()
config = run.config
# 创建模型
model = SVD(
lr_all=config.lr,
reg_all=config.reg,
n_factors=config.n_factors,
n_epochs=config.n_epochs,
verbose=False
)
# 交叉验证
results = cross_validate(model, surprise_data, measures=['RMSE'], cv=3, verbose=False)
rmse = results['test_rmse'].mean()
# 记录结果
run.log({"rmse": rmse})
run.finish()
return rmse
# 定义超参数搜索空间
sweep_config = {
'method': 'bayes', # 使用贝叶斯优化
'metric': {
'name': 'rmse',
'goal': 'minimize'
},
'parameters': {
'lr': {
'distribution': 'log_uniform',
'min': 1e-5,
'max': 1e-1
},
'reg': {
'distribution': 'log_uniform',
'min': 1e-5,
'max': 1e-1
},
'n_factors': {
'distribution': 'int_uniform',
'min': 10,
'max': 200
},
'n_epochs': {
'distribution': 'int_uniform',
'min': 10,
'max': 100
}
},
'early_terminate': {
'type': 'hyperband',
'min_iter': 3,
'max_iter': 10
}
}
# 创建并启动超参数搜索
sweep_id = wandb.sweep(sweep_config, project="collaborative-filtering-optimization")
wandb.agent(sweep_id, function=train, count=100)
# 连接API获取实验结果
api = wandb.Api()
runs = api.runs("username/collaborative-filtering-optimization")
# 分析最佳运行结果
best_run = min(runs, key=lambda run: run.summary.get('rmse', float('inf')))
print(f"最佳RMSE: {best_run.summary['rmse']}")
print(f"最佳参数: {best_run.config}")
# 可视化参数重要性
import matplotlib.pyplot as plt
# 提取所有运行数据
runs_data = []
for run in runs:
if 'rmse' in run.summary:
runs_data.append({
'rmse': run.summary['rmse'],
'lr': run.config.get('lr', None),
'reg': run.config.get('reg', None),
'n_factors': run.config.get('n_factors', None),
'n_epochs': run.config.get('n_epochs', None)
})
# 创建参数相关性分析
df = pd.DataFrame(runs_data)
correlation_matrix = df.corr()
# 记录分析结果
wandb.log({"parameter_correlations": wandb.Table(dataframe=correlation_matrix.reset_index())})
# 保存最佳模型
best_config = best_run.config
best_model = SVD(
lr_all=best_config['lr'],
reg_all=best_config['reg'],
n_factors=best_config['n_factors'],
n_epochs=best_config['n_epochs']
)
# 全量训练
trainset = surprise_data.build_full_trainset()
best_model.fit(trainset)
# 创建W&B Artifact保存模型
artifact = wandb.Artifact('best_cf_model', type='model')
with artifact.new_file('model.pkl', mode='wb') as f:
import pickle
pickle.dump(best_model, f)
# 添加元数据
artifact.metadata = {
'algorithm': 'SVD',
'dataset': 'user_ratings',
'performance': best_run.summary['rmse']
}
# 记录Artifact
run = wandb.init(project="model-registry")
run.log_artifact(artifact)
run.finish()
通过Weights & Biases的系统化优化,我们实现了:
W&B的实验跟踪功能让我们能够系统化地管理数百次实验,避免了传统方法中常见的"实验混乱"问题。每次实验的配置、代码版本、结果都自动记录,确保了完全的可复现性。
通过W&B的平行坐标图和参数重要性可视化,我们发现:
与传统网格搜索相比,贝叶斯优化在超参数搜索中表现出色:
通过W&B Artifacts,我们建立了完整的模型版本控制系统:
# wandb-sweep.yaml
program: train.py
method: bayes
metric:
name: rmse
goal: minimize
early_terminate:
type: hyperband
min_iter: 3
max_iter: 10
parameters:
lr:
distribution: log_uniform
min: 0.00001
max: 0.1
reg:
distribution: log_uniform
min: 0.00001
max: 0.1
n_factors:
distribution: int_uniform
min: 10
max: 200
n_epochs:
distribution: int_uniform
min: 10
max: 100
Weights & Biases为协同过滤算法的优化提供了一个完整、系统的解决方案。它不仅简化了超参数调优过程,还极大地提高了实验管理的效率和结果的可复现性。
通过这次实践,我深刻认识到现代MLOps工具在机器学习项目中的价值。它们不仅提供了技术解决方案,更重要的是建立了一种系统化、可协作的工作流程,这对于长期项目和团队合作尤为重要。
未来的工作中,我计划将W&B应用于更复杂的推荐场景,包括深度学习和强化学习-based的推荐算法,进一步探索其在模型监控和A/B测试方面的应用潜力。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。