机器学习运用-民宿价格

项目简介

随着旅游业的蓬勃发展,民宿市场迎来了前所未有的增长机遇。正好最近在参加拓尔思数据挖掘公益实习活动,我的项目将应用机器学习技术开发一个价格预测模型。可以达到更好地理解和预测民宿价格的目的,该模型综合考虑了从容纳人数、便利设施数量到房主回复率等一系列关键数据,目的在于评估并预测不同民宿的潜在价格。

通过分析包括民宿的物理属性(床铺、卧室与洗手间的数量等)、位置数据(维度、经度和邮编等)、客户互动指标(评论个数和房主回复率等)以及提供的便利服务和条件(互联网接入、厨房设施和其他基础设施等),模型旨在捕捉影响价格的各种因素。此外,模型还将探讨民宿的类型、所在城市、清洁费用及即时预订支持等对价格可能产生的影响。最后,通过考察房主的在线呈现,如是否有个人资料图片及身份验证,进一步完善模型预测的准确性。

项目采用CatBoost对数据进行分析,CatBoost(Categorical Boosting)是由 Yandex 开发的一个开源机器学习库,基于梯度提升决策树(Gradient Boosted Decision Trees, GBDT)算法的一种实现,专为处理分类(Categorical)数据而设计,同时也可以完成一些回归任务。CatBoost 可以提供高性能、可扩展性和精确度,尤其运用在是在具有很多类别特征的数据集上表现突出。


数据总览

文件包括"train.csv"和"test.csv"两个文件,下面是"trian.csv"的大致含有的特征内容:

在这里插入图片描述


代码分析

导入相关python库和数据

# 导入相关库import pandas as pd
from sklearn.preprocessing import RobustScaler
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from catboost import CatBoostRegressor, Pool
from sklearn.metrics import mean_squared_error,r2_score
import warnings# optionswarnings.filterwarnings('ignore')#这行命令将会忽略python警告信息,使得输出结果更加清晰,不被警告打扰。
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)#用来确保在输出DataFrame时能显示所有的行和列。# 加载数据集train = pd.read_csv('./train_data.csv')
test = pd.read_csv('./test_data.csv')# 数据探索
train.info()
train.head()

train.info(),会显示关于DataFrame的一些基本信息,如:列名、非空值数量、每列的数据类型。

train.head(),会显示DataFrame的前几行数据,默认情况下是前5行。这对于快速查看数据集的样本数据以及确保数据被正确加载也是很有用的。

特征工程处理

