实战案例:使用 Python 机器学习预测外卖送餐时间

news2024/9/22 7:37:52

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

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

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

图片

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

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

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

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

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

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

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

技术交流

技术要学会分享、交流,不建议闭门造车。一个人可以走的很快、一堆人可以走的更远。

相关文件及代码都已上传,均可加交流群获取,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。

方式①、添加微信号:dkl88194,备注:来自CSDN + 加群
方式②、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

数据处理

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

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

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

数据集情况如下。

图片

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

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())

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

图片

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

data.isnull().sum()

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

图片

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

可以使用半正矢公式(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())

结果如下。

图片

关系分析

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

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

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()

结果如下。

图片

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

这说明大多数外卖员能够在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()

结果如下。

图片

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

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

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

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()

结果如下。

图片

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

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

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

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

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

结果如下。

图片

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

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

1. 外卖员的年龄

2. 外卖员的评分

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

模型预测

本次使用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()

结果如下。

图片

进行训练模型工作。

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

结果如下。

图片

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

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))

测验一下,结果如下。

图片

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

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

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

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

相关文章

MapReduce原理剖析

一、基本介绍 MapReduce是Hadoop的核心,是Google提出的一个软件架构,用于大规模数据集(大于1TB)的并行运算。概念“Map(映射)”和“Reduce(化简)”,及他们的主要思想&am…

AWS 推出开源 AutoML 工具包“AutoGluon”

亚马逊网络服务最近推出了一个开源库,使开发人员只需几行代码即可在图像、文本或表格数据上实现深度学习模型。 AutoGluon 旨在成为一个易于使用且易于扩展的 AutoML 工具包,适合机器学习初学者和专家。它只需几行即可对深度学习模型进行原型设计;自动超…

stm8_独立看门狗配置顺序错误导致不断复位

1、问题 在配置stm8独立看门狗的时候,先设置分频、重载寄存器,然后启动看门狗,发现不断复位。 按照手册中的表格,看门狗的超时时间应该是1s,但是在这1s中多次喂狗也不断复位,然后排查到是配置顺序的问题&…

重新审视MHA与Transformer

本文将基于PyTorch源码重新审视MultiheadAttention与Transformer。事实上,早在一年前博主就已经分别介绍了两者:各种注意力机制的PyTorch实现、从零开始手写一个Transformer,但当时的实现大部分是基于d2l教程的,这次将基于PyTorch…

【实践篇】最全的【DDD领域建模】小白学习手册(文末附资料) | 京东云技术团队

导读 DDD领域建模被各个大小厂商提起并应用,而每个人都有自己的理解,本文就是针对小白,系统地讲解DDD到底是什么,解决了什么问题,及一些建议和实践。本文主要是思想的一种碰撞和分享,希望能对朋友们有所启…

第四章 No.2单点线段树的介绍与使用

文章目录 基本操作练习题1275. 最大数245. 你能回答这些问题吗246. 区间最大公约数 基本操作 单点线段树一共4个常用操作,pushup, build, modify, query 相比区间线段树少了pushdown,懒标记,由于pushdown的实现极容易SF,所以能用…

Python GUI应用程序开发之wxPython库详解

概要 wxPython是一个强大的跨平台GUI工具包,它使用Python编程语言开发,提供了丰富的控件功能。如果你是一名Python开发者,而且希望创建一个功能齐全的桌面应用程序,那么wxPython是一个值得考虑的选择。wxPython是wxWidgets C库的P…

算法——十大排序 (部分未完结)

总结 为什么需要稳定排序? ▪ 让第⼀个关键字的排序结果服务于第⼆个关键字排序中数值相同的那些数 ▪ 主要是为了第⼀次考试分数相同时候,可以按照第⼆次分数的⾼低进行排序 一、冒泡排序 从最简单的冒泡排序开始 思想:交换相邻的元素&am…

电子文件管理系统的最佳实践指南分享

电子文件管理系统是一种专门用于管理电子文件的软件工具,可以帮助组织更有效地管理、存储、检索和共享文件。 首先,在选择适合自己组织的电子文件管理系统时,需要考虑以下几个关键因素。首先,系统的易用性和用户界面是否友好&…

Qt应用开发(基础篇)——布局管理Layout Management

目录 一、前言 二:相关类 三、水平、垂直、网格和表单布局 四、尺寸策略 一、前言 在实际项目开发中,经常需要使用到布局,让控件自动排列,不仅节省控件还易于管控。Qt布局系统提供了一种简单而强大的方式来自动布局小部件中的…

前段时间面试了一些人,有这些槽点跟大家说说

大家好,我是拭心。 前段时间组里有岗位招人,花了些时间面试,趁着周末把过程中的感悟和槽点总结成文和大家讲讲。 简历书写和自我介绍 今年的竞争很激烈:找工作的人数量比去年多、平均质量比去年高。裸辞的慎重,要做好…

Android 第三方库CalendarView

Android 第三方库CalendarView 根据需求和库的使用方式,自己弄了一个合适自己的日历,仅记录下,方便下次弄其他样式的日历。地址 需求: 只显示当月的数据 默认的月视图有矩形的线 选中的天数也要有选中的矩形框 今天的item需要…

强推!大语言模型『百宝书』,一文缕清所有大模型!

夕小瑶科技说 原创 作者 | 王思若 最近,大型语言模型无疑是AI社区关注的焦点,各大科技公司和研究机构发布的大模型如同过江之鲫,层出不穷又眼花缭乱。 让笔者恍惚间似乎又回到了2020年国内大模型“军备竞赛”的元年,不过那时候…

package-lock.json 作用

参照: https://www.cnblogs.com/honkerzh/p/16767566.html

【雕爷学编程】MicroPython动手做(25)——语音合成与语音识别

知识点:什么是掌控板? 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。同时掌控板上集成了OLED…

山西电力市场日前价格预测【2023-08-01】

日前价格预测 预测明日(2023-08-01)山西电力市场全天平均日前电价为310.15元/MWh。其中,最高日前电价为335.18元/MWh,预计出现在19: 45。最低日前电价为288.85元/MWh,预计出现在14: 00。 价差方向预测 1:实…

无涯教程-jQuery - css( properties )方法函数

css(properties)方法将键/值对象设置为所有匹配元素的样式属性。 css( properties ) - 语法 selector.css( properties ) 上面的语法可以写成如下- selector.css( {key1:val1, key2:val2....keyN:valN}) 这是此方法使用的所有参数的描述- key:value - 设置为样式属…

郑州https数字证书

很多注重隐私的网站都注重网站信息的安全,比如购物网站就需要对客户的账户信息以及支付信息进行安全保护,否则信息泄露,客户与网站都有损失,网站也会因此流失大量客户。而网站使用https证书为客户端与服务器之间传输的信息加了一个…

<Git>版本控制工具Git常见的开发操作

下载安装,环境变量配置直接百度; 1.代码拉取: 操作步骤:在正确配置完git的条件下:在本地文件夹下:右键–Git Bash -Here: 出现如下弹窗: 在黑窗口输入代码拉取路径(一般都是把命令和路径直接在外面写好,直接粘贴(在窗口右键,Paste)) 代码拉去…

JavaScript学习 -- 对称加密算法3DES

在现代的互联网时代,数据安全性备受关注。为了保护敏感数据的机密性,对称加密算法是一种常用的方法。在JavaScript中,3DES(Triple Data Encryption Standard)是一种常用的对称加密算法。本篇博客将为您展示如何在JavaS…