跳到主要内容电影推荐与票房预测系统:基于 Python + Flask + 机器学习 | 极客日志PythonAI算法
电影推荐与票房预测系统:基于 Python + Flask + 机器学习
电影推荐与票房预测系统采用 Python 与 Flask 架构,集成 MySQL 存储与 Echarts 可视化。系统通过爬虫采集数据,利用 Surprise 库 KNNWithZScore 算法实现个性化推荐,并结合 Stacking 集成学习(决策树、Lasso、随机森林、GDBT)提升票房预测精度。功能涵盖数据采集、票房预测、推荐展示及多级权限管理,有效解决选片困难与行业预测盲区,实现从数据处理到业务决策的全流程闭环。
虚拟内存2 浏览 电影推荐与票房预测系统:基于 Python + Flask + 机器学习
1、项目介绍
技术栈
本项目以 Python 为核心开发语言,整合 Flask 框架搭建后端服务,采用 MySQL 数据库完成数据存储。借助 requests 爬虫库采集电影相关数据,通过 Echarts 可视化工具实现数据大屏展示;引入 Surprise 库 KNNWithZScore 算法实现电影推荐、Stacking 集成学习(决策树/Lasso/随机森林/GDBT)提升票房预测精度,搭配 HTML 完成前端页面呈现。
功能模块
- 数据采集与存储模块
- 电影票房预测模块
- 电影推荐模块
- 数据可视化展示模块
- 用户角色与功能分配模块
- 电影信息管理模块
- 用户信息管理模块
- 后台数据管理模块
项目概述
本系统聚焦解决用户选片难、行业票房预测盲目等痛点。通过爬虫采集并清洗电影数据存入 MySQL;利用 Stacking 集成学习提升票房预测精度,以 KNNWithZScore 算法实现个性化推荐;通过 Echarts 大屏呈现多维度数据。系统支持三级角色登录,普通用户可获取推荐、浏览电影,管理员负责信息管理,后台管理员维护系统运行,实现'数据 - 算法 - 功能'的全流程闭环。
2、项目界面
(1)电影数据可视化大屏
多板块布局呈现各类数据:涵盖电影类型数量统计、上映国家分布、年度数量与评分趋势,同时展示参演演员排名、随机电影信息及票房 Top 榜单,通过图表与列表结合的形式直观呈现多维度电影数据。

(2)电影评论数据可视化分析大屏
包含年度评论用户数量统计、评论内容的词云分析,以及最受欢迎电影的分布情况,下方展示不同主题的评论关键词词云。通过图表与词云结合的形式,直观呈现评论数据的时间趋势、内容特征及关联电影热度。

(3)电影数据
以表格形式集中展示电影的多类信息,涵盖编号、名称、评分、上映时间等字段。左侧导航栏支持跳转至分析大屏、预测、推荐等功能模块,既实现了电影信息的统一呈现,也为管理员提供了便捷的信息查阅入口。

(4)电影票房预测
提供电影选择的下拉交互入口,用户选定目标电影后,系统通过集成学习算法计算并展示对应的票房预测结果。整体实现了'选择电影 - 触发预测 - 获取结果'的简洁流程。