#添加新特征:便利设施数量train['便利设施_num'] = train['便利设施'].str.split(',')
int_equipments = []
for item in train['便利设施_num']:num = len(item)int_equipments.append(num)
train['便利设施_num'] = int_equipmentstest['便利设施_num'] = test['便利设施'].str.split(',')
int_equipments_test = []
for item in test['便利设施_num']:num = len(item)int_equipments_test.append(num)
test['便利设施_num'] = int_equipments_test# 分割'便利设施'for key_words in ['Internet', 'Kitchen', 'Pets', 'Air', 'Washer', 'Aid', 'Heating', 'Dryer', 'Essentials', 'Hangers','TV','parking', '24-hour']:train[key_words] = train['便利设施'].str.contains(key_words).astype('str')test[key_words] = test['便利设施'].str.contains(key_words).astype('str')# '民宿周边'特征train['民宿周边'] = train['民宿周边'].fillna(-999) #将NaN填充指定值
test['民宿周边'] = test['民宿周边'].fillna(-999)surround_train = []
for value in train['民宿周边']:if value == -999:new_value = 0else:new_value = 1surround_train.append(new_value)
train['民宿周边'] = surround_trainsurround_test = []
for value in test['民宿周边']:if value == -999:new_value = 0else:new_value = 1surround_test.append(new_value)
test['民宿周边'] = surround_test#'房主是否有个人资料图片'和'房主身份是否验证'特征train['房主是否有个人资料图片'] = train['房主是否有个人资料图片'].fillna('f')
test['房主是否有个人资料图片'] = test['房主是否有个人资料图片'].fillna('f')
train['房主身份是否验证'] = train['房主身份是否验证'].fillna('f')
test['房主身份是否验证'] = test['房主身份是否验证'].fillna('f')str_cols = ['Internet', 'Kitchen', '房主是否有个人资料图片', '房主身份是否验证', 'Air', 'Pets', 'Washer', 'Aid','Heating', 'Dryer','Essentials', 'Hangers', 'TV', 'parking', '24-hour']
le = LabelEncoder()
for col in str_cols:train[col] = le.fit_transform(train[col])test[col] = le.fit_transform(test[col])# '房主回收率'特征train['房主回复率'] = train['房主回复率'].fillna('20%')
test['房主回复率'] = test['房主回复率'].fillna('20%')
train['房主回复率'] = train['房主回复率'].str[:-1]
#去除数据中的‘%’
test['房主回复率'] = test['房主回复率'].str[:-1]# '首次评论日期'特征
train['首次评论日期'] = train['首次评论日期'].fillna('2019-1-1')
test['首次评论日期'] = test['首次评论日期'].fillna('2019-1-1')
train['最近评论日期'] = train['最近评论日期'].fillna('2019-1-1')
test['最近评论日期'] = test['最近评论日期'].fillna('2019-1-1')time_cols = ['首次评论日期', '最近评论日期', '何时成为房主']
for col in time_cols:train[col] = pd.to_datetime(train[col])test[col] = pd.to_datetime(test[col])# '邮编'特征
train['邮编'] = train['邮编'].fillna(0)
test['邮编'] = test['邮编'].fillna(0)
train['邮编'] = train['邮编'].astype('str')
test['邮编'] = test['邮编'].astype('str')# 特征处理:将特征分为连续变量和分类变量,分别处理cols = train.columns
cont_cols = ['容纳人数', '便利设施_num', '床的数量', '卧室数量', '洗手间数量', '维度', '经度', '评论个数', '民宿评分','房主回复率']
cate_cols=['邮编','Internet','Kitchen','Air','Pets','Washer','Aid','Heating','Dryer','Essentials','Hangers',"TV",'parking','24-hour','床的类型','民宿周边','取消条款','所在城市','清洁费','是否支持随即预订','房产类型','房型','房主是否有个人资料图片', '房主身份是否验证']
#定义了两个列表,分别包含了连续型特征列和分类型特征列的列名#其他离散型特征的处理
features = cont_cols + cate_colstrain[cate_cols] = train[cate_cols].astype('category')
test[cate_cols] = test[cate_cols].astype('category')
#将训练集和测试集中的分类型特征列的数据类型转换为 'category' 类型。for col in cate_cols:train[col]=train[col].fillna(train[col].mode())test[col] = test[col].fillna(test[col].mode())
#对分类型特征列中的缺失值进行填充,填充的值为该列的众数(mode)。for col in ['洗手间数量','床的数量','卧室数量','民宿评分']:train[col]=train[col].fillna(train[col].median())test[col] = test[col].fillna(test[col].median())
#对指定的连续型特征列中的缺失值进行填充,填充的值为该列的中位数(median)。
train=train.dropna().reset_index()#特征缩放:其他连续型特征的处理
X_train=train[features]
scaler=RobustScaler()
scaler.fit(X_train[cont_cols])
#使用训练集中的连续型特征列来拟合RobustScaler对象。
X_train[cont_cols]=scaler.transform(X_train[cont_cols])X_test=test[features]
X_test[cont_cols]=scaler.transform(X_test[cont_cols])
y_train=train['价格'].astype('int')

DateFrame[colum].str.contains(key_words)

方法在列colum中查找是否包含特定关键词 key_words,返回一个布尔类型的 Series。

astype(‘str’)

将项目中上一步生成的布尔类型的 Series 转换为字符串类型,将 True 和 False 分别转换为 ‘True’ 和 ‘False’ 字符串。

LabelEncoder()

LabelEncoder()是sklearn的内容,le = LabelEncoder(),实例化一个LabelEncoder对象,用于对分类特征进行编码

fit_transform()

fit_transform() 方法会先对指定的列数据进行拟合,然后进行实际的转换操作。在这个过程中,LabelEncoder 会根据指定列的值建立编码规则,并将分类特征转换为数值编码。

to_datetime()

Pandas中的函数,将DataFrame中的当前列col中的日期时间字符串转换为 Pandas datetime 类型。

dropna()

删除训练集中的所有包含缺失值的行

reset_index()

