使用Python机器学习预测外卖送餐时间!

news2024/11/16 23:38:24

d4972243de46805821f2450e2f95a2ac.gif

大家好,我是小F~

现在的天气是一天比一天热,好多人周末休息在家的时候,就会选择点外卖,毕竟出去一趟又晒又热。

如果你太饿了,点餐太晚了,就可能去关注外卖员送餐到哪了,还有多少时间能送达。

这些信息在美团、饿了吗的App上面都会有显示的。那么这个外卖时间是怎么预测来的呢。

2bd57e90987571dc48fc215c2d1f9663.png

其中有一个办法就是,基于外卖员之前的配送信息,使用机器学习算法来预测外卖的配送时间。

今天小F就给大家来介绍一下,基于Python机器学习预测外卖送餐时间

为了实时预测送餐时间,我们需要计算食物准备点和食物消费点之间的距离。

在找到餐厅和送餐地点之间的距离之后,我们需要找到外卖员过去在相同距离内送餐所花费的时间之间的关系。

这里小F找到了一个数据集,包含了外卖员将食物从餐厅送到送货地点所需时间的数据。

Kaggle上的数据集,包含了这项任务的所有特征,你可以从下面的链接里去下载数据集。

https://www.kaggle.com/datasets/gauravmalik26/food-delivery-dataset

/ 01 /

数据处理

首先导入所需的Python库,读取数据集。

import pandas as pd
import numpy as np
import plotly.express as px

data = pd.read_csv("deliverytime.txt")
print(data.head())

数据集情况如下。

bfcdf00fccb5d6a48fc12f9aef180619.png

解读一下每个字段的含义~

ID: 订单ID 

Delivery_person_ID: 外卖员ID 

Delivery_person_Age: 外卖员年龄

Delivery_person_Ratings: 外卖员评分 

Restaurant_latitude: 餐厅纬度 

Restaurant_longitude: 餐厅经度 

Delivery_location_latitude: 配送点纬度 

Delivery_location_longitude: 配送点经度 

Type_of_order: 点餐类型 

Type_of_vehicle: 外卖员车辆类型 

Time_taken(min): 外卖员配送花费时间

再看一下每列的信息。

print(data.info())

结果如下,包含每列的名称、数据类型等信息。

c3660a6f2a9e7a5bb0ccf5fdf386c41b.png

看一下这个数据集是否包含空值。

data.isnull().sum()

结果如下,可以看到数据集是没有空值的。

9d60cd7202e966916d8fba3e6e554f20.png

数据集只提供了餐厅和送货地点的经纬度,所以我们需要计算两个经纬度之间的距离。

可以使用半正矢公式(Haversine Formula),根据经纬度计算地球上两点之间的距离。

# 设置地球的半径(千米)
R = 6371


# 将角度转换为弧度
def deg_to_rad(degrees):
    return degrees * (np.pi / 180)


# 使用半正矢公式(Haversine Formula)计算两点之间距离的
def distcalculate(lat1, lon1, lat2, lon2):
    d_lat = deg_to_rad(lat2 - lat1)
    d_lon = deg_to_rad(lon2 - lon1)
    a = np.sin(d_lat / 2) ** 2 + np.cos(deg_to_rad(lat1)) * np.cos(deg_to_rad(lat2)) * np.sin(d_lon / 2) ** 2
    c = 2 * np.arctan2(np.sqrt(a), np.sqrt(1 - a))
    return R * c


# 计算每对点之间的距离
data['distance'] = np.nan

for i in range(len(data)):
    data.loc[i, 'distance'] = distcalculate(data.loc[i, 'Restaurant_latitude'],
                                            data.loc[i, 'Restaurant_longitude'],
                                            data.loc[i, 'Delivery_location_latitude'],
                                            data.loc[i, 'Delivery_location_longitude'])

现在已经计算出了餐厅和送货地点之间的距离。

还在数据集中添加了一个新特征,即distance。

