前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Python机器学习预测外卖送餐时间!

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

作者头像
小F
发布2023-08-21 17:03:15
2910
发布2023-08-21 17:03:15
举报

大家好,我是小F~

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

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

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

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

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

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

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

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

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

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

/ 01 /

数据处理

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

代码语言:javascript
复制
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): 外卖员配送花费时间

再看一下每列的信息。

代码语言:javascript
复制
print(data.info())

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

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

代码语言:javascript
复制
data.isnull().sum()

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

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

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

代码语言:javascript
复制
# 设置地球的半径(千米)
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。

可以再次查看下数据集。

代码语言:javascript
复制
print(data.head())

结果如下。

/ 02 /

关系分析

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

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

代码语言:javascript
复制
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分钟内送出食物,无论距离远近。

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

代码语言:javascript
复制
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()

结果如下。

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

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

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

代码语言:javascript
复制
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()

结果如下。

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

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

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

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

代码语言:javascript
复制
fig = px.box(data,
             x="Type_of_vehicle",
             y="Time_taken(min)",
             color="Type_of_order")
fig.show()

结果如下。

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

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

1. 外卖员的年龄

2. 外卖员的评分

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

/ 03 /

模型预测

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

代码语言:javascript
复制
# 分类数据集
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()

结果如下。

进行训练模型工作。

代码语言:javascript
复制
# 训练模型
model.compile(optimizer='adam', loss='mean_squared_error')
model.fit(xtrain, ytrain, batch_size=1, epochs=9)

结果如下。

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

代码语言:javascript
复制
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分钟

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-07-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 法纳斯特 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档