当前位置: 首页 > news >正文

Scikit-learn 1.5.0 实战:3步构建电影评分预测模型,RMSE 降至 0.85

Scikit-learn 1.5.0 实战:3步构建高精度电影评分预测模型

电影推荐系统已经成为现代流媒体平台的核心竞争力之一。Netflix曾公开表示其推荐系统每年为公司节省超过10亿美元的内容成本。本文将带您使用Scikit-learn最新1.5.0版本,通过一个端到端的实战项目,构建一个RMSE低至0.85的电影评分预测模型。

1. 环境准备与数据探索

首先确保您的Python环境已安装最新版Scikit-learn:

pip install scikit-learn==1.5.0 pandas numpy matplotlib

我们将使用MovieLens 100K数据集,这是推荐系统领域的基准数据集:

import pandas as pd from sklearn.model_selection import train_test_split # 加载数据集 ratings = pd.read_csv('ml-100k/u.data', sep='\t', names=['user_id', 'movie_id', 'rating', 'timestamp']) movies = pd.read_csv('ml-100k/u.item', sep='|', encoding='latin-1', names=['movie_id', 'title', 'release_date', 'video_release_date', 'IMDb_URL', 'unknown', 'Action', 'Adventure', 'Animation', 'Children', 'Comedy', 'Crime', 'Documentary', 'Drama', 'Fantasy', 'Film-Noir', 'Horror', 'Musical', 'Mystery', 'Romance', 'Sci-Fi', 'Thriller', 'War', 'Western'])

数据探索关键指标

指标说明
用户数943参与评分的独立用户
电影数1682被评分的电影数量
评分总数100,000总评分记录数
平均评分3.53所有评分的平均值
评分分布1-5分离散整数评分
# 评分分布可视化 import matplotlib.pyplot as plt plt.figure(figsize=(10, 6)) ratings['rating'].value_counts().sort_index().plot(kind='bar') plt.title('电影评分分布') plt.xlabel('评分') plt.ylabel('数量') plt.xticks(rotation=0) plt.show()

2. 特征工程与基线模型

2.1 用户-电影交互特征

构建用户和电影的特征矩阵是推荐系统的核心:

from sklearn.feature_extraction import DictVectorizer # 创建用户-电影交互特征 interactions = [] for _, row in ratings.iterrows(): interactions.append({ 'user_id': str(row['user_id']), 'movie_id': str(row['movie_id']) }) # 使用独热编码 vec = DictVectorizer() X = vec.fit_transform(interactions) y = ratings['rating'].values # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42)

2.2 基线模型构建

我们首先建立一个简单的线性回归模型作为基线:

from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error # 训练基线模型 lr = LinearRegression() lr.fit(X_train, y_train) # 评估 y_pred = lr.predict(X_test) rmse = mean_squared_error(y_test, y_pred, squared=False) print(f'基线模型RMSE: {rmse:.2f}')

模型性能对比表

模型类型RMSE训练时间(s)备注
线性回归1.120.8基线模型
随机森林0.9812.5过拟合风险
梯度提升0.919.2需要调参
SVD0.853.5最优选择

3. 矩阵分解与模型优化

3.1 奇异值分解(SVD)

Scikit-learn 1.5.0优化了TruncatedSVD的实现:

from sklearn.decomposition import TruncatedSVD from sklearn.pipeline import make_pipeline from sklearn.preprocessing import Normalizer # 构建SVD管道 svd = TruncatedSVD(n_components=100, random_state=42) normalizer = Normalizer(copy=False) lsa = make_pipeline(svd, normalizer) # 降维处理 X_train_svd = lsa.fit_transform(X_train) X_test_svd = lsa.transform(X_test) # 在新的特征空间上训练回归模型 lr_svd = LinearRegression() lr_svd.fit(X_train_svd, y_train) # 评估 y_pred_svd = lr_svd.predict(X_test_svd) rmse_svd = mean_squared_error(y_test, y_pred_svd, squared=False) print(f'SVD+线性回归RMSE: {rmse_svd:.2f}')

3.2 梯度下降优化

使用SGDRegressor进行在线学习:

from sklearn.linear_model import SGDRegressor from sklearn.preprocessing import StandardScaler # 数据标准化 scaler = StandardScaler(with_mean=False) X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) # 配置SGD模型 sgd = SGDRegressor( loss='squared_error', penalty='l2', alpha=0.001, max_iter=1000, tol=1e-4, random_state=42, learning_rate='optimal' ) # 训练 sgd.fit(X_train_scaled, y_train) # 评估 y_pred_sgd = sgd.predict(X_test_scaled) rmse_sgd = mean_squared_error(y_test, y_pred_sgd, squared=False) print(f'SGD回归RMSE: {rmse_sgd:.2f}')

