跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

基于 Flask 与机器学习的电影推荐及票房预测系统

综述由AI生成该电影推荐与票房预测系统基于 Python Flask 框架构建,整合了 MySQL 数据存储、Requests 爬虫采集及 Echarts 可视化技术。核心算法采用 Surprise 库的 KNNWithZScore 实现个性化推荐,并利用决策树、Lasso、随机森林与 GDBT 的 Stacking 集成学习模型提升票房预测精度。系统包含数据大屏、用户管理及后台维护功能,支持三级角色权限控制,旨在解决选片难与行业预测盲目问题,提供直观的数据展示与决策参考。

乱七八糟发布于 2026/4/5更新于 2026/6/1122 浏览
基于 Flask 与机器学习的电影推荐及票房预测系统

项目概述

在海量影视内容面前,用户往往面临选片困难,而行业内部对于票房走势的预判也常缺乏数据支撑。本项目旨在构建一个整合数据采集、智能推荐与票房预测的综合系统,通过技术手段解决上述痛点。

系统采用 Python 作为核心开发语言,后端依托 Flask 框架搭建 Web 服务,MySQL 负责持久化存储。前端结合 HTML 与 Echarts 实现可视化大屏展示。算法层面,引入 Surprise 库中的 KNNWithZScore 算法进行个性化推荐,并采用 Stacking 集成学习策略(融合决策树、Lasso、随机森林与 GDBT)显著提升票房预测的精度。

技术架构

  • 开发语言:Python
  • Web 框架:Flask
  • 数据库:MySQL
  • 爬虫工具:requests
  • 可视化工具:Echarts, Matplotlib, Seaborn
  • 机器学习:Scikit-learn (Stacking, RandomForest, Lasso, etc.), Surprise
  • 数据处理:Pandas, NumPy

功能模块详解

1. 数据采集与存储

系统首先通过 requests 爬虫抓取互联网上的电影原始数据,经过清洗、规整后存入 MySQL 数据库。这一步骤为后续的预测模型和推荐算法提供了完整且规范的数据源支撑。

2. 电影票房预测

这是系统的核心亮点之一。用户只需在下拉框中选择目标电影,系统便会调用训练好的 Stacking 集成学习模型计算票房。该流程实现了从'选择电影'到'获取预测结果'的闭环,为行业决策提供直观参考。

3. 电影推荐

针对用户个性化需求,系统利用 KNNWithZScore 算法生成 Top10 推荐列表。用户选定一部电影后,即可看到与其风格或受众高度相似的其他影片,有效解决了'不知道看什么'的问题。

4. 数据可视化展示

为了更直观地呈现数据特征,系统设计了两个主要的大屏界面:

  • 电影数据大屏:涵盖类型统计、国家分布、年度评分趋势、演员排名及票房 Top 榜单。
  • 评论分析大屏:包含年度评论用户数、词云分析及热门电影分布,帮助用户快速把握舆论热度。

5. 权限管理

系统支持三级角色登录(普通用户、管理员、后台管理员)。普通用户可浏览数据和获取推荐;管理员负责电影信息的增删维护;后台管理员则专注于系统核心数据的完整性保障。

界面展示

电影数据可视化大屏

多板块布局呈现各类关键指标,包括电影类型数量、上映国家分布、年度数量与评分趋势等。图表与列表结合的形式让用户能迅速掌握行业特征。

电影数据可视化大屏

票房预测与推荐交互

提供简洁的下拉交互入口,用户选定目标电影后,系统即时反馈预测结果或推荐列表。左侧导航栏支持在不同功能模块间快速切换。

电影票房预测

电影推荐

算法实现细节

在票房预测环节,我们并未单一依赖某个模型,而是采用了 Stacking 集成学习策略。具体思路如下:

  1. 数据预处理:对票房数据进行 log1p 转换,使其分布更接近正态分布,有利于线性回归类模型的收敛。
  2. 基学习器训练:分别训练决策树 (Decision Tree)、Lasso 回归、随机森林 (Random Forest) 和梯度提升树 (GDBT)。每个模型都通过网格搜索 (GridSearchCV) 优化了超参数。
  3. 元学习器融合:将上述四个模型的预测结果作为新特征,输入到线性回归 (Linear Regression) 中进行二次训练,从而获得最终的预测值。

这种组合方式能有效降低单一模型的方差与偏差,提高泛化能力。

核心代码解析

以下是票房预测模型训练与集成的关键逻辑。注意数据划分与模型保存路径的处理。

import re
import os
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor
from sklearn.metrics import make_scorer, mean_squared_error
from sklearn.metrics import r2_score
from sklearn.model_selection import GridSearchCV, train_test_split
from sklearn.model_selection import KFold
from sklearn.tree import DecisionTreeRegressor
from sklearn.linear_model import LinearRegression as LR, Lasso
import joblib
import seaborn as sns

# 设置模型保存路径
model_save_path = r'./app/dataset/testModel/'
if not os.path.exists(model_save_path):
    os.makedirs(model_save_path)