可以再次查看下数据集。

print(data.head())

结果如下。

4af744043d6500d7645285cbb2fcef13.png

/ 02 /

关系分析

接下来研究下数据,找出特征之间的关系。

先从运送食物的距离和时间之间的关系开始。

figure = px.scatter(data_frame=data,
                    x="distance",
                    y="Time_taken(min)",
                    size="Time_taken(min)",
                    trendline="ols",
                    title="Relationship Between Distance and Time Taken")
figure.show()

结果如下。

79bdd059ead664a70f21530814bbcde9.png

运送食物所花费的时间和距离之间存在固定的关系。

这说明大多数外卖员能够在25-30分钟内送出食物,无论距离远近。

那么外卖时间和外卖员的年龄之间又有什么关系呢?

figure = px.scatter(data_frame=data,
                    x="Delivery_person_Age",
                    y="Time_taken(min)",
                    size="Time_taken(min)",
                    color="distance",
                    trendline="ols",
                    title="Relationship Between Time Taken and Age")
figure.show()

结果如下。

75cc0f6b3143cd986e0bf131a0312cca.png

送餐时间与外卖员的年龄呈线性关系。

这意味着年轻的外卖员比年长的外卖员花更少的时间送餐,果然还是年轻好。

送餐时间和外卖员的评分之间的关系。

figure = px.scatter(data_frame=data,
                    x="Delivery_person_Ratings",
                    y="Time_taken(min)",
                    size="Time_taken(min)",
                    color="distance",
                    trendline="ols",
                    title="Relationship Between Time Taken and Ratings")
figure.show()

结果如下。

74e969a09b24202f5c0122f706b0a86a.png

送餐所花费的时间与外卖员的评分之间存在反比的线性关系。

这意味着与评分低的外卖员相比,评分高的外卖员在送餐上花费的时间更少。

话说谁不希望自己的外卖送快点,点了就想吃。

现在让我们来看看顾客订购的食物类型和外卖员使用的车辆类型是否会影响配送时间。

fig = px.box(data,
             x="Type_of_vehicle",
             y="Time_taken(min)",
             color="Type_of_order")
fig.show()

结果如下。

fa26050b68aa2d3311dee160232a6c0c.png

根据外卖员驾驶的车辆以及他们运送的食物类型,外卖员所花费的时间并没有差太多。

因此,根据分析,对送餐时间影响较大的特征有以下三点。

1. 外卖员的年龄

2. 外卖员的评分

3. 餐厅和送餐地点之间的距离

/ 03 /

模型预测

本次使用LSTM神经网络模型来训练机器学习模型,来完成食品配送时间预测的任务。

# 分类数据集
from sklearn.model_selection import train_test_split
x = np.array(data[["Delivery_person_Age",
                   "Delivery_person_Ratings",
                   "distance"]])
y = np.array(data[["Time_taken(min)"]])
xtrain, xtest, ytrain, ytest = train_test_split(x, y,
                                                test_size=0.10,
                                                random_state=42)

# 创建LSTM神经网络模型
from keras.models import Sequential
from keras.layers import Dense, LSTM
model = Sequential()
model.add(LSTM(128, return_sequences=True, input_shape=(xtrain.shape[1], 1)))
model.add(LSTM(64, return_sequences=False))
model.add(Dense(25))
model.add(Dense(1))
model.summary()

结果如下。

34eb9232bca71f4715456b1623ba5701.png

进行训练模型工作。

# 训练模型
model.compile(optimizer='adam', loss='mean_squared_error')
model.fit(xtrain, ytrain, batch_size=1, epochs=9)

结果如下。

db74ba98d24646c401708ba1fff2dcb4.png

模型训练好以后,就可以输入信息,来预测送餐时间。

print("Food Delivery Time Prediction")
a = int(input("Age of Delivery Partner: "))
b = float(input("Ratings of Previous Deliveries: "))
c = int(input("Total Distance: "))