(5)电影推荐
提供电影选择的下拉入口,用户选定目标电影后,系统通过推荐算法生成对应的 Top10 推荐列表,以表格形式展示推荐电影的多类信息。帮助用户快速获取匹配偏好的电影内容。
(6)电影信息管理
提供电影信息的查询(支持下拉筛选)与展示功能,以表格呈现电影多类信息,同时为每条数据配备操作按钮。管理员通过该模块实现电影信息的增删管理,保障系统内电影数据的及时更新与有序维护。
(7)用户信息管理
支持通过下拉筛选查询用户信息,以表格展示用户名、类型等内容,同时为每条数据配备操作按钮。管理员通过该模块实现用户信息的查询与维护,保障系统内用户账号的有序管理。
(8)后台数据管理
提供多标签页切换(涵盖电影、票房等数据分类),支持搜索、批量操作及分页浏览,以表格展示数据详情并配备编辑类操作按钮。后台管理员通过该模块实现系统核心数据的集中管理。
(9)注册登录
提供账号、密码的输入框及登录按钮,同时配备注册账号入口。用户通过该模块完成身份验证后,可进入对应角色的功能界面,实现系统的权限区分与安全访问。
3、项目说明
一、技术架构
本项目以 Python 为核心,整合 Flask 框架搭建后端服务,采用 MySQL 数据库完成数据存储。借助 requests 爬虫库采集电影相关数据,通过 Echarts 可视化工具实现数据大屏展示;引入 Surprise 库 KNNWithZScore 算法实现电影推荐、Stacking 集成学习(决策树/Lasso/随机森林/GDBT)提升票房预测精度,搭配 HTML 完成前端页面呈现。
二、功能模块详解
- 数据采集与存储:通过 requests 爬虫采集电影基础信息、票房、评论等原始数据,经清洗规整后存入 MySQL 数据库,保障数据的完整性与结构化。
- 电影票房预测:提供电影选择下拉入口,用户选定影片后,系统调用 Stacking 集成学习算法计算并展示票房预测结果,输出直观的票房参考数据。
- 电影推荐:支持用户通过下拉框选定电影,依托 KNNWithZScore 算法生成 Top10 推荐列表,帮助用户快速获取匹配偏好的电影内容。
- 数据可视化展示:包含电影数据可视化大屏和评论数据可视化大屏,前者呈现电影类型、上映国家、年度趋势等多维度数据,后者展示评论用户数、词云分析、热门电影分布等内容。
- 用户角色与功能分配:通过注册登录环节实现身份验证,划分普通用户、管理员、后台管理员三级角色,不同角色对应不同操作权限。
- 电影信息管理:支持管理员通过下拉筛选查询电影信息,以表格展示数据并配备操作按钮,可完成电影信息的增删管理。
- 用户信息管理:管理员可下拉筛选查询用户信息,通过表格呈现账号信息并进行维护操作。
- 后台数据管理:后台管理员可通过多标签页切换管理电影、票房等核心数据,支持搜索、批量操作及分页浏览。
三、项目总结
本系统构建了'数据采集 - 算法应用 - 功能落地'的全流程闭环。系统依托爬虫与数据库实现数据管理,借助机器学习算法提升推荐与预测的精准度,通过可视化大屏直观呈现多维度数据,同时基于角色分配实现精细化的信息管理。从用户端来看,普通用户可便捷获取个性化推荐、查看票房预测;从管理端来看,管理员可维护电影与用户信息,后台管理员保障数据安全,兼顾了用户体验与行业决策需求。
4、核心代码
在票房预测部分,我们采用了 Stacking 集成策略,先训练多个基模型(决策树、Lasso、随机森林、GDBT),再使用线性回归作为元模型进行融合。以下是具体的模型训练与预测逻辑实现。
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]
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. """
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)
params = {'max_depth': [i for i in range(1, 11)]}
scoring_fnc = make_scorer(performance_metric)
grid = GridSearchCV(regressor, params, scoring=scoring_fnc, cv=cross_validator)
grid = grid.fit(X, y)
dtr_max_depth = grid.best_estimator_.get_params()['max_depth']
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_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 forecast_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_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_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]]]
为了对比各模型效果,我们编写了训练脚本,将 RMSE 结果保存至 CSV 文件,并在主程序中执行测试与分析。
def train_model():
dtr_rmse = fit_decision_tree_model_forcast()
lasso_rmse = fit_lasso_model_forcast()
rf_rmse = fit_random_forest_regression_model()
gdbt_rmse = fit_gdbt_model()
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 = forecast_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
def forecast(para_list):
pred_list = forecast_piaofang(para_list)
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 "预测票房%s万 (美元)" % piaofang
def vis_relation(x1, y1, name1):
fig = plt.figure(1, figsize=(9, 5))
plt.scatter(x1, y1, c=['green'], marker='o')
plt.grid()
plt.xlabel("piaofang", fontsize=10)
plt.ylabel(name1, fontsize=10)
plt.title("Link between piaofang and %s" % name1, fontsize=10)
plt.savefig('../dataset/pictures/piaofang_%s.png' % name1)
plt.close()
def ana_columns():
year_list = list(data.iloc[:, 0])
month_list = list(data.iloc[:, 1])
rating_list = list(data.iloc[:, 2])
movie_type_count_list = list(data.iloc[:, 3])
country_count_list = list(data.iloc[:, 4])
actor_count_list = list(data.iloc[:, 5])
runtime_list = list(data.iloc[:, 6])
piaofang_list = list(data.iloc[:, 7])
vis_relation(piaofang_list, year_list, 'year')
vis_relation(piaofang_list, month_list, 'month')
vis_relation(piaofang_list, rating_list, 'rating')
vis_relation(piaofang_list, movie_type_count_list, 'movie_type_count')
vis_relation(piaofang_list, country_count_list, 'country_count')
vis_relation(piaofang_list, actor_count_list, 'actor_count')
vis_relation(piaofang_list, runtime_list, 'runtime')
col = ['year', 'month', 'rating', 'movie_type_count', 'country_count', 'actor_count', 'runtime', 'piaofang']
plt.subplots(figsize=(14, 10))
corr = data.corr()
print(corr)
corr.to_csv("../dataset/ana_result/piaofang_info_corr.csv", encoding='utf-8')
sns.heatmap(corr, xticklabels=col, yticklabels=col, linewidths=.5, cmap="Reds")
plt.savefig('../dataset/pictures/corr.png')
if __name__ == '__main__':
train_model()
piaofang = test_model()
ana_columns()
相关免费在线工具
- 加密/解密文本
使用加密算法(如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