预测入住酒店位置的案例

2023-10-18 04:20

本文主要是介绍预测入住酒店位置的案例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一. KNN算法

  1. 定义:
    邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。
    kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 kNN方法在类别决策时,只与极少量的相邻样本有关。由于kNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,kNN方法较其他方法更为适合。
  2. 原理 :
    KNN是一种即可用于分类又可用于回归的机器学习算法。对于给定测试样本,基于距离度量找出训练集中与其最靠近的K个训练样本,然后基于这K个“邻居”的信息来进行预测。
    在分类任务中可使用投票法,选择这K个样本中出现最多的类别标记作为预测结果;在回归任务中可使用平均法,将这K个样本的实值输出标记的平均值作为预测结果。当然还可以基于距离远近程度进行加权平均等方法。
    KNN中运用就是欧氏距离
  3. 数据:
    预测入住酒店的位置
    数据下载:
    链接:https://pan.baidu.com/s/1w0GRA3bRJJKB2Dze8kzABA
    提取码:yd3i
  4. 平台: Pycharm

二. 算法过程

  1. 先用 pandas 读取数据, 打印数据的信息
  2. 参数详解:
    row_id : 样本序号
    x : x 坐标
    y : y 坐标
    accuracy : 定位的精准度
    time : 时间
    place_id : 位置
  3. 选取特征值
    row_id , x , y , accuracy , time
  4. 选取目标值( 预测入住酒店的位置 所以选取 place_id 为目标值)
    place_id
data = pd.read_csv("../data/train.csv")
print(data.info())

在这里插入图片描述

  1. 利用pandas 中的 query 来缩小数据的范围, 因为我的电脑性能那么好,所以缩小了数据的范围, 里面的范围直接用字符串表示, 不同条件之间 ‘与’ : & ‘或’ : | ‘非’ : !
data = data.query("x > 1.0 & x <1.25 & y > 2.5 & y < 2.75")
  1. 处理 time 字段, 利用 pandas 中的 to_datatime 方法, 将数据中的 time 格式转换为, pandas 中的时间格式, 为的是以 天, 小时, 周 处理时间
time_value = pd.to_datatime(data["time"],unit='s')
# 把 日期格式 转换为 字典格式
time_value = pd.DatetimeIndex(time_value)
print(time_value)

在这里插入图片描述
7. 我们需要在原有的数据中构造一些特征, 构造 天, 小时, 周, 再将 time 列删除

# 添加新的列 day hour weekday
data["day"] = time_value.day
data["hour"] = time_value.hour
data["weekday"] = time_value.weekday
# 将没用的 time 列删除 避免影响预测结果
data = data.drop(['time'], axis=1)
  1. 大家在选择酒店的时候不可能选择入住人数很少的酒店吧, 所以我们要把 place_id 少于 30 次的酒店的样本删除
# 先通过 groupby 以 place_id 进行分组 行索引为:place_id 
place_count = data.groupby('place_id').count()

在这里插入图片描述
此时的 row_id 就是每一个酒店 (place_id) 的入住人数,可以通过 row_id 进行筛选, 数据的结构如下图:

tf = place_count[place_count.row_id > 30].reset_index()

在这里插入图片描述
这是我们筛选出来的入住酒店次数大于 30 次的数据,再将这个数据与原始的数据进行对比筛选

data = data[data['place_id'].isin(tf.place_id)]
print(data.head(10))

在这里插入图片描述
数据中的 row_id 已经没有用了, 这样我们就可以将这一列删除

data = data.drop(['row_id'], axis=1)
  1. 以上就是数据的处理过程. 下面我们将进行预测分析, 先取出数据中的 特征值目标值
# 将目标值再原有的数据中删除作为我们的特征值, x 为特征值
x = data.drop(['place_id'], axis=1)
# y 为 目标值
y = data['place_id']
  1. 分割训练集和测试集