features = np.array([[a, b, c]])
print("Predicted Delivery Time in Minutes = ", model.predict(features))

测验一下,结果如下。

49d3c82f26efaf82a4f4e33c12fb4069.png

输入信息:外卖员年龄29岁,评分2.9分,距离6km。

得到预测的送餐时间:约42分钟

相关文件及代码都已上传,公众号回复【送餐时间预测】即可获取。

万水千山总是情,点个 👍 行不行

推荐阅读

3a36a1f9748adcfe8480c9f03639c391.jpeg

8f62b5a8f29124d43613b98f9b0308e4.jpeg

85dc02373a5d40c60e36521b412ddf89.jpeg

···  END  ···

3764bf999d02b1fbcf1be9c24cb49161.jpeg

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

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

相关文章

Kotlin泛型的协变与逆变

以下内容摘自郭霖《第一行代码》第三版 泛型的协变 一个泛型类或者泛型接口中的方法,它的参数列表是接收数据的地方,因此可以称它为in位置,而它的返回值是输出数据的地方,因此可以称它为out位置。 先定义三个类: op…

《golang设计模式》第一部分·创建型模式-03-建造者模式(Builder)

文章目录 1. 概念1.1 角色1.2 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1. 概念 1.1 角色 Builder(抽象建造者):给出一个抽象接口,以规范产品对象的各个组成成分的建造。ConcreteBuilder(具体建造者)&a…

移动机器人和UGV的自主导航(Matlab代码Simulink)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Redis - 底层数据结构

简介 Redis 的底层数据结构主要以下几种: SDS(Simple Dynamic String, 简单动态字符串)ZipList(压缩列表)QuickList(快表)Dict(字典)IntSet(整数集合)ZSkipList(跳跃表) 简单动态字符串 在 Redis 中,并不会直接使用 C 语言自带的字符串结构作为实际的…

hvv 云安全专项检测工具

过去的一年里,我们可能已经注意到了一个明显的趋势:安全对抗正逐步迁移至云端。 如:今年hw的要求中增加了云资产相关的得分项计算 如:越来越多的安全工具开始专注于云安全检测方向 如:越来越多的安全峰会加入了云原…

“一种蒸发冷凝水去除氨氮装置”技术专利

