预测分析·民宿价格预测


赛题&数据

赛题

民宿这一名词,是日语中“Minshuku”的音译。我国第一部关于民宿的旅游行业标准《旅游民宿基本要求与评价》已从2017年10月1日起开始实施,该标准定义:民宿是利用当地闲置资源,民宿主人参与接待,为游客提供体验当地自然、文化与生产生活方式的小型住宿设施。

2019年4月,Trustdata公布了《2019年中国在线民宿预订行业发展研究报告》,报告中公布的数据显示,2016-2019年,受旅游消费人数的增加及需求的拉动,在线民宿房源数和房东数同比增加,其中至2018年我国在线民宿的房源数达到107.2万个,而房东数达到32.5万个,初步核算,平均一个房东拥有3.3个民宿房源,较2016年每人约2个民宿房源数实现了明显的增加。

近年来,用于房东或者户主将闲置房产变为私人住宿服务已变得流行。在私人住宿中,业主根据房间的大小和位置来决定住宿价格,但要设定合理的价格并不容易。因此,在本次练习赛旨在引导我们尝试建立一个模型,该模型使用某私人住宿在线服务平台上发布的房地产数据来预测住宿价格。

基于hive的民宿价格分析系统总结与展望 民宿的定价策略_数据集

数据说明

本次练习赛所使用数据集基于民宿价格数据集,并且针对部分字段做出了一定的调整,所有的字段信息请以本练习赛提供的字段信息为准
字段信息内容参考如下:

字段名

数据类型

字段描述

数据ID

string

数据的唯一ID,比如test_0,train_1024

容纳人数

int

房间可以允许住几个人

便利设施

string

房间提供的便利设施描述,如是否有电视空调

洗手间数量

float

洗手间的数量

床的数量

int

房间内床的个数

床的类型

int

床的类型编码

卧室数量

int

卧室的个数

取消条款

int

取消条款的类型编码

所在城市

int

民宿所在的城市编码

清洁费

int

是否需要清洁费的0/1编码

首次评论日期

string

民宿的首次评论日期

房主是否有个人资料图片

string

民宿介绍中是否有房主个人资料照片

房主身份是否验证

int

民宿房主身份是否验证过的0/1编码

房主回复率

string

民宿房主消息回复率

何时成为房主

string

房东何时成为该民宿的房主

是否支持随即预订

string

是否支持随即预定

最近评论日期

string

最近评论日期

维度

float

民宿所在的维度

经度

float

民宿所在的经度

民宿周边

string

民宿周边的景区

评论个数

int

民宿的历史评论个数

房产类型

int

民宿的房产类型编码,如个人住宅、公寓等

民宿评分

float

民宿的用户评分

房型

int

房子类型编码,比如单间还是整间等

邮编

int

民宿的邮编号码

价格

float

民宿价格

数据下载

报名 -> 进入组织 -> 首页可查看数据


提交&评审

提交方式

直接在赛事提交页面「上传」结果文件即可。
 

结果文件要求

提交文件必须为 csv 格式的文件,文件的字段信息如下:

字段名

数据类型

字段描述

id

Int

数据的id

price

Float

民宿价格

客观评审

评测方法:

  • 为了进行精度评估,使用了评估指标“ RMSE”。
  • 评估指标大于等于0,预测精度越高,该值越小。

基于hive的民宿价格分析系统总结与展望 民宿的定价策略_数据集_02

评审说明
每支队伍拥有每天 5 次提交与测评排名的机会,排行榜实时更新,从高到低排序,若队伍一天内多次提交结果,新结果版本将覆盖原版本。

免费算力

本次比赛提供免费版 2核 8G CPU

 


【参考代码】回归

import pandas as pd
from sklearn.model_selection import train_test_split
#from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LinearRegression  #线性回归
import time
import  numpy as np

from sklearn.preprocessing import MinMaxScaler
 
t_start = time.time()

#1.加载样本数据
data = pd.read_csv('训练集.csv')
data1 = pd.read_csv('测试集.csv')
#data.info()  #可以用 .info()查看各列数据的缺失情况

data['民宿评分'] =  data['民宿评分'].fillna(data['民宿评分'].mean())
data['床的数量'] =  data['床的数量'].fillna(data['床的数量'].mean())#卧室数量
data['卧室数量'] =  data['卧室数量'].fillna(data['卧室数量'].mean())