# 读取数据并选取关键特征
data = pd.read_csv(r"./app/dataset/ana_result/piaofang_info.csv")
data = data.iloc[:, [2, 3, 4, 5, 7, 9, 10, 11]]
X = data.iloc[:, 0:7]
# 标签经过 log1p 转换,使其更偏向于正态分布
y = data.iloc[:, 7].apply(lambda x: x / 10000)
y = np.log1p(y)

# 数据集划分
train_X, test_X, train_y, test_y = train_test_split(X, y, test_size=0.2, random_state=1)
oof_df = pd.DataFrame()
test_oof_df = pd.DataFrame()

def performance_metric(y_true, y_predict):
    """ Calculates and returns the performance score between true and predicted values based on the metric chosen. """
    # 计算 'y_true' 与 'y_predict' 的 r2 值
    score = r2_score(y_true, y_predict)
    return score

def fit_dtr_model(X, y):
    cross_validator = KFold(n_splits=5)
    regressor = DecisionTreeRegressor(random_state=1)
    # Create a dictionary for the parameter 'max_depth' with a range from 1 to 10
    params = {'max_depth': [i for i in range(1, 11)]}
    # Transform 'performance_metric' into a scoring function using 'make_scorer'
    scoring_fnc = make_scorer(performance_metric)
    # Create the grid search cv object --> GridSearchCV()
    grid = GridSearchCV(regressor, params, scoring=scoring_fnc, cv=cross_validator)
    # Fit the grid search object to the data to compute the optimal model
    grid = grid.fit(X, y)
    dtr_max_depth = grid.best_estimator_.get_params()['max_depth']
    # Return the optimal model after fitting the data
    return dtr_max_depth

def fit_decision_tree_model_forcast():
    # 进行决策树预测模型的训练
    dtr_max_depth = fit_dtr_model(X, y)
    dtr_regressor = DecisionTreeRegressor(max_depth=dtr_max_depth)
    dtr_regressor.fit(X, y)
    pred_y = dtr_regressor.predict(test_X)
    test_oof_df['dtr'] = pred_y
    r2_score_val = performance_metric(test_y, pred_y)
    rmse_score = np.sqrt(mean_squared_error(pred_y, test_y))
    print('决策树回归模型评价指标为:')
    print("The R2 score is ", r2_score_val)
    print('均方差', rmse_score)
    joblib.dump(dtr_regressor, model_save_path + 'dtr_model.pkl')
    return rmse_score

def fit_lasso_model_forcast():
    # 进行 Lasso 预测模型的训练
    lasso_regressor = Lasso()
    lasso_regressor.fit(X, y)
    pred_y = lasso_regressor.predict(test_X)
    test_oof_df['lasso'] = pred_y
    r2_score_val = performance_metric(test_y, pred_y)
    rmse_score = np.sqrt(mean_squared_error(pred_y, test_y))
    print('Lasso 回归模型评价指标为:')
    print("The R2 score is ", r2_score_val)
    print('均方差', rmse_score)
    joblib.dump(lasso_regressor, model_save_path + 'lasso_model.pkl')
    return rmse_score

def fit_random_forest_regression_model():
    rf_model = RandomForestRegressor()
    rf_model.fit(X, y)
    pred_y = rf_model.predict(test_X)
    test_oof_df['rf'] = pred_y
    r2_score_val = performance_metric(pred_y, test_y)
    rmse_score = np.sqrt(mean_squared_error(pred_y, test_y))
    print('随机森林模型评价指标为:')
    print("The R2 score is ", r2_score_val)
    print('均方差', rmse_score)
    joblib.dump(rf_model, model_save_path + 'rf_model.pkl')
    return rmse_score

def fit_gdbt_model():
    gdbt_model = GradientBoostingRegressor()
    gdbt_model.fit(X, y)
    pred_y = gdbt_model.predict(test_X)
    test_oof_df['gdbt'] = pred_y
    r2_score_val = performance_metric(pred_y, test_y)
    rmse_score = np.sqrt(mean_squared_error(pred_y, test_y))
    print('GDBT 模型评价指标为:')
    print("The R2 score is ", r2_score_val)
    print('均方差', rmse_score)
    joblib.dump(gdbt_model, model_save_path + 'gdbt_model.pkl')
    return rmse_score

def fit_stacking_model():
    lr_model = LR()
    lr_model.fit(test_oof_df, test_y)
    pred_y = lr_model.predict(test_oof_df)
    r2_score_val = performance_metric(pred_y, test_y)
    rmse_score = np.sqrt(mean_squared_error(pred_y, test_y))
    print('Staking 模型评价指标为:')
    print("The R2 score is ", r2_score_val)
    print('均方差', rmse_score)
    joblib.dump(lr_model, model_save_path + 'stacking_model.pkl')
    return rmse_score

