ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

机器学习实战:从数据采集到系统部署的米其林餐厅分析项目全解析

机器学习实战:从数据采集到系统部署的米其林餐厅分析项目全解析 简介本资源是一项面向高校计算机及相关专业本科生的机器学习与数据挖掘课程设计实践项目聚焦米其林餐厅多源数据的分析建模解决餐饮行业评级特征挖掘、地域分布规律识别与菜品特色关联分析等典型问题。压缩包共56个文件含18个Java核心模块代码覆盖数据清洗、特征工程、模型训练全流程、10个FreeMarker模板用于可视化报表生成、9个备份文件保障开发可回溯、5个CSS样式文件及4个CSV原始数据集如三星/一星/二星餐厅明细辅以SQL建表脚本、YML配置、README说明文档等整体仅276KB轻量易部署。已有49人下载学习项目获98分优秀成绩提供完整工程化实现路径从真实数据预处理、多模型对比实验如分类与聚类、到交互式结果展示所有代码均带详细注释文档涵盖需求分析、算法选型依据与模块调用关系图助力学生贯通理论知识与产业级开发实践。1. 项目概述与核心价值最近在整理过往的项目资料翻到了几年前带学生做的一个课程设计题目是“基于机器学习的米其林餐厅数据挖掘系统”。这个项目当时反响不错不仅学生拿了高分其设计思路和源码后来也被不少同行借鉴用于教学或者作为自己数据分析项目的起点。今天我就把这个项目的里里外外、从设计思路到代码实现的关键细节系统地梳理一遍分享给正在做课程设计、毕业设计或者想找一个完整的机器学习实战项目练手的朋友们。简单来说这个项目要干一件什么事呢就是利用公开或爬取的米其林餐厅数据比如位置、菜系、评分、价格、主厨信息、用户评论等通过一系列数据挖掘和机器学习技术去发现数据背后的规律。比如预测一家餐厅能否入选米其林指南哪些因素是决定餐厅星级的关键不同城市或国家的米其林餐厅在分布和特点上有何差异用户评论的情感倾向与餐厅星级有何关联这不仅仅是一个简单的数据分析报告而是一个包含数据采集、清洗、分析、建模、可视化到系统化展示的完整流程。对于学习者而言它能让你亲手走一遍机器学习项目的标准生命周期理解每个环节的挑战和解决方案价值远超书本上的孤立算法。2. 系统整体架构与设计思路拆解2.1 核心需求与目标定义做任何项目第一步永远是明确目标。我们这个“米其林餐厅数据挖掘系统”的核心需求可以拆解为以下几个层次数据层面需要获取足够丰富、高质量的米其林餐厅相关数据。这包括结构化数据餐厅名称、城市、星级、菜系、人均消费等和非结构化数据用户评论文本。分析层面不仅要进行描述性统计如各星级餐厅数量分布、价格区间更要进行探索性和建模性分析。后者是机器学习的核心例如建立分类模型预测星级或建立回归模型分析价格影响因素。系统层面需要将分析过程、结果和模型封装成一个可交互、可复现的系统。对于课程设计而言一个带有图形界面的桌面应用或一个简单的Web应用是很好的展示形式。文档层面需要配套完整的课程设计文档阐述项目背景、技术选型、实现细节、结果分析和总结反思。这是体现工程化思维和学术规范的关键。基于这些需求我们设计的系统架构遵循经典的“数据流水线”模式自底向上分为数据层、处理层、模型层和应用层。2.2 技术栈选型与理由技术选型直接决定了开发效率和项目成败。以下是当时我们选择的核心技术及其理由编程语言Python。这是数据科学和机器学习领域的事实标准。拥有如Pandas、NumPy、Scikit-learn、Matplotlib等成熟且强大的库生态极其丰富能极大降低开发难度。数据获取Requests BeautifulSoup4 / Scrapy。米其林官网和一些美食点评网站需注意Robots协议和版权是主要数据源。Requests用于简单页面抓取BeautifulSoup4用于解析HTML。如果数据量很大或结构复杂Scrapy框架更专业高效。数据处理与分析Pandas NumPy。Pandas的DataFrame是处理表格数据的利器其数据清洗、转换、聚合功能不可或缺。NumPy提供高效的数值计算基础。机器学习库Scikit-learn。对于课程设计级别的项目Scikit-learn完全够用。它提供了从数据预处理标准化、编码、特征选择到分类、回归、聚类等各种经典算法的统一接口文档完善易于上手。文本处理与情感分析Jieba中文/ NLTK或Spacy英文 TextBlob或基于Scikit-learn的文本向量化。用户评论是宝贵的非结构化数据。需要分词、去除停用词然后通过词袋模型CountVectorizer或TF-IDFTfidfVectorizer将其转化为数值特征进而进行情感分析或作为预测模型的输入。数据可视化Matplotlib Seaborn Plotly。Matplotlib是基础绘图库Seaborn基于Matplotlib统计图表更美观简洁。Plotly可以生成交互式图表集成到Web应用中体验更佳。系统构建与交互方案A桌面应用Tkinter / PyQt。Python标准库Tkinter足够完成一个功能演示性的GUI。如果追求更美观专业的界面PyQt是更好选择但学习曲线稍陡。方案BWeb应用Flask / Streamlit。Flask是一个轻量级Web框架灵活度高需要自己编写前后端交互。Streamlit是当时我们强烈推荐的选择它专为数据科学应用设计可以用纯Python脚本快速构建出交互式Web应用几乎无需前端知识非常适合课程设计演示。文档编写Markdown Jupyter Notebook。Jupyter Notebook非常适合将代码、可视化结果和文字说明Markdown结合在一起是记录数据分析过程、制作可复现报告的绝佳工具。最终课程设计文档可以用Notebook导出为PDF或HTML。注意在实际项目中务必严格遵守数据来源网站的使用条款Terms of Use和Robots协议。对于教学演示项目可以使用公开的脱敏数据集或仅爬取少量数据用于技术演示并明确标注数据来源尊重知识产权。3. 核心模块实现与关键技术细节3.1 数据采集与清洗实战数据是项目的基石。米其林数据通常没有现成的完美数据集需要自己动手。1. 数据源分析主要目标米其林指南官方网站不同国家地区有分站。通常包含餐厅名、地址、星级、菜系、价格标识€€€、主厨、推荐菜品等。辅助目标大众点评、TripAdvisor等第三方平台。用于获取用户评分、评论数量、文本评论等丰富数据维度。备选方案Kaggle、GitHub等开源数据平台。有时能找到别人整理好的相关数据集可以作为补充或起点。2. 爬虫编写要点以RequestsBeautifulSoup为例import requests from bs4 import BeautifulSoup import pandas as pd import time def scrape_michelin_page(url): headers {User-Agent: Mozilla/5.0 (Your Browser Info)} # 模拟浏览器 try: resp requests.get(url, headersheaders, timeout10) resp.raise_for_status() # 检查请求是否成功 soup BeautifulSoup(resp.content, html.parser) # 关键通过浏览器开发者工具分析页面结构找到数据所在的HTML标签 restaurants soup.find_all(div, class_restaurant-item) # 示例class data_list [] for rest in restaurants: name rest.find(h3).text.strip() # 星级可能用图片或特定class表示需要解析 # 例如查找包含‘michelin-star’的span标签数量 star_elements rest.find_all(span, class_michelin-star) stars len(star_elements) # 地址、菜系等信息类似方法提取 # ... data_list.append({name: name, stars: stars, ...}) return data_list except requests.RequestException as e: print(f请求失败: {url}, 错误: {e}) return [] # 翻页处理 base_url https://guide.michelin.com/.../page-{} all_data [] for page in range(1, 6): # 假设爬取前5页 url base_url.format(page) page_data scrape_michelin_page(url) all_data.extend(page_data) time.sleep(2) # 礼貌延迟避免对服务器造成压力 df pd.DataFrame(all_data)实操心得网站结构可能变动爬虫代码需要定期维护。使用try-except增强鲁棒性添加time.sleep是基本的网络礼仪。复杂网站如动态加载可能需要用到Selenium。3. 数据清洗与预处理这是最耗时但至关重要的一步。使用Pandas进行处理缺失值查看df.info()和df.isnull().sum()。对于数值型特征可以考虑用中位数或均值填充对于类别型可以用众数或单独设为“未知”类别。对于文本评论缺失可能直接标记为无评论。格式标准化价格可能显示为“€€€”或“200-300 USD”需要统一提取为数值区间或中位数。城市、国家名称需要统一如“Beijing”和“北京”。特征工程从地址中提取城市、国家可以使用正则表达式或地理编码API如Geopy需注意调用限制。创建新特征例如“人均消费等级”低、中、高、“是否拥有明星主厨”二值特征、“菜系数量”一家餐厅可能提供多种菜系。文本特征向量化这是处理评论的核心。from sklearn.feature_extraction.text import TfidfVectorizer # 假设 df[review_text] 包含清洗后的评论文本 tfidf TfidfVectorizer(max_features1000, stop_wordsenglish) # 选取最重要的1000个词 review_features tfidf.fit_transform(df[review_text].fillna()) # review_features 是一个稀疏矩阵可以与其他特征合并3.2 探索性数据分析与可视化在建模之前必须先用眼睛“看”数据。1. 星级分布分析import matplotlib.pyplot as plt import seaborn as sns star_counts df[stars].value_counts().sort_index() plt.figure(figsize(8,5)) sns.barplot(xstar_counts.index, ystar_counts.values, paletteviridis) plt.title(Distribution of Michelin Stars) plt.xlabel(Star Rating) plt.ylabel(Number of Restaurants) for i, v in enumerate(star_counts.values): plt.text(i, v5, str(v), hacenter) plt.show()通过这个图你能立刻看出三星餐厅的稀缺性以及一星餐厅的主体地位。2. 价格与星级的关系使用箱线图或小提琴图可以清晰展示不同星级餐厅的价格分布差异。plt.figure(figsize(10,6)) sns.boxplot(xstars, yprice_median, datadf, paletteSet2) # price_median是处理后的价格中位数 plt.title(Price Distribution across Star Ratings) plt.xlabel(Michelin Stars) plt.ylabel(Median Price (USD)) plt.show()通常会发现星级越高价格的中位数和离散程度都可能增加但也会有例外某些一星餐厅可能非常昂贵。3. 地理分布可视化如果有经纬度信息可以用Folium库制作交互式地图。或者按国家、城市统计餐厅数量用柱状图或热力图展示。city_rank df[city].value_counts().head(10) plt.figure(figsize(12,6)) sns.barplot(xcity_rank.values, ycity_rank.index, paletterocket) plt.title(Top 10 Cities with Most Michelin Restaurants) plt.xlabel(Count) plt.show()这个分析能直观揭示米其林餐厅在全球美食都市的聚集情况如东京、巴黎、纽约等。3.3 机器学习模型构建与应用这是项目的核心算法部分。我们以“预测餐厅是否为一星及以上二分类问题”为例。1. 定义问题与准备数据目标变量创建一个新列is_starred如果stars 1则为1否则为0针对未入星但可能在其他列表中的餐厅。特征选择数值特征价格、评分、类别特征城市、菜系需独热编码、文本特征评论TF-IDF向量。数据集划分from sklearn.model_selection import train_test_split2. 特征工程与编码from sklearn.preprocessing import StandardScaler, OneHotEncoder from sklearn.compose import ColumnTransformer from sklearn.pipeline import Pipeline # 假设特征列表 numeric_features [price_median, review_score] categorical_features [city, cuisine_type] text_feature review_text # 单独处理 # 数值和类别特征预处理管道 preprocessor ColumnTransformer( transformers[ (num, StandardScaler(), numeric_features), (cat, OneHotEncoder(handle_unknownignore, sparse_outputFalse), categorical_features) ]) # 文本特征处理管道 text_transformer TfidfVectorizer(max_features500)3. 模型选择与训练我们尝试几种经典算法进行对比。from sklearn.linear_model import LogisticRegression from sklearn.ensemble import RandomForestClassifier from sklearn.svm import SVC from sklearn.model_selection import cross_val_score import numpy as np # 准备数据 X_numeric_cat df[numeric_features categorical_features] y df[is_starred] # 由于文本特征维度高有时先与其他特征合并会内存爆炸。一种策略是分别建模再融合或使用降维。 # 这里演示不使用文本特征的简单流程 X_train, X_test, y_train, y_test train_test_split(X_numeric_cat, y, test_size0.2, random_state42) # 创建包含预处理和分类器的完整管道 models { Logistic Regression: Pipeline(steps[(preprocessor, preprocessor), (classifier, LogisticRegression(max_iter1000))]), Random Forest: Pipeline(steps[(preprocessor, preprocessor), (classifier, RandomForestClassifier(n_estimators100, random_state42))]), SVM: Pipeline(steps[(preprocessor, preprocessor), (classifier, SVC(kernelrbf, probabilityTrue))]) # 启用概率估计 } results {} for name, model in models.items(): model.fit(X_train, y_train) train_score model.score(X_train, y_train) test_score model.score(X_test, y_test) # 使用交叉验证看更稳健的性能 cv_scores cross_val_score(model, X_train, y_train, cv5) results[name] { train_acc: train_score, test_acc: test_score, cv_mean: np.mean(cv_scores), cv_std: np.std(cv_scores) } print(f{name}: Test Acc {test_score:.4f}, CV Acc {np.mean(cv_scores):.4f} (/- {np.std(cv_scores):.4f}))4. 模型评估与解释准确率、精确率、召回率、F1-score对于类别不平衡的数据星级餐厅总是少数仅看准确率不够需要综合评估。使用sklearn.metrics.classification_report。混淆矩阵直观展示分类错误情况。特征重要性对于树模型Random Forest可以提供特征重要性排序帮助理解哪些因素如价格、城市、特定菜系对预测星级贡献最大。# 获取Random Forest管道中的分类器 rf_model models[Random Forest].named_steps[classifier] # 获取特征名称需要处理OneHotEncoder后的特征名略复杂 # 可以通过 pipeline.named_steps[preprocessor].get_feature_names_out() 获取 importances rf_model.feature_importances_ # 然后排序并可视化3.4 系统集成与界面开发为了让项目从一个脚本变成一个“系统”我们需要一个交互界面。这里以Streamlit为例因为它最快。1. 环境安装pip install streamlit pandas matplotlib seaborn plotly scikit-learn2. 构建一个简单的应用脚本app.pyimport streamlit as st import pandas as pd import pickle import matplotlib.pyplot as plt st.set_page_config(page_title米其林餐厅分析系统, layoutwide) st.title(️ 基于机器学习的米其林餐厅数据挖掘系统) # 1. 侧边栏上传数据或选择示例 st.sidebar.header(数据输入) uploaded_file st.sidebar.file_uploader(上传你的餐厅数据CSV文件, type[csv]) if uploaded_file is not None: df pd.read_csv(uploaded_file) else: # 加载预置的示例数据 df pd.read_csv(michelin_demo.csv) st.sidebar.info(正在使用示例数据。) # 2. 展示数据 st.header(数据概览) st.dataframe(df.head()) st.write(f数据集形状: {df.shape}) # 3. 交互式可视化 st.header(数据探索) col1, col2 st.columns(2) with col1: selected_chart st.selectbox(选择图表类型, [星级分布, 价格 vs 星级, 城市排名]) with col2: if selected_chart 星级分布: fig, ax plt.subplots() df[stars].value_counts().sort_index().plot(kindbar, axax) ax.set_title(餐厅星级分布) st.pyplot(fig) # ... 其他图表逻辑 # 4. 模型预测假设已训练好模型并保存为model.pkl st.header(星级预测) if st.sidebar.checkbox(加载预测模型): with open(model.pkl, rb) as f: model pickle.load(f) # 创建输入表单 with st.form(prediction_form): price st.slider(人均价格USD, 50, 500, 150) city st.selectbox(城市, df[city].unique()) cuisine st.selectbox(菜系, df[cuisine_type].unique()) submitted st.form_submit_button(预测) if submitted: # 构造输入数据框 input_df pd.DataFrame([[price, city, cuisine]], columns[price_median, city, cuisine_type]) prediction model.predict(input_df)[0] proba model.predict_proba(input_df)[0] st.success(f预测结果: { 可能入选星级 if prediction 1 else ⚫ 可能未入选}) st.write(f置信度: 入选 {proba[1]:.2%}, 未入选 {proba[0]:.2%}) st.sidebar.markdown(---) st.sidebar.info(这是一个课程设计演示系统。模型仅供参考。)3. 运行系统在终端中执行streamlit run app.py一个本地Web应用就会在浏览器中打开具有交互式控件和实时更新的图表。4. 课程设计文档撰写要点与避坑指南一份优秀的文档和代码本身一样重要。它展示了你的系统化思考和表达能力。4.1 文档结构建议封面与摘要项目名称、姓名、学号、日期。摘要用200-300字精炼概括项目目标、方法、主要结果和结论。第一章引言。阐述项目背景米其林指南的影响力、数据挖掘的价值、项目目标与意义、报告结构。第二章相关技术与理论。简要介绍用到的关键技术Python数据科学生态Pandas, Scikit-learn、机器学习基本概念监督学习、分类、特征工程、Web框架Streamlit。第三章系统分析与设计。这是核心。需求分析功能需求、数据需求、性能需求。总体架构设计画一个清晰的系统模块图展示数据流。数据库/数据结构设计如果用了数据库。详细模块设计数据采集模块、数据处理模块、分析模型模块、可视化模块、系统界面模块。第四章系统实现与测试。开发环境说明Python版本、主要库及版本。各模块关键代码展示与解释不要贴全部代码只贴核心片段并加以说明。系统功能测试截图展示界面说明各项功能。模型性能测试与分析展示评估指标表格、混淆矩阵、特征重要性图并分析结果。第五章总结与展望。项目工作总结完成了什么有何收获。存在的问题与不足数据量不足、模型复杂度、特征工程可以更精细等。未来改进方向引入深度学习处理评论、增加实时数据更新、部署到云服务器等。参考文献。附录可以放完整的源代码文件清单、部分核心代码、数据集样本。4.2 常见问题与避坑技巧数据获取不合法或不稳定这是最大的坑。务必使用公开数据集或严格遵守爬虫道德。课程设计中可以提供一个爬虫代码框架但主要使用准备好的静态CSV文件进行演示并在文档中说明。特征工程不到位模型效果差不要急于跑模型。花70%的时间在数据清洗和特征工程上。尝试不同的特征组合、编码方式、文本处理参数。可视化特征与目标的关系剔除无关特征。类别不平衡问题星级餐厅正样本远少于非星级餐厅负样本。这会导致模型倾向于预测为负类。解决方法使用class_weight参数如class_weightbalanced、过采样SMOTE、欠采样或使用更适合的评估指标AUC-PR。过拟合在训练集上表现很好测试集上很差。解决方法增加数据量、进行特征选择、使用正则化、简化模型复杂度、使用交叉验证调参。Streamlit应用部署问题本地运行正常但部署到Streamlit Cloud或Heroku时出错。常见原因依赖库版本冲突、文件路径问题、内存不足。务必提供requirements.txt文件精确列出库版本使用相对路径并在部署前充分测试。文档描述与代码不符这是扣分项。确保文档中描述的每一个步骤和结果都有对应的代码和输出可以验证。保持代码、注释和文档的同步更新。我个人在带这个项目时的体会是课程设计的核心价值不在于做出一个多炫酷、多精准的预测系统而在于完整地实践一个从问题定义到成果展示的闭环。学生会遇到真实的数据脏乱差问题会为模型调参焦头烂额会为部署一个小bug调试半天这些经历比单纯学会调用一个API函数要宝贵得多。对于初学者我的建议是先跑通一个最简单的流程用现成数据、逻辑回归模型、命令行输出再逐个环节去深化和优化改进特征、尝试复杂模型、增加交互界面。这样既能建立信心又能逐步积累深度。这个“米其林餐厅数据挖掘系统”的框架具有很强的通用性你可以把数据换成“电影评分”、“股票数据”、“电商商品”把预测目标换成“票房”、“涨跌”、“销量”方法论是相通的。希望这个详细的拆解能为你自己的项目提供一个坚实的起点。本文还有配套的精品资源点击获取
返回列表