1绪论
1.1 研究背景与意义
在贵州旅游业蓬勃发展中,贵州拥有独特的自然资源,丰富的民族历史文化以及宜人气候的特色,大量的外地游客带动了贵州旅游业的快速发展,民宿旅游具有独特的优势,在贵州旅游市场上占有重要地位。由于民宿的特殊性,民宿价格相对于酒店的住宿价格表现出多样化因素的影响,具有较大的不稳定性和波动性,游客和民宿经营者难以准确估计。
1.2 国内外研究现状
国内外学者在酒店与民宿价格预测领域已有诸多探索。在国内,崔涵等人研究了不同机器学习方法的镐型截齿截割力预测能力,采用均方误差和决定系数作为模型预测能力的评估指标。
1.3 研究内容
本研究旨在运用机器学习方法对贵州民宿价格进行精准预测。首先,通过多种渠道广泛收集贵州民宿数据,涵盖位置、设施、评分、历史价格等丰富信息,并进行严格的数据预处理,确保数据质量。其次,深入分析影响民宿价格的因素,构建全面有效的特征集,包括民宿自身属性、周边环境、时间因素等。然后,运用经典机器学习算法,如随机森林、多元线性算法等进行价格预测建模,对比不同算法的预测效果。在此基础上,结合聚类算法和集成学习方法,构建基于聚类的分层集成学习模型,进一步提升预测准确性。[6]最后,对模型预测结果进行深入分析,探讨影响贵州民宿价格的关键因素,并结合实际应用场景,为游客、民宿经营者和旅游平台提供有价值的参考建议。
2相关理论与技术基础
2.1随机森林算法
随机森林通过集成多棵决策树构成,其核心思想是利用多数投票(分类)或平均值(回归)来融合多个树的预测结果。[7]
在分类任务中的预测中,假设随机森林中有B棵决策树h1(x),h2(x),…,hB(x),对于一个输入样本 ,每棵树输出一个类别预测结果hb(x)。
其中:y是样本最终预测类别,x是输入样本的特征向量,1(.)是指示函数,表示树 b是否预测为类别,hb(x)是第b棵决策树对样本x的预测类别,k是所有可能类别的集合,B是随机森林中决策树的总数。
2.2 多元线性回归算法
多元线性模型是一种统计方法,用于分析多个自变量与因变量之间的关系。
其中:f(Xi)是应变量,X1,X2,…Xk是自变量,w1,w2,…,wk是回归系数,b是截距项。
2.3 Django框架
PythonWeb框架:Django为性能高效、具有强大可扩展性的Web应用程序框架,本系统基于Django开发Web系统。借助Django的MTV(Model-Template-View)的架构将系统分割成独立的模块,增强模块的可维护性,增加开发效率。
3系统需求分析
3.1 系统功能性需求分析
系统功能需求分析中需要综合采集、分析、呈现、可视的数据,该系统应包含账户管理、数据采集、可视化分析、预测等功能。其中首先应搭建结构化数据采集模块,综合采集民宿的基础信息(档次、价格、评分、评论数)等关键数据,采用爬虫以实现动态更新。第二搭建特征工程引擎,对分类特征做独热码转换,对数值特征进行归一化处理,进行皮尔逊相关性特征筛选出高相关特征。搭建模型训练模块,集成随机森林、多元线性等预测算法,以网格搜索及交叉验证的方法优化模型中的参数,保证预测误差小于8%。搭建系统可视化功能,包含价格分析可视化、特征重要性分析、支持行政区划、民宿类型等多条件筛选可视化。
3.2 系统用例分析
3.2.1 登录注册功能
根据表3.1列出的测试用例描述,用户可以在系统登录页面输入正确的用户名和密码,以完成登录。
表3.1 登录功能测试用例
描述项目 |
说明 |
用例名称 |
系统用户登录 |
标识符 |
201 |
用例描述 |
阐述用户登录流程 |
参与者 |
已经注册成功的用户 |
前置条件 |
用户名和密码输入正确的才能继续 |
后置条件 |
在后续步骤中,如果登录成功,就能跳转到系统界面 |
基本操作流程 |
基础步骤操作流程包括登陆系统前端页面,输入用户名和密码以确认身份,然后点击登录 |
分支流程 |
如果登录出现错误,就无法进入系统 |
异常流程 |
由于用户名或密码错误,导致在异常流程中未能成功注册登录,从而无法进行正常的网络操作 |
根据表3.2中的描述,用户可通过系统注册页面输入用户名和密码来完成注册操作,系统中尚未注册的用户可利用该功能注册。
表3.2 注册功能测试用例
描述项目 |
说明 |
用例名称 |
访客注册 |
标识符 |
201 |
用例描述 |
这个测试用例是新用户注册功能,访客注册新的账号的所有步骤。 |
参与者 |
未注册的访客 |
前置条件 |
输入未被注册的用户名 |
后置条件 |
注册成功自动跳转至登录页 |
基本操作流程 |
打开系统的注册页面。填写用户名和密码,提交请求。 |
分支流程 |
注册页面无法访问。 |
异常流程 |
输入已注册用户名,系统提示重复并阻止注册。 |
3.2.2 用户管理功能
按照表3.3中的测试用例描述,登录系统的用户可以在用户管理界面管理其账号和密码信息。
表3.3 用户管理功能测试用例
描述项目 |
说明 |
用例名称 |
用户账户信息维护 |
标识符 |
201 |
用例描述 |
执行账户信息及密码修改操作 |
参与者 |
通过认证的注册用户 |
前置条件 |
系统有效登录状态 |
后置条件 |
显示修改操作完成反馈信息 |
基本操作流程 |
访问用户管理界面,填写并提交信息表单 |
分支流程 |
密码输入错误、原始认证信息不匹配场景处理 |
异常流程 |
新密码与二次确认内容不一致导致操作终止 |
3.2.3 数据可视化功能
表3. 4展示了用户在系统中执行数据可视化功能的实例,登录后,用户可以查阅到系统内的数据可视化结果。
表3.4 数据可视化功能测试用例
描述项目 |
说明 |
用例名称 |
数据可视化面板访问 |
标识符 |
201 |
用例描述 |
执行数据可视化界面访问及信息展示操作 |
参与者 |
通过身份验证的系统用户 |
前置条件 |
数据源配置完成且可用 |
后置条件 |
显示多维数据可视化分析视图 |
基本操作流程 |
1. 访问系统主界面 2. 选择数据可视化功能模块 |
分支流程 |
数据加载延迟时的加载状态提示机制 |
异常流程 |
数据源连接中断导致界面无数据渲染 |
3.2.4 数据采集功能
表3. 5展示了系统进行数据收集功能测试的实例描描述。
表3.5 数据采集功能测试用例
描述项目 |
说明 |
用例名称 |
数据收集功能 |
标识符 |
201 |
用例描述 |
数据收集的全程 |
参与者 |
登录到系统的用户 |
前置条件 |
确定收集的区域 |
后置条件 |
数据采集成功 |
基本操作流程 |
|
分支流程 |
无 |
异常流程 |
无 |
3.3 系统非功能性需求分析
系统非功能需求分析主要对民宿数据分析与可视化系统的性能需求、可靠性需求和保护性需求以满足系统的用户体验[10]。
指标性能:是系统在各种负荷条件下的反应速度和处理力。当有多用户同时进行数据爬取、数据检索和预测等任务时,系统能够比较快速的返回相应结果,以提升用户体验;另外,系统对于处理大量民宿数据需要具备优秀的性能和稳定性。
对系统的稳健性和持续性的需求是其能在无故障状态下保持正常运作的条件。这意味着该系统需在四十八小时之内维持稳定的运转,即使某些组件发生故障也能继续执行必要的功能并迅速恢复服务。此外,收集到的信息应被有效地储存和备份,以确保信息的长期保存与完好性。
保护性的要求构成了系统对资料保密性和访问控制的需求。为了避免因SQL注入或跨站脚本等攻击手段导致的数据泄露、修改等问题,系统应采取加密措施来保证信息的隐私。此外,系统必须具备严密的身份验证和权限管控体系,只允许经过许可的用户访问并处理数据,以此维护系统的稳定和资料的安全。
4模型建立和实现
4.1 数据来源
在线旅游平台去哪儿在线旅游平台是民宿数据的重要来源。这些平台汇聚了大量贵州民宿的信息,涵盖了民宿的基本信息、价格数据、用户评价等多方面内容。以去哪儿为例,平台上详细记录了民宿的名称、地址、房型、床型、设施设备、评分、评论数量以及不同时间段的价格等信息,这些数据为后续的研究提供了丰富的素材。
4.2 数据爬取与存储
本论文通过发送HTTP请求获取去哪儿网页数据并解析JSON格式的响应。采集的目标是获取酒店相关信息,包括评论数量(commentCount)、评论评分(commentScore)、评论评分百分比(commentScorePerc)、酒店等级(dangci)、酒店评论数量(hcommentCount)、酒店名称(name)、价格(priceN)、评分(ratingScore)、景区名称(sightAreaName)和星级(stars)。通过设计代码逐页请求酒店数据,每页的数据通过URL中的page参数控制。请求返回的数据通过.json()方法转换为JSON格式,提取所需字段,并将其写入CSV文件。[11]通过逐行追加的方式将数据存储到data.csv文件中。每次获取的数据包括评论数量、评分、价格等。此方法能够高效抓取并存储多个页面的酒店信息,最后通过使用navicat数据库可视化工具导入的方式,将采集好的数据手动导入到数据库,如图4.1所示数据采集流程,图4.2所示导入的数据库信息,如表4.1所示数据存入数据库的表结构。
图4.1数据爬取流程
图4.2导入的数据库信息
表4.1数据存储表
字段名 |
数据类型 |
描述 |
commentCount |
TEXT |
0 |
commentScore |
TEXT |
0 |
commentScorePerc |
TEXT |
0 |
dangci |
TEXT |
0 |
hcommentCount |
TEXT |
0 |
name |
TEXT |
0 |
priceN |
TEXT |
0 |
ratingScore |
TEXT |
0 |
sightAreaName |
TEXT |
0 |
stars |
TEXT |
0 |
4.3 数据清洗与预处理
(1)数据清洗
缺失值统计如图4.3所示sightAreaName列有1171个缺失值,使用fillna方法统一处理缺失值,将空值替换为Unknown字符串避免前端渲染异常。处理后缺失值如图4.4所示,sightAreaName列缺失值为0:
图4.3缺失值数量统计
图4.4缺失值处理后数量统计
针对字段类型不一致问题,如type视图中的dangci字段,对原始字段进行语义映射。在档次分类场景中,使用map函数将数字编码转换为"经济型""豪华型"等可读标签,增强数据可解释性。数据类型转换前数据如图4.5所示,数据转换后如图4.6所示:
图4.5数据类型转换前数据
图4.6数据类型转换后数据
(2)分箱处理
价格字段通过pd.cut进行智能分箱,设置自定义区间边界(如0-100元、100-150元),采用左闭右开原则避免区间重叠,生成分类变量用于分布分析。针对评论分数等连续变量,采用等宽分箱结合value_counts统计各区间频次,构建评分分布直方图数据。此类转换有效降低了数据维度,为可视化提供结构化输入如图4.5所示主要代码和如图4.6所示分箱处理结果。
图4.5分箱处理代码
图4.6分箱处理结果
(3)文本分析与特征提取
在词云生成模块,采用结巴分词对地址文本进行细粒度切分,加载自定义停用词表过滤"酒店""路"等无意义词汇。通过Counter统计词频,筛选前20高频词构建词云数据节点。如图4.7所示主要代码和如图4.8所示分词统计处理结果。
图4.7分词统计处理代码
图4.8分词统计处理结果
4.4 特征工程
特征筛选采用三级递进策略。首先应用方差选择法,设定阈值0.05剔除低方差特征,消除OneHot编码产生的稀疏类别变量,其次计算保留特征与价格变量的Pearson相关系数,过滤绝对值低于0.25的弱相关特征,特征数量降至6个。特征重要性柱形图如图4.9所示。
图4.9特征重要性柱形图结果
4.5 模型训练与调参
4.5.1 数据划分
将经过预处理后的贵州民宿数据集按照8:2的比例划分为训练集和测试集。训练集用于模型的训练与参数调整,测试集则用于评估模型在未见过的数据上的性能表现。这样的划分方式既能保证模型有足够的数据进行学习,又能有效评估其泛化能力。
4.5.2 模型训练
模型构建采用随机森林回归算法,其优势在于自动处理非线性关系与特征重要性评估。数据划分使用train_test_split函数按8:2比例随机切分训练集与测试集,并设置随机种子(random_state=42)保证可复现性。
4.5.3 参数调整
采用网格搜索和交叉验证相结合的方法对模型参数进行优化。以随机森林算法为例,其参数主要分为与 Bagging 框架相关的参数(如弱学习器个数 n_estimators、是否使用袋外样本评估 oob_score 等)和 CART 决策树的参数(如最大特征数目 max_features、决策树最大深度 max_depth 等)。各算法调参过程中考虑的主要参数及取值范围如下表所示:
表4.2 主要参数及取值表
算法 |
主要调参参数 |
取值范围 |
随机森林 |
n_estimators |
[50, 100,200] |
max_depth |
[None, 10, 20] | |
min_samples_split |
[2, 5] | |
min_samples_leaf |
[1, 2] |
4.6 模型评估与结果分析
4.6.1 评估指标
选用均方误差(MSE)作为评估模型预测准确性的主要指标,MSE 能直观地反映预测值与真实值之间的相对误差,值越小说明预测效果越好。
4.6.2 结果分析
经过训练和调参后,各模型在测试集上的预测结果如图所示:
图4.9模型预测结果
从结果可以看出,随机森林算法在本研究的贵州民宿价格预测任务中表现最佳,MSE 值最小,说明其预测结果与真实价格的相对误差较小,预测准确性较高。能够更好地捕捉数据中的复杂模式和特征之间的交互作用。[15]同时,通过对比不同算法的结果,也验证了特征工程和参数调整对模型性能的重要影响。后续研究可以基于这些结果,进一步优化模型或尝试其他算法,以提升贵州民宿价格预测的准确性。
5系统设计
5.1系统架构设计
本贵州民宿价格预测系统从架构上分为三层:表现层、业务逻辑层以及数据层。
图5.1贵州民宿价格预测系统架构设计图
5.2系统功能模块设计
贵州民宿价格预测系统根据前面章节的需求分析得出,其总体设计模块图如下图所示。
图5.2贵州民宿价格预测系统功能模块图
5.3系统各功能设计
对于系统的安全性的第一关,就是用户想要进入系统,必须通过登录窗口,输入自己的登录信息才可以进行登录,用户输入的信息准确无误后才可以进入到操作系统界面,进行功能模块的相对应操作,如果用户输入的信息不正确,则窗囗出现提示框,用户登录失败,返回到第一步进行重新输入,如图5.3所示。
图5.3登录操作流程图
可视化模块构建多维交互分析体系,围绕用户决策流程设计三层核心功能可视化代码如图5.7
图5.7数据可视化代码图
5.4.1概念设计
下面是整个贵州民宿价格预测系统中主要的数据库表总E-R实体关系图。
图5.8贵州民宿价格预测系统系统总E-R关系图
5.4.2数据表设计
通过上一小节中贵州民宿价格预测系统中总E-R关系图上得出一共需要创建很多个数据表。在此主要罗列几个主要的数据库表结构设计。
表5.1用户表
编号 |
名称 |
数据类型 |
长度 |
数位 |
许空值 |
键 |
默认值 | |||
1 |
id |
INTEGER |
0 |
0 |
N |
Y | ||||
2 |
password |
varchar |
128 |
0 |
Y |
N | ||||
3 |
last_login |
datetime |
0 |
0 |
Y |
N | ||||
4 |
is_superuser |
bool |
0 |
0 |
N |
N | ||||
5 |
first_name |
varchar |
150 |
0 |
N |
N | ||||
6 |
last_name |
varchar |
150 |
0 |
N |
N | ||||
7 |
|
varchar |
254 |
0 |
N |
N | ||||
8 |
is_staff |
bool |
0 |
0 |
N |
N | ||||
9 |
is_active |
bool |
0 |
0 |
N |
N | ||||
10 |
date_joined |
datetime |
0 |
0 |
N |
N | ||||
11 |
username |
varchar |
50 |
0 |
N |
N | ||||
12 |
gender |
varchar |
1 |
0 |
N |
N | ||||
13 |
phone_number |
varchar |
20 |
0 |
N |
N | ||||
14 |
avatar |
varchar |
100 |
0 |
N |
N |
表5.2民宿信息表
字段名 |
数据类型 |
长度 |
id |
INTEGER |
0 |
commentCount |
TEXT |
0 |
commentScore |
Float |
0 |
commentScorePerc |
int |
0 |
dangci |
int |
0 |
hcommentCount |
int |
0 |
name |
TEXT |
0 |
priceN |
float |
0 |
ratingScore |
float |
0 |
sightAreaName |
varchar |
255 |
stars |
int |
0 |
6系统实现
6.1 登录注册实现
用户注册功能由register.html实现,表单包含用户名、密码及确认密码字段。其用户注册界面展示如下图所示。
图6.1注册界面代码
图6.2注册界面图
用户登录功能通过login.html前端表单提交用户名、密码及登录类型(普通用户或管理员),后端基于Django的AuthenticationForm实现验证逻辑。用户登录界面如下图所示
图6.3用户登录界面代码
图6.4用户登录界面图
6.2 可视化实现
评分走势模块采用折线图与面积图叠加设计,横轴为时间维度,纵轴映射评分数值。用户通过城市选择器触发AJAX请求,后端返回该区域民宿评分均值时序数据。其评分分析可视化展示如下图所示。
图6.5评分分析代码
图6.6评分分析界面
评论占比分析使用漏斗图呈现,每层标注数量区间标签,外环辐射状分布各档次民宿数量。颜色编码按价格梯度从冷色调过渡到暖色调,视觉强化评论与低评价差异。其评论分布可视化展示如下图所示。
图6.7评论占比分析代码
图6.8评论占比分析界面
标题关键词分析采用动态词云布局,圆形画布内词汇按词频自适应缩放,随机RGB色值增强视觉层次。标题关键词分析可视化展示如下图所示。
图6.9词云布局代码
图6.10词云布局界面
6.3 预测实现
预测模块采用前后端分离架构,前端通过表单收集用户输入的评论数、评分值、民宿档次三项关键特征,使用input标签限定数值范围与格式校验。预测界面展示如下图所示。
图6.11预测实现代码
图6.12预测实现界面
系统测试作为软件开发生命周期的关键环节,通过集成测试、压力测试等标准化流程验证系统健壮性。该阶段重点检测功能逻辑漏洞、性能瓶颈及异常处理能力,可提前消除80%以上的技术债务。测试数据表明,完整测试周期能提升30%系统可维护性指数,同时建立版本基线控制体系,确保系统具备可迭代性,为后续版本升级奠定质量基线。。
用户登录功能测试:
表7.1用户登录功能测试表
用例名称 |
登录用例 |
目的 |
检查登录功能是否能使用 |
前提 |
运行系统后 |
测试流程 |
1)点击登录页面 2)使用测试的用户名和密码登录 |
预期结果 |
只有密码和账号正确了才能进入主页,否则提示账号或者密码错误 |
实际结果 |
实际结果与预期结果一致 |
可视化功能测试:
表7.2可视化功能测试表
用例名称 |
可视化功能用例 |
目的 |
测试用户登录后可视化功能是否能够正常使用 |
前提 |
登录系统后 |
测试流程 |
1)登录系统进入主页,选择某一个可视化功能 2)点击进入可视化页面 |
预期结果 |
生成可视化图表,且图表显示正常 |
实际结果 |
实际结果与预期结果一致 |
预测功能测试:
表7.3预测功能测试表
用例名称 |
预测功能用例 |
目的 |
测试用户登录后预测功能是否能够正常使用 |
前提 |
登录系统后 |
测试流程 |
1)登录系统进入主页,选择预测功能 2)点击进入预测页面 3)输入要预测的测试数据 |
预期结果 |
生成预测结果 |
实际结果 |
实际结果与预期结果一致 |