重置 DataFrame 的索引。

RobustScaler()

scaler=RobustScaler(),这行代码实例化了一个 RobustScaler 对象,用于后续的特征缩放。RobustScaler 是一种对异常值有鲁棒性的缩放器,它使用中位数和四分位数范围来缩放特征。

模型训练和拟合

#划分数据集
X_train,X_valid,y_train,y_valid=train_test_split(X_train,y_train,random_state=1025,test_size=0.2)train_pool=Pool(X_train,y_train,cat_features=cate_cols)
eval_pool=Pool(X_valid,y_valid,cat_features=cate_cols)
#两行代码创建了两个CatBoost数据池,一个用于训练,一个用于评估。model=CatBoostRegressor()
#实例化CatBoostRegressor对象,用于后续的模型训练。model.fit(train_pool,eval_set=eval_pool)
#使用训练数据池进行模型训练,并设置了评估数据集。y_pred_valid=model.predict(X_valid)
#使用训练好的模型对验证集进行预测,将结果存储在y_pred_valid中print(y_pred_valid)result_df=X_valid.copy()
result_df['价格']=y_valid
result_df['预测价格']=y_pred_valid
#创建一个新的DataFrame,将实际值、预测值和特征重新集合result_df.head()

模型评价

mse=mean_squared_error(y_valid,y_pred_valid)  #均方误差
r2=r2_score(y_valid,y_pred_valid)             #r2系数
print('mse的值为:',mse)
print('r2的值为:',r2)

模型使用

predictions=model.predict(X_test)
#使用训练好的模型对测试集进行预测
new_results_df=X_test.copy()
new_results_df['预测价格']=predictions
new_results_df.head()
#同训练集,构建出测试集DataFrame

结果展示

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/2728.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python】Python函数的黑魔法:递归,嵌套函数与装饰器

欢迎来到CILMY23的博客 本篇主题为: Python函数的黑魔法:递归,嵌套函数与装饰器 个人主页:CILMY23-CSDN博客 系列专栏:Python | C | C语言 | 数据结构与算法 感谢观看,支持的可以给个一键三连&#xff…

基于51单片机的矩阵按键扫描的proteus仿真

文章目录 一、按键按键按键消抖 二、独立按键仿真图仿真程序 三、矩阵按键仿真图仿真程序 四、总结 一、按键 按键 按键通常指的是电子设备上的一种输入装置,用于在按下时发送信号,以便设备执行相应的操作。按键可以分为独立按键和矩阵按键两种类型。 …

TRIZ理论下攀爬机器人的创新设计与研究

随着科技的飞速发展,机器人技术已广泛应用于各个领域。特别是在复杂环境下的作业,如灾难救援、太空探测等,对机器人的移动能力和适应性提出了更高要求。在这样的背景下,基于TRIZ理论的攀爬机器人设计与研究应运而生,它…

简单的图像处理算法

本笔记参考crazy_Bingo 基础: 图像处理都是用卷积矩阵对图像卷积计算,如3X3 的矩阵对640 X 480分辨率的图像卷积,最终会得到638 X 478 的图像。卷积过程是这样的: 一、中值滤波 : 找出矩阵中的最中间值作为像素点 中…

Flink的安装、项目创建、任务打包和部署完整实现,任务实现使用JAVA语言

Flink资源下载地址 Flink安装包下载地址 一、本地模式安装Flink 1、在Linux服务上,创建flink文件夹 mkdir flink 2、上传文件并解压 tar -zxvf flink-1.14.6-bin-scala_2.11.tgz 解压完成后,如图: 3、启动Flink 进入到解压目录下&#x…

YOLOv9训练损失、精度、mAP绘图功能 | 支持多结果对比,多结果绘在一个图片(消融实验、科研必备)

一、本文介绍 本文给大家带来的是YOLOv9系列的绘图功能,我将向大家介绍YOLO系列的绘图功能。我们在进行实验时,经常需要比较多个结果,针对这一问题,我写了点代码来解决这个问题,它可以根据训练结果绘制损失(loss)和mA…

Java的八大基本数据类型和 println 的介绍

前言 如果你有C语言的基础,这部分内容就会很简单,但是会有所不同~~ 这是我将要提到的八大基本数据类型: 注意,Java的数据类型是有符号的!!!和C语言不同,Java不存在无符号的数据。 整…