def forcast_piaofang(para):
    para = pd.DataFrame(para)
    # 加载决策树预测模型
    dtr_model = joblib.load(model_save_path + 'dtr_model.pkl')
    dtr_pred = dtr_model.predict(para)
    print("决策树预测票房%s万" % np.expm1(dtr_pred[0]))
    # 加载 Lasso 预测模型
    lasso_model = joblib.load(model_save_path + 'lasso_model.pkl')
    lasso_pred = lasso_model.predict(para)
    print("Lasso 预测票房%s万" % np.expm1(lasso_pred[0]))
    # 加载随机森林预测模型
    rf_model = joblib.load(model_save_path + 'rf_model.pkl')
    rf_pred = rf_model.predict(para)
    print("随机森林预测票房%s万" % np.expm1(rf_pred[0]))
    # 加载 GDBT 预测模型
    gdbt_model = joblib.load(model_save_path + 'gdbt_model.pkl')
    gdbt_pred = gdbt_model.predict(para)
    print("GDBT 预测票房%s万" % np.expm1(gdbt_pred[0]))
    return [[dtr_pred[0], lasso_pred[0], rf_pred[0], gdbt_pred[0]]]

主程序执行流程如下,依次训练各基模型并测试最终集成效果:

def train_model():
    dtr_rmse = fit_decision_tree_model_forcast()  # 决策树
    lasso_rmse = fit_lasso_model_forcast()        # Lasso
    rf_rmse = fit_random_forest_regression_model()  # 随机森林
    gdbt_rmse = fit_gdbt_model()                  # GDBT
    lr_rmse = fit_stacking_model()                # 堆叠模型
    
    rmse_result = pd.DataFrame(index=["决策树", "Lasso", "随机森林", "GDBT", "Stacking"])
    rmse_result['rmse_score'] = [dtr_rmse, lasso_rmse, rf_rmse, gdbt_rmse, lr_rmse]
    rmse_result.to_csv("../dataset/testModel/rmse_result.csv", encoding='utf-8', index=False)

def test_model():
    # 示例参数:年份,月份,评分,类型数,国家数,演员数,时长
    test_para = pd.DataFrame([[2022, 2, 8.4, 3, 1, 50, 173]])
    test_piaofang = 8394962 / 10000
    print("真实票房%s万" % test_piaofang)
    
    pred_list = forcast_piaofang(test_para)
    # 加载线性回归预测模型
    stacking_model = joblib.load(model_save_path + 'stacking_model.pkl')
    piaofang = stacking_model.predict(pred_list)[0]
    piaofang = round(np.expm1(piaofang), 2)
    print("Stacking 预测票房%s万" % piaofang)
    return piaofang

if __name__ == '__main__':
    # 四个机器学习算法构建票房预测模型,然后 Stacking 集成所有的算法模型,构建最终的票房预测模型
    train_model()
    # 模型测试
    piaofang = test_model()
    # 分析票房预测使用的所有属性与票房之间的关系并绘制散点图,分析所有属性之间的相关度绘制热力图
    ana_columns()

目录

  1. 项目概述
  2. 技术架构
  3. 功能模块详解
  4. 1. 数据采集与存储
  5. 2. 电影票房预测
  6. 3. 电影推荐
  7. 4. 数据可视化展示
  8. 5. 权限管理
  9. 界面展示
  10. 电影数据可视化大屏
  11. 票房预测与推荐交互
  12. 算法实现细节
  13. 核心代码解析
  14. 设置模型保存路径
  15. 读取数据并选取关键特征
  16. 标签经过 log1p 转换,使其更偏向于正态分布
  17. 数据集划分
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Python 在 Windows 上的安装与 PyCharm 配置指南
  • Llama 3 本地部署指南:使用图形化工具快速运行大模型
  • 2026 焊接机器人十大品牌推荐
  • 腾讯混元大模型业务落地实践与技术方案
  • Open-WebUI 管理员面板深度拆解与配置指南
  • Python 兼职开发指南:技术栈与实战方向
  • Grok 开源发布:程序员在大模型时代的技术机遇
  • AI 产品经理:方法、技术与实战
  • LLM 训练微调实战:基于 LLaMA-Factory 框架详解
  • HTML+CSS 实现流动背景特效实战
  • Whisper Diarization 语音识别与说话人分离入门指南
  • Stack-Chan 机器人构建指南:基于 M5Stack 的 JavaScript 驱动项目
  • SBUS 协议原理与实战:无人机航模机器人通信方案
  • 13 篇大模型前沿论文精选:推理、视频与医疗应用
  • Java 后端从 IDEA 迁移至 Trae 的真实体验与配置指南
  • Stable Diffusion 3.5 工业设计实战:产品草图生成系统
  • C++ 高并发内存池:ObjectPool 构造与实现
  • 基于 Unity 2022 与 UXR SDK 的 AR 消消乐游戏开发实践
  • HarmonyOS 6.0 使用 PAC 脚本灵活管理网络连接
  • 基于 C++ 手写 HTTP 服务器:从请求解析到响应构建

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online