# test 参数为测试集的占比, 也就是训练集占 75% 测试集占 25%
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)
  1. 特征工程(将数据标准化),因为我们的数据都是数值类型的, 对于同一个特征,不同的样本中的取值可能会相差非常大,一些异常小或异常大的数据会误导模型的正确训练, 我们可以将特征中的值进行标准差标准化,即转换为均值为0,方差为1的正态分布, 它的计算公式为:标准化数据=(原数据-均值)/标准差
# 特征工程(标准化)
std = StandardScaler()
# 对 训练集和测试集的特征值进行标准化
x_train = std.fit_transform(x_train)
x_test = std.transform(x_test)
  1. 接下来就开始执行算法 n_neighbors 为 5 个邻近样本为一个区
knn = KNeighborsClassifier(n_neighbors=5)
# 开始训练计算,得出一个预测的模型
knn.fit(x_train, y_train)
# 将测试集输入到模型中进行预测,得出运算结果
y_predict = knn.predict(x_test)
print("预测的目标签到位置为:", y_predict[:5])
# 得出准确率
print("准确率为:", knn.score(x_test, y_test))

在这里插入图片描述

三. 算法过程的 API

from sklearn.neighbors import KNeighborsClassifier
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
  • KNeighborsClassifier:就是KNN算法的API
  • pd:就是pandas的API
  • train_test_split:这是分割训练集和测试集的API
  • StandardScaler:这是特征工程的标准化API

四. 总结

  1. 算法优点

    • KNN可以处理分类问题,同时天然可以处理多分类问题,适合对稀有事件进行分类 。
    • KNN还可以处理回归问题,也就是预测。
    • 简单,易于理解,易于实现,无需估计参数。
  2. 算法缺点

    • 计算量太大,尤其是特征数非常多的时候。每一个待分类文本都要计算它到全体已知样本的距离,才能得到它的第K个最近邻点。
    • 对训练数据依赖度特别大,对训练数据的容错性太差。如果训练数据集中,有一两个数据是错误的,刚刚好又在需要分类的数值的旁边,这样就会直接导致预测的数据的不准确
  3. 预测结果分析

    • 上面的图片的预测率为:57%,可能是缩小数据所导致的,如果你的电脑比较牛掰,你就可以不用缩小数据的范围,直接进行计算分析,当然了 KNN 算法对电脑内存的消耗是挺大的
    • 也可能是 n_neighbor 设置的不合理,可以用交叉验证网格搜索的方法来提高预测的准确率

这篇关于预测入住酒店位置的案例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/230131

相关文章

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

MySQL不使用子查询的原因及优化案例

《MySQL不使用子查询的原因及优化案例》对于mysql,不推荐使用子查询,效率太差,执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,本文给大家... 目录不推荐使用子查询和JOIN的原因解决方案优化案例案例1:查询所有有库存的商品信息案例2:使用EX

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

客户案例:安全海外中继助力知名家电企业化解海外通邮困境

1、客户背景 广东格兰仕集团有限公司(以下简称“格兰仕”),成立于1978年,是中国家电行业的领军企业之一。作为全球最大的微波炉生产基地,格兰仕拥有多项国际领先的家电制造技术,连续多年位列中国家电出口前列。格兰仕不仅注重业务的全球拓展,更重视业务流程的高效与顺畅,以确保在国际舞台上的竞争力。 2、需求痛点 随着格兰仕全球化战略的深入实施,其海外业务快速增长,电子邮件成为了关键的沟通工具。

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

POJ1269 判断2条直线的位置关系

题目大意:给两个点能够确定一条直线,题目给出两条直线(由4个点确定),要求判断出这两条直线的关系:平行,同线,相交。如果相交还要求出交点坐标。 解题思路: 先判断两条直线p1p2, q1q2是否共线, 如果不是,再判断 直线 是否平行, 如果还不是, 则两直线相交。  判断共线:  p1p2q1 共线 且 p1p2q2 共线 ,共线用叉乘为 0  来判断,  判断 平行:  p1p