尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

米其林餐厅数据挖掘课程设计:从CSV到分类模型的完整源码包

发布时间:2026/9/26 8:09:22

资讯中心
01
ARTICLE

米其林餐厅数据挖掘课程设计:从CSV到分类模型的完整源码包

米其林餐厅数据挖掘课程设计:从CSV到分类模型的完整源码包
简介这份资源是面向计算机相关专业学生的机器学习与数据挖掘课程设计完整项目以米其林餐厅数据为分析对象构建了一套数据挖掘及管理系统。项目经导师指导并认可获得98分成绩适合正在做课程设计、期末大作业或需要项目实战练习的学习者参考。压缩包共46个文件约292KB包含18个Java源文件、10个FreeMarker模板、5个CSS样式、4个CSV数据集、4张图片以及SQL建表脚本、XML配置、YAML配置和Markdown说明文档覆盖数据清洗、多星级餐厅数据存储、后端逻辑与前端展示的完整链路。资源提供了从原始CSV到数据库再到可视化管理的实现方案读者可据此理解数据挖掘流程、系统分层结构与常见排错思路并直接复用或改造为个人课程设计。目前已有335人学习适合作为课程设计参考与实战练习素材。1. 米其林餐厅数据挖掘系统一份能跑通全流程的课程设计源码包如果你正在做数据挖掘或机器学习方向的课程设计大概率会遇到一个尴尬局面算法理论学了一堆但拿到一份真实数据集时连从哪儿下手都不知道。这份「机器学习和数据挖掘课程设计-米其林餐厅数据挖掘管理系统」源码包恰好能补上这个断层。它提供了一套完整的、从数据清洗到可视化管理的实现路径包含四份 CSV 原始数据、一份 SQL 建表脚本、一个基于 Maven 构建的 Java Web 工程以及一份使用文档。适合计算机相关专业正在赶课程设计或期末大作业的学生也适合想找一个完整项目来练手数据挖掘全流程的开发者。它解决的核心问题是让你不用从零搭架子直接在一个可运行的骨架上理解数据挖掘项目到底怎么落地。2. 拆开压缩包四份 CSV、一个 SQL 和 Maven 工程怎么协同拿到这个包第一件事不是急着跑代码而是先搞清楚文件之间的依赖关系。很多人翻车就翻在「数据往哪导、工程怎么连库」这两步上。这一章把资源结构拆开讲清楚后面操作才不会乱。2.1 数据集分层一星、二星、三星为什么要拆成三个文件包里的数据文件不是随意拆分的。one-star-michelin-restaurants.csv、two-stars-michelin-restaurants.csv、three-stars-michelin-restaurants.csv分别对应米其林一星、二星、三星餐厅记录data clean.csv则是清洗后的汇总数据。这种拆分方式在数据挖掘课程设计里很常见原因是星级本身就是最重要的分类标签分开存储便于做分层抽样和分类模型训练。从字段结构看这类数据集通常包含餐厅名称、地址、城市、国家、菜系类型、价格区间、星级等维度。做分类任务时星级就是目标变量做聚类或关联规则时菜系和价格区间是高频特征。常见做法是先用data clean.csv做整体探索再按星级拆分做对比分析。我一般会先跑一遍各文件的字段一致性和缺失值统计确认三份星级文件能否直接纵向合并。import pandas as pd # 分别读取三份星级数据 one_star pd.read_csv(one-star-michelin-restaurants.csv) two_star pd.read_csv(two-stars-michelin-restaurants.csv) three_star pd.read_csv(three-stars-michelin-restaurants.csv) # 检查字段是否一致 print(一星字段:, list(one_star.columns)) print(二星字段:, list(two_star.columns)) print(三星字段:, list(three_star.columns)) # 检查各自行数和缺失值 for name, df in [(一星, one_star), (二星, two_star), (三星, three_star)]: print(f{name} 行数: {len(df)}, 缺失值总数: {df.isnull().sum().sum()})这段代码的逻辑很直接先确认三份文件的列名是否对齐再统计行数和缺失值。如果列名不一致后续合并会直接报错。参数方面pd.read_csv默认用逗号分隔如果实际文件用了其他分隔符需要显式指定sep参数。缺失值统计用isnull().sum()能快速定位哪些字段需要清洗。2.2 SQL 脚本与 Maven 工程数据怎么从 CSV 进到系统里restaurant.sql是数据库初始化脚本负责建库建表。demo目录下是 Maven 工程pom.xml管理依赖src里是 Java 源码。整个链路是CSV 数据先导入数据库Java 工程再通过 JDBC 或 ORM 框架读取数据库最终在前端展示或做分析。导入数据这一步常见做法有两种一种是用 Navicat 或 MySQL Workbench 的导入向导直接传 CSV另一种是写LOAD DATA INFILE语句批量导入。前者适合新手后者适合需要反复重建环境的场景。我一般会先用 SQL 脚本建好表结构再对照 CSV 的列顺序调整导入映射避免字段错位。# 登录 MySQL 后执行建库建表脚本 mysql -u root -p restaurant.sql # 进入 MySQL 命令行用 LOAD DATA 导入 CSV mysql -u root -p restaurant_db-- 导入一星餐厅数据注意字段顺序要和 CSV 列对齐 LOAD DATA LOCAL INFILE one-star-michelin-restaurants.csv INTO TABLE restaurant FIELDS TERMINATED BY , ENCLOSED BY LINES TERMINATED BY \n IGNORE 1 ROWS;LOAD DATA LOCAL INFILE的关键参数是FIELDS TERMINATED BY和ENCLOSED BY前者指定列分隔符后者处理字段里带引号的情况。IGNORE 1 ROWS跳过 CSV 的表头行。如果导入后中文出现乱码需要在连接串里加characterEncodingutf8并确认数据库和表的字符集都是utf8mb4。2.3 Maven 工程结构pom.xml 里哪些依赖是必须的pom.xml是 Maven 项目的核心配置文件。对于数据挖掘管理系统这类项目通常需要以下几类依赖数据库驱动如mysql-connector-java、Web 框架如 Spring Boot 或 Servlet API、数据处理库如 Apache Commons CSV 或 OpenCSV、以及日志组件。具体版本号以pom.xml实际内容为准不要凭记忆改。!-- 数据库驱动版本要和本地 MySQL 匹配 -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.28/version /dependency !-- CSV 解析用于读取原始数据文件 -- dependency groupIdcom.opencsv/groupId artifactIdopencsv/artifactId version5.7.1/version /dependency依赖版本不匹配是新手最常见的翻车点之一。比如 MySQL 8.x 必须用 8.x 的驱动用 5.x 驱动连 8.x 数据库会报Public Key Retrieval is not allowed。解决办法是在 JDBC URL 里加allowPublicKeyRetrievaltrueuseSSLfalse或者降级数据库版本。另一个坑是 Maven 下载依赖慢可以配置国内镜像源在settings.xml的mirrors节点里加阿里云仓库地址。3. 从 CSV 到分析结果数据清洗与特征工程实操数据挖掘课程设计的评分点很大一部分落在数据预处理和特征工程上。原始 CSV 直接丢给模型结果通常很难看。这一章按「清洗 → 特征构造 → 模型输入」的顺序把中间每一步的参数和判断依据讲清楚。3.1 缺失值与重复值处理哪些字段必须补哪些可以丢拿到data clean.csv后先做缺失值热力图或统计表。常见字段里餐厅名称和星级通常不会缺但价格区间、电话、官网这类字段缺失率可能很高。处理策略取决于字段用途如果价格区间是分类特征缺失值可以填Unknown作为一个独立类别如果只是展示用可以直接置空。import pandas as pd import numpy as np df pd.read_csv(data clean.csv) # 统计各字段缺失率 missing_rate df.isnull().sum() / len(df) * 100 print(missing_rate.sort_values(ascendingFalse)) # 价格区间缺失填 Unknown星级缺失则删除该行 df[price_range] df[price_range].fillna(Unknown) df df.dropna(subset[star_rating]) # 去重按餐厅名称和地址联合判断 df df.drop_duplicates(subset[name, address], keepfirst) print(f清洗后行数: {len(df)})fillna(Unknown)把缺失的价格区间变成一个显式类别避免模型把 NaN 当成数值处理。dropna(subset[star_rating])只删除星级缺失的行因为星级是目标变量缺了就没法训练。drop_duplicates的subset参数指定用哪些列判断重复keepfirst保留第一条。注意不要用drop_duplicates()不带参数那样会对所有列做比较容易误删。3.2 特征编码菜系、城市、价格区间怎么转成模型能吃的数字分类特征不能直接喂给大多数机器学习算法。菜系、城市、价格区间这些字段需要做编码。常见做法有三种独热编码One-Hot、标签编码Label Encoding、目标编码Target Encoding。独热编码适合类别数少的字段比如价格区间只有几个档位标签编码适合树模型但会让类别之间产生不存在的顺序关系目标编码用目标变量均值替换类别适合高基数特征但容易过拟合。from sklearn.preprocessing import OneHotEncoder, LabelEncoder # 价格区间类别少用独热编码 price_encoder OneHotEncoder(sparseFalse) price_encoded price_encoder.fit_transform(df[[price_range]]) price_df pd.DataFrame(price_encoded, columnsprice_encoder.get_feature_names_out([price_range])) # 菜系类别多用标签编码配合树模型 cuisine_encoder LabelEncoder() df[cuisine_encoded] cuisine_encoder.fit_transform(df[cuisine].fillna(Unknown)) # 合并编码后的特征 df_final pd.concat([df, price_df], axis1) print(df_final[[cuisine_encoded] list(price_df.columns)].head())OneHotEncoder的sparseFalse让输出变成密集数组方便直接转 DataFrame。get_feature_names_out生成可读的列名。LabelEncoder的fit_transform会把每个菜系映射成一个整数但要注意它按字母顺序编码不是按频率。如果菜系类别超过几十个独热编码会导致维度爆炸这时候优先考虑目标编码或嵌入Embedding。3.3 分类模型训练与评估用星级做标签跑一遍基线特征准备好之后可以跑一个基线分类模型。星级预测本质是多分类问题一星、二星、三星。常见做法是先用逻辑回归或随机森林跑一版看准确率和混淆矩阵再决定要不要调参或换模型。from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import classification_report, confusion_matrix # 构造特征矩阵和标签 feature_cols [cuisine_encoded] list(price_df.columns) X df_final[feature_cols] y df_final[star_rating] # 划分训练集和测试集 stratify 保证各类别比例一致 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42, stratifyy ) # 随机森林基线 rf RandomForestClassifier(n_estimators100, random_state42) rf.fit(X_train, y_train) y_pred rf.predict(X_test) print(confusion_matrix(y_test, y_pred)) print(classification_report(y_test, y_pred))stratifyy是关键参数保证训练集和测试集里各星级比例与原始数据一致避免某一类样本过少导致评估失真。n_estimators100是随机森林的树数量太少容易欠拟合太多训练慢100 是常见起点。classification_report会输出每个类别的精确率、召回率和 F1比单看准确率更有参考价值。如果三星样本极少模型可能完全预测不出一星或三星这时候需要过采样或调整类别权重。4. 避坑与排查导入、编码、训练中最容易翻车的五个点这一章记录的是我在跑这类课程设计项目时反复遇到的坑。每个坑都按「现象 → 原因 → 解决」写方便你对照排查。4.1 CSV 导入数据库后中文乱码现象用LOAD DATA INFILE导入后餐厅名称和地址里的中文变成问号或乱码。原因CSV 文件编码是 UTF-8但 MySQL 连接字符集或表字符集不是utf8mb4导致解码失败。解决建表时指定DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_unicode_ci导入前执行SET NAMES utf8mb4;JDBC 连接串加characterEncodingutf8。三步都做基本能解决。4.2 Maven 依赖下载失败或版本冲突现象mvn clean install报错提示找不到某个依赖或者运行时抛NoSuchMethodError。原因本地仓库没有对应版本或者多个依赖传递引入了同一库的不同版本。解决在pom.xml里用dependencyManagement锁定版本配置国内镜像源加速下载用mvn dependency:tree查看依赖树定位冲突来源后排除。4.3 独热编码后特征维度爆炸现象菜系字段独热编码后特征数量从几十变成几千训练极慢甚至内存溢出。原因菜系类别过多每个类别生成一列维度随类别数线性增长。解决对高基数类别改用目标编码或频率编码或者先做类别合并把低频菜系归为Other树模型可以直接用标签编码不必独热。4.4 训练集和测试集类别分布不一致现象模型在训练集上准确率很高测试集上却很差混淆矩阵显示某一类完全预测错。原因划分数据时没有用stratify导致测试集里某些星级样本极少甚至没有。解决train_test_split加stratifyy如果某类样本本身就极少考虑过采样SMOTE或改用class_weightbalanced。4.5 SQL 脚本执行顺序错误导致外键报错现象执行restaurant.sql时提示外键约束失败表建不出来。原因建表语句有先后依赖被引用的表还没创建就先建了带外键的表。解决按脚本里的顺序执行不要跳步或者先SET FOREIGN_KEY_CHECKS0;建完再打开。如果脚本本身顺序有问题手动调整建表语句顺序。5. 进阶技巧用关联规则挖菜系组合再验证模型稳定性基线模型跑通之后可以往两个方向深入一是用关联规则挖掘菜系之间的共现关系二是用交叉验证检验模型稳定性。这两个方向在课程设计里都是加分项。5.1 用 Apriori 挖菜系组合支持度和置信度怎么设关联规则适合回答「哪些菜系经常出现在同一城市或同一星级」这类问题。mlxtend库的apriori和association_rules是常用工具。先把菜系转成 one-hot 矩阵再跑频繁项集。from mlxtend.frequent_patterns import apriori, association_rules from mlxtend.preprocessing import TransactionEncoder # 按城市分组收集每个城市的菜系列表 city_cuisines df.groupby(city)[cuisine].apply(list).tolist() # 转成 one-hot 交易矩阵 te TransactionEncoder() te_array te.fit(city_cuisines).transform(city_cuisines) df_trans pd.DataFrame(te_array, columnste.columns_) # 跑 Apriori最小支持度设 0.05 frequent_items apriori(df_trans, min_support0.05, use_colnamesTrue) rules association_rules(frequent_items, metricconfidence, min_threshold0.5) print(rules[[antecedents, consequents, support, confidence, lift]].head(10))min_support0.05表示项集至少在 5% 的城市中出现设太高会漏掉长尾组合设太低会产生大量无意义规则。min_threshold0.5表示置信度至少 50%。lift大于 1 说明前后件正相关等于 1 说明独立。实际调参时先看频繁项集数量再逐步调整支持度找到规则数量和质量的平衡点。5.2 交叉验证与学习曲线判断模型是欠拟合还是过拟合单次划分的评估结果波动大用交叉验证更稳。cross_val_score可以指定cv5做五折交叉验证同时输出每折得分。from sklearn.model_selection import cross_val_score, learning_curve import numpy as np # 五折交叉验证 cv_scores cross_val_score(rf, X, y, cv5, scoringf1_macro) print(f各折 F1: {cv_scores}) print(f平均 F1: {cv_scores.mean():.4f} (/- {cv_scores.std():.4f})) # 学习曲线判断欠拟合/过拟合 train_sizes, train_scores, test_scores learning_curve( rf, X, y, cv5, scoringf1_macro, train_sizesnp.linspace(0.1, 1.0, 5) ) train_mean train_scores.mean(axis1) test_mean test_scores.mean(axis1) for size, tr, te in zip(train_sizes, train_mean, test_mean): print(f训练集大小: {int(size)}, 训练 F1: {tr:.4f}, 验证 F1: {te:.4f})scoringf1_macro对类别不平衡更敏感比准确率更适合星级预测。学习曲线里如果训练 F1 和验证 F1 都低说明欠拟合需要加特征或换更复杂模型如果训练 F1 高但验证 F1 低说明过拟合需要正则化或减特征。我一般会先看交叉验证的均值再看学习曲线的走势两个指标结合起来判断。从那以后我每次拿到新的课程设计数据集都强制先跑一遍缺失值统计和字段一致性检查再动手写模型。这个习惯帮我省下了大量返工时间。希望这份源码包和上面的拆解能帮你把课程设计顺利跑通。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。