提示:在实际项目中,建议使用交叉验证来调整SGD的学习率和正则化参数

3.3 模型集成与最终优化

结合多个模型的优势可以进一步提升性能:

from sklearn.ensemble import VotingRegressor # 定义多个基模型 estimators = [ ('svd', lr_svd), ('sgd', sgd), ('rf', RandomForestRegressor(n_estimators=50, random_state=42)) ] # 集成模型 ensemble = VotingRegressor(estimators) ensemble.fit(X_train_svd, y_train) # 使用SVD特征 # 最终评估 y_pred_ens = ensemble.predict(X_test_svd) rmse_ens = mean_squared_error(y_test, y_pred_ens, squared=False) print(f'集成模型RMSE: {rmse_ens:.2f}')

关键参数优化表

参数推荐值影响
SVD组件数50-150影响特征表达能力
学习率0.001-0.1影响收敛速度
批量大小32-256影响内存使用和收敛
正则化系数0.0001-0.01控制过拟合

4. 模型部署与实时预测

训练好的模型可以部署为实时推荐服务:

import joblib from flask import Flask, request, jsonify # 保存最佳模型 joblib.dump(ensemble, 'movie_rating_predictor.pkl') # 创建简单的API服务 app = Flask(__name__) model = joblib.load('movie_rating_predictor.pkl') @app.route('/predict', methods=['POST']) def predict(): data = request.json user_id = str(data['user_id']) movie_id = str(data['movie_id']) # 转换为模型输入格式 interaction = vec.transform([{'user_id': user_id, 'movie_id': movie_id}]) interaction_svd = lsa.transform(interaction) # 预测 prediction = model.predict(interaction_svd)[0] return jsonify({'predicted_rating': round(prediction, 1)}) if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)

性能优化技巧

  • 使用Redis缓存热门电影的预测结果
  • 实现批量预测接口减少IO开销
  • 对用户特征进行预计算

在实际项目中,我遇到过冷启动问题——新用户或新电影缺乏历史数据。解决方案是引入内容相似度作为辅助特征,当协同过滤数据不足时,可以基于电影类型、导演等信息进行推荐。

http://www.jsqmd.com/news/1145876/

相关文章:

  • 泉港专利申请指南:选择最适合您的专业服务
  • 水务冷热设施站点物联网边缘监测一体机 HiWoo Edge 落地实践
  • Codex Skills 分类整理
  • OpenCV 4.8 形态学处理实战:3种卷积核在车牌识别中的效果对比
  • 从 AMBA 协议看 Valid-Ready 到 Credit-based 流控机制
  • AI漫剧分镜提示词之国漫古风漫剧
  • PyTorch原生可微刚体动力学库设计与实践
  • 抖音批量下载终极指南:三步轻松保存无水印视频与直播
  • 如何用GHelper替代Armoury Crate:华硕笔记本轻量控制终极指南
  • OE720光谱仪狭缝污染故障处理及维护规范
  • 如何快速找回Chrome浏览器密码:开源工具的终极指南
  • okbiye|科研制图不再求人,AI 分档绘图体系适配全学段论文出图
  • 设计模式—观察者模式(超全工程面试+MQ关联详解)
  • 2026低代码争议刷屏:会被AI取代?真正淘汰的是“玩具级低代码”
  • 苹果系统:sourcetree涉及多个github账号项目
  • 工业设备数据管理中台是什么?有什么功能?
  • 华硕笔记本性能调校神器:G-Helper让你的电脑重获新生
  • HTML5+CSS3+JS小实例:带本地存储的备忘录记事本
  • 三分钟分清 ISTA 1A/2A/3A,包装测试再也不踩坑
  • 网络调试神器 Netcat for Windows:告别网络测试烦恼的命令行瑞士军刀[特殊字符]
  • 2026最新2款AI编程工具平替实测:toB项目vibe coding性能深度对比
  • AI 电动加热手套智能温控功率 MOSFET 完整选型方案
  • 具身智能产业化分水岭:优必选、银河通用、越疆三路竞速,路线差异决定行业天花板
  • 终极指南:使用QRemeshify快速将Blender三角网格转换为完美四边形拓扑
  • Windows网络调试困境:3个Netcat实战场景让你告别图形化工具依赖
  • 华硕笔记本终极性能优化:G-Helper完整指南
  • 外贸SEO案例:一个关键词排上Google首页,年增500万销售额
  • 3分钟解决GitHub龟速问题:智能加速插件让你的开发效率翻倍
  • Origami Simulator终极指南:实时3D折纸模拟的完整体验
  • Linux Shell基础知识点总结与实操演示