data1['民宿评分'] =  data1['民宿评分'].fillna(data1['民宿评分'].mean())
data1['床的数量'] =  data1['床的数量'].fillna(data1['床的数量'].mean())#卧室数量
data1['卧室数量'] =  data1['卧室数量'].fillna(data1['卧室数量'].mean())
#2.样本数据特征提取
feature = data[['容纳人数','床的数量','卧室数量','所在城市',"是否支持随即预订","维度","经度","民宿评分"]]#feature.shape = (59288, 8)
target = data['价格']#target.shape = (59288,)

feature1 = data1[['容纳人数','床的数量','卧室数量','所在城市',"是否支持随即预订","维度","经度","民宿评分"]]#feature.shape = (59288, 8)

#3.样本数据集拆分  训练数据集train_data   测试数据集test_data
x_train = feature
y_train = target

x_test = feature1
#4.观察特征数据看是否需要进行特征工程  #feature数据全为数值型;不需要one_hot
#训练集的特征数据进行归一化操作
#Mm = MinMaxScaler()
#m_x_train = Mm.fit_transform(x_train)
 
#5.实例化模型对象
#knn = KNeighborsClassifier(n_neighbors=3).fit(m_x_train,y_train)
linreg = LinearRegression().fit(x_train, y_train)

#6.测试模型:使用测试数据
print('开始对测试集评分...')
score = linreg.score(x_train,y_train)
t_end = time.time()

print("共计耗时:",(t_end-t_start),'秒')

y_test = linreg.predict(x_test)

#print('linreg测试集评分:',score)

df = pd.read_csv( '.\\提交样例.csv')
df["价格"] =y_test

df.to_csv("提交样例1.csv",index=0)

 

【knn参考代码】  误差太大

#KNN
import pandas as pd
from sklearn.neighbors import KNeighborsClassifier#KNN
import time
import  numpy as np
from sklearn.preprocessing import MinMaxScaler
 
t_start = time.time()

#1.加载样本数据
data = pd.read_csv('训练集.csv')
data1 = pd.read_csv('测试集.csv')
#data.info()  #可以用 .info()查看各列数据的缺失情况

data['民宿评分'] =  data['民宿评分'].fillna(data['民宿评分'].mean())
data['床的数量'] =  data['床的数量'].fillna(data['床的数量'].mean())#卧室数量
data['卧室数量'] =  data['卧室数量'].fillna(data['卧室数量'].mean())

data1['民宿评分'] =  data1['民宿评分'].fillna(data1['民宿评分'].mean())
data1['床的数量'] =  data1['床的数量'].fillna(data1['床的数量'].mean())#卧室数量
data1['卧室数量'] =  data1['卧室数量'].fillna(data1['卧室数量'].mean())

#2.样本数据特征提取
feature = data[['容纳人数','床的数量','卧室数量','所在城市',"是否支持随即预订","维度","经度","民宿评分"]]#feature.shape = (59288, 8)
target = data['价格']#target.shape = (59288,)

feature1 = data1[['容纳人数','床的数量','卧室数量','所在城市',"是否支持随即预订","维度","经度","民宿评分"]]#feature.shape = (59288, 8)

#3.样本数据集拆分  训练数据集train_data   测试数据集test_data
x_train = feature
y_train = target

x_test = feature1
#4.观察特征数据看是否需要进行特征工程  #feature数据全为数值型;不需要one_hot
#训练集的特征数据进行归一化操作
Mm = MinMaxScaler()
m_x_train = Mm.fit_transform(x_train)


m_x_test = Mm.transform(x_test)

#5.实例化模型对象
knn = KNeighborsClassifier(n_neighbors=3).fit(m_x_train,(1000*y_train).astype('int'))


#6.测试模型:使用测试数据
print('开始对测试集评分...')
score = knn.score(m_x_test,y_test*1000)
t_end = time.time()
print('knn测试集评分:',score)
print("共计耗时:",(t_end-t_start),'秒')

y_test = knn.predict(x_test).astype('float')/1000

df = pd.read_csv( '.\\提交样例.csv')
df["价格"] =y_test

df.to_csv("提交样例knn.csv",index=0)