Day:动态规划 LeedCode 123.买卖股票的最佳时机III 188.买卖股票的最佳时机IV

123. 买卖股票的最佳时机 III 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票&a…

安全开发实战(2)---域名反查IP

目录 安全开发专栏 前言 域名与ip的关系 域名反查ip的作用 1.2.1 One 1.2.2 Two 1.2.3 批量监测 ​总结 安全开发专栏 安全开发实战http://t.csdnimg.cn/25N7H 这步是比较关键的一步,一般进行cdn监测后,获取到真实ip地址后,或是域名时,然后进行域名反查IP地址,进行进…

基于Springboot的职称评审管理系统

基于SpringbootVue的职称评审管理系统的设计与实现 开发语言:Java数据库:MySQL技术:SpringbootMybatis工具:IDEA、Maven、Navicat 系统展示 用户登录 首页 评审条件 论坛信息 系统公告 后台登录页面 用户管理 评审员管理 省份…

再谈C语言——理解指针(四)

assert断⾔ assert.h 头⽂件定义了宏 assert() ,⽤于在运⾏时确保程序符合指定条件,如果不符合,就报错终⽌运⾏。这个宏常常被称为“断⾔”。 assert(p ! NULL); 上⾯代码在程序运⾏到这⼀⾏语句时,验证变量 p 是否等于 NULL 。…

​LeetCode解法汇总2385. 感染二叉树需要的总时间

目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:. - 力扣(LeetCode) 描述: 给你一棵二叉树的根节点 root &#xff0…

创建型设计模式

七大原则 1. 开闭原则(Open-Closed Principle, OCP) 详解:软件实体(类、模块、函数等)应该易于扩展,但是不易于修改。换句话说,当软件需求变化时,应该通过添加新代码来实现变化&am…

销冠必备:高效跟进客户的四个技巧

作为一名销售,高效而精准地跟进客户是取得成功的关键。今天,我将分享四个技巧,让你也能够高效的跟进客户。 1、善于发问 通过多询问客户,你可以更好地了解客户的需求和痛点。在与客户交流时,不要只是简单地回答问题&…

业务复习知识点Oracle查询

业务数据查询-1 单表查询 数据准备 自来水收费系统建表语句.sql 简单条件查询 精确查询 需求 :查询水表编号为 30408 的业主记录 查询语句 : select * from t_owners where watermeter 30408; 查询结果 : 模糊查询 需求 :查询业…

毕业设计注意事项(2024届更新中)

1.开题 根据学院发的开题报告模板完成,其中大纲部分可参考资料 2.毕设 根据资料中的毕设评价标准,对照工作量 3.论文 3.1 格式问题 非常重要,认真对比资料中我发的模板,格式有问题,答辩输一半! 以word…

W801学习笔记十四:掌机系统——菜单——尝试打造自己的UI

未来将会有诸多应用,这些应用将通过菜单进行有序组织和管理。因此,我们需要率先打造好菜单。 LCD 驱动通常是直接写屏的,虽然速度较快,但用于界面制作则不太适宜。所以,最好能拥有一套 UI 框架。如前所述,…

【linux】编译器使用

目录 1. gcc ,g 编译器使用 a. 有关gcc的指令(g同理) 2. .o 文件和库的链接方式 a. 链接方式 b. 动态库 和 静态库 优缺点对比 c. debug 版本 和 release 版本 1. gcc ,g 编译器使用 a. 有关gcc的指令(g同理&…

设计模式-创建型-抽象工厂模式-Abstract Factory

UML类图 工厂接口类 public interface ProductFactory {Phone phoneProduct();//生产手机Router routerProduct();//生产路由器 } 小米工厂实现类 public class XiaomiFactoryImpl implements ProductFactory {Overridepublic Phone phoneProduct() {return new XiaomiPhone…

Node.js -- fs模块

文章目录 1. 写入文件1.1 写入文件1.2 同步和异步1.3 文件追加写入1.4 流式写入1.5 文件写入的场景 2. 读取文件2.1 异步和同步读取2.2 读取文件应用场景2.3 流式读取2.4 fs 练习 -- 文件复制 3. 文件重命名和移动4. 文件删除5. 文件夹操作5.1 创建文件夹5.2 读取文件夹5.3 删除…