蒸发器中随着母盐液的蒸浓,溶液温度升高,由于氨氮易挥发的特性,游离氨挥发于水蒸气中,从而导致冷凝水中氨氮浓度上升,而影响出水水质。 “一种蒸发冷凝水去除氨氮装置”专利(证书号:第19422309号;专利号&am…

【前端】javascript+html+css 家具销售网站(代码+报告)

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

移动端个人中心UI设计

效果图 源码如下 页面设计 <template><div class"container"><!-- 顶部用户信息 start--><div class"header"><div class"user-info"><van-image class"user-img" round width"70" :sr…

【打造超酷的GitHub主页】

文章目录 Github状态信息-api账户信息统计最常用语言Repo卡片 社交统计统计访问次数徽标 首先上地址&#xff1a;https://gitee.com/java_wxid/giteeprofile/blob/master/README.md 为了照顾一部分网络较差的的朋友们&#xff0c;这里使用国内的gitee仓库将主页代码提供给大家&…

C语言 位运算符 “|“ 的5种高级用法

前言 在上一篇文章中&#xff0c;我们介绍了&运算符的高级用法&#xff0c;本篇文章&#xff0c;我们将介绍| 运算符的一些高级用法。 一、人物简介 第一位闪亮登场&#xff0c;有请今后会一直教我们C语言的老师 —— 自在。 第二位上场的是和我们一起学习的小白程序猿 —…

16、博客列表加载效果 - 博客界面改造文章(202307)

最近闲来无事&#xff0c;就想着把博客界面弄得再有点动画效果&#xff0c;于是就找了延迟函数&#xff0c;把博客的内容列表加载的动画写出来了。 该动画效果还是挺炫的&#xff0c;但是因为刷新页面&#xff0c;下面列表的显示需要拉动到底下才看到&#xff0c;所以这里只能记…

微信小程序监测版本更新

在index.js里面 不放到app.js里面是因为有登录页面&#xff0c;在登录页面显示更新不太友好 onShow() {const updateManager wx.getUpdateManager()// 请求完新版本信息的回调updateManager.onCheckForUpdate(res > {if (res.hasUpdate) {// 新版本下载成功updateManage…

【腾讯云 Cloud Studio 实战训练营】体验搭建软件系统,无经验也能做开发

文章目录 前言IDE 解放开发者的生产力功能强大的 IDE快速搭建 Vue 开发环境注册 Cloud Studio进入Vue预置开发环境安装相关依赖包主文件 main.js 引入相关库和包首页增加移动端默认样式增加主要代码 IDE 的适用场景总结 前言 云计算技术的不断发展为代码开发带来了全新的体验&…

【Uniapp】支付链转二维码

前言 提示&#xff1a;这个是一个很小的项目&#xff0c;大概30分钟就能搞定 实现方式&#xff1a;输入支付代码&#xff0c;存储到对应的数据库表中&#xff0c;二维码访问一个PHP文件通过id来进行重定向&#xff0c;这样就可以使每张二维码都是固定的&#xff0c;替换二维码…

CS5213 国产HDMI转VGA带音频方案芯片|CS5213规格书|CS5213原理图

集睿致远/ASL推出的CS5213芯片是一个国产HDMI&#xff08;高清多媒体接口&#xff09;到VGA桥接芯片。它将HDMI信号转换为标准VGA信号它可以在适配器、智能电缆等设备中设计 CS5213特征 将HDMI信号转换为VGA输出 支持数字信号到模似信号的转换 支持 HDCP 1.0/1.1/1.2 操作简…

OpenAI API访问速度不佳?试试用Vercel来加速!

前言 众所周知&#xff0c;使用openAI API在国内访问体验并不佳&#xff0c;经常遇到访问较慢或者访问失败的问题。本文着重讲讲怎么解决这个问题&#xff0c;让我们日常开发和使用能够更方便的体验到AI带来的便利 为了帮大家省钱&#xff0c;也为了方便操作&#xff0c;实现…

论文解读|进一步融合:体积融合中6D姿态估计的多对象推理

原创 | 文 BFT机器人 01 背景 机器人等智能设备需要从它们的车载视觉系统中获得高效的基于物体的场景表示&#xff0c;以解释接触、物理和遮挡。已识别的精确对象模型将与未识别结构的非参数重建一起发挥重要作用。 本文提出了一个系统用于估计实时的接触和遮挡的精确姿态。从…

手写openFeign

目录 背景步骤应用级别&#xff1a;1、建立被调用方2、建立调用方引入依赖 3、实现效果 原理级别&#xff1a;调动方代码&#xff08;注意impl在启动的时候里边是空的&#xff09;引入jar包的代码&#xff08;写好以后推到nexus上&#xff0c;再拉到上述调用方服务中&#xff0…

收集用户隐私行为规范与修改指引

为更好地保护用户隐私信息&#xff0c;优化用户体验&#xff0c;平台对小程序内的收集用户隐私行为进行规范&#xff0c;开发者可自查所涉及的违规内容&#xff0c;并参照修改指引进行相应整改。 常见违规内容 一、隐私政策协议默示同意 小程序在收集用户数据前&#xff0c;…

【高级程序设计语言C++】二叉搜索树

1. 二叉搜索树的概念2. 二叉搜索树的功能2.1. 二叉搜索树的简单模型2.2. 二叉搜索树的查找2.3. 二叉搜索树的插入2.4. 二叉搜索树的删除 3. 二叉搜索树的性能分析 1. 二叉搜索树的概念 二叉搜索树&#xff08;Binary Search Tree&#xff0c;简称BST&#xff09;是一种常见的二…