目录
- 前言
- 总体设计
- 系统整体结构图
- 系统流程图
- 运行环境
- Python环境
- Pycharm 环境
- Scikit-learnt
- 模块实现
- 1. 数据预处理
- 2. 客流预测
- 1)创建并保存模型
- 2)损失函数
- 3)测试集测试
- 4)自定义特征并预测
- 3. 百度地图API调用
- 1)申请密钥
- 2)地址编码服务
- 3)轻量级路线规划服务
- 相关其它博客
- 工程源代码下载
- 其它资料下载
前言
本项目的核心是利用百度地图API获取步行时间和借助GBDT(梯度提升决策树)模型进行排队时间的预测。它旨在为用户提供一种自主选择多个目的地的功能,然后系统会输出最佳路线规划的结果,并根据用户的选择提供智能化的建议。
首先,项目利用百度地图API,能够获取到步行时间信息。这些信息包括从一个地点到另一个地点所需的预计步行时间。这个步骤确保了系统具有地理位置感知能力,可以理解用户的出行需求。
接下来,项目使用GBDT模型,这是一种强大的机器学习模型,用于预测排队时间。GBDT模型会考虑多个因素,如交通状况、目的地之间的距离、历史排队数据等,来预测用户在不同地点排队的时间。
一旦获取了这些信息,系统可以让用户自主选择多个目的地。用户可以输入他们的出发点和多个目标地点,然后系统会根据百度地图API的步行时间和GBDT模型的排队时间预测,计算出最佳路线规划。这个规划考虑了用户的时间限制、排队时间、步行时间等因素,以确保用户能够在最短的时间内到达所有目的地。
最后,系统还可以根据用户的选择,提供智能化的建议。例如,如果用户希望优先选择最短排队时间的目的地,系统可以相应地调整路线规划。
总的来说,这个项目结合了地图数据和机器学习技术,为用户提供了一个方便的自主选择多个目的地并获取最佳路线规划的工具。这对于城市出行和旅游规划非常有用,可以帮助用户更高效地安排行程。
总体设计
本部分包括系统整体结构图和系统流程图。
系统整体结构图
系统整体结构如图所示。
系统流程图
系统流程如图所示。
路径规划流程如图所示。
计算路径耗时流程,如图所示。
运行环境
本部分包括 Python 环境、Pycharm 环境和Scikit-learn环境。
Python环境
需要Python 3.6及以上配置,在Windows环境下推荐下载Anaconda完成Python所需环境的配置,下载地址为https://www.anaconda.com/,也可下载虚拟机在Linux环境下运行代码。
Pycharm 环境
PyCharm下载地址为http://www.jetbrains.com/pycharm/download/#section=windows,进入网站后单击Comminity版本下的DOWNLOAD下载安装包,下载完成后安装。单击Create New Project创建新的项目文件,Location为存放工程的路径,单击project附近的三角符号,可以看到PyCharm已经自动获取Python 3.6,单击create完成。
Scikit-learnt
安装CPU版本的Scikit-learn
: pip install -U --ignore-installed scikit-learn
, 或者从Anaconda环境中直接搜索 scikit-learn包进行下载、安装。
模块实现
本项目包括6个模块:数据预处理、客流预测、百度地图API调用、GUI界面设计、路径规划和智能推荐,下面分别给出各模块的功能介绍及相关代码。
1. 数据预处理
详见博客:https://blog.csdn.net/qq_31136513/article/details/133011765
2. 客流预测
选用GBDT建立模型。GBDT通过多轮迭代,每轮迭代产生一个弱分类器,每个分类器在上一轮的残差基础上进行训练。
用数据处理阶段准备好的特征和标签来训练模型,保存以便后续使用。同时,自定义损失函数,为预测数据可靠性后续调参提供保障。
采用GBDT模型进行预测,输入当前天气、温度、风力风向、日期(是否是节假日、星期几)和时间即可得出当前客流量。当前客流量在后续预测排队时做一系列操作即可转换为排队时间。
1)创建并保存模型
使用程序gbdtmodel.py
建立GBDT模型。
#建立GBDT模型
gbdt=ensemble.GradientBoostingRegressor(learning_rate=0.5, n_estimators=80, max_depth=3) #用GridSearchCV进行调参后确定的参数
#print(cross_val_score(gbdt, features, lables, scoring=score, cv=cv))
gbdt.fit(features, lables)
gbdt_model_path = "D:/~STUDY~/Grade3/信息系统设计/final_files/data/模型/gbdt_6.model"
joblib.dump(gbdt, gbdt_model_path)
2)损失函数
使用程序error.py
自定义损失函数。
#损失函数:偏差=|真实值-预测值|/真实值
def error(true_labels, predict_labels):
deviation = abs(true_labels - predict_labels) / true_labels
return deviation.mean()
3)测试集测试
使用程序predict.py
测试并得出损失函数。
#将12.25~12.31的数据当作测试集测试
line6_passenger_hour_test_path = "D:/~STUDY~/Grade3/信息系统设计/final_files/data/过程数据/line6_passenger_hour_test.csv"
line_passenger_hour_test = pd.read_csv(line6_passenger_hour_test_path)
test_labels = line_passenger_hour_test['card_id'] #得到测试集标签
gbdt_6_model_path = "D:/~STUDY~/Grade3/信息系统设计/final_files/data/模型/gbdt_6.model"
gbdt_model = joblib.load(gbdt_6_model_path) #载入模型
test_data_path = "D:/~STUDY~/Grade3/信息系统设计/final_files/data/过程数据/test_line6_weather_date_final.csv"
test_data = pd.read_csv(test_data_path)
features =test_data #得到测试集特征
gbdt_predict_labels = gbdt_model.predict(features) #预测
plt.plot(gbdt_predict_labels,label=u'predict_value')
plt.plot(test_labels,label=u'test_value')
plt.xlabel("No.") #xlabel、ylabel:分别设置X、Y轴的标题文字
plt.ylabel("passenger crowding")
plt.legend(loc=0,ncol=2)
plt.show()
err = error(gbdt_predict_labels, test_labels) #得出损失函数
print('错误率为:'+str(err*100)+'%')
模型错误率如图所示。
4)自定义特征并预测
使用程序singlepredict.py
自定义一个特征并预测。
#输入特征
test_data1=pd.DataFrame({'temperature_average':[20],
'wind_average':[0],
'weather_average':[6],
'time':[12],
'isholiday':[0],
'dayofweek':[1]})
features =test_data1
gbdt_predict_labels = gbdt_model.predict(features) #预测
print(gbdt_predict_labels)
自定义特征测试输出结果如图所示。
3. 百度地图API调用
一是申请密钥(AK) ;二是调用地址编码服务,获取每个地点的经纬度;三是调用轻量级路线规划服务,获取任意两点之间的步行时间,最后获取输出。
1)申请密钥
申请密钥网址为http://lbsyun.baidu.com,登录百度账号注册成为开发者(首次认证,需要使用人脸识别通过认证),找到控制台→应用管理→我的应用,单击“创建应用”
,如下3图所示。
依次输入应用名称、应用类型和启用服务,设置请求校验方式为IP白名单校验,设置IP白名单为0.0.0.0/0。
申请应用AK的详细信息如图所示。
2)地址编码服务
相关操作如下:
(1)地址编码服务是将结构化数据(如:北京市海淀区西土城路10号)转换为对应坐标点(经纬度)的功能。
接口为http://api.map.baidu.com/geocoding/v3/?address=北京市海淀区西土城路10号&output=json&ak=您的ak&callback=showLocation
,GET请求。
(2)用熟知的场所确保精度满足需求,明确各参数含义。
(3)获取所需经纬度,将每点的坐标写入文档。
#调用地址编码服务获取经纬度 getjingwei.py
import requests
import json
url = 'http://api.map.baidu.com/geocoding/v3/'
params = { 'address' : '北京欢乐谷-极速飞车', #输入地点
'ak' : 'YdBcaxxxxxxxxxxxxxxxxxxxxxG', #百度密钥
'output': 'json' #输出结果设置为json格式
}
res = requests.get(url,params)
jd = json.loads(res.text) #将json格式转化为Python字典
print(jd)
coords = jd['result']['location']
print(coords)
运行结果如图所示。
得到起点、终点坐标.xlsx文件,如图所示。
3)轻量级路线规划服务
相关操作如下:
(1)支持驾车、骑行、步行、公交路线规划。根据起点、终点坐标(经纬度)可规划步行路线的耗时。接口地址为http://api.map.baidu.com/routematrix/v2/walking?origin=40.01116,116.339303&destination=39.936404,116.452562&ak=您的AK
,GET请求。
(2)获取任意两点之间的步行时间,写入文档。
#调用轻量级路线规划服务获取步行时间getdistance.py
import pandas
import csv
import json
from urllib.request import urlopen
#原数据文件格式:序号+起点纬度+起点经度+终点纬度+终点经度
origin_path = 'D:/~STUDY~/Grade3/信息系统设计/final_files/data/过程数据/起点终点坐标.xlsx' #原始坐标文件路径
result_path = r'D:/~STUDY~/Grade3/信息系统设计/final_files/data/过程数据/walk_result_raw.csv' #爬取数据文件保存路径
#声明坐标格式,bd09ll(百度经纬度坐标);bd09mc(百度摩卡托坐标);gcj02(国测局加密坐标),wgs84(gps设备获取的坐标)
cod = r"&coord_type=bd09ll"
#AK为从百度地图网站申请的秘钥
AK = ['YdBcxxxxxxxxxxxxxxxxxxxG',]
dfBase = pandas.read_excel(origin_path, names=['序号','起点纬度','起点经度','终点纬度','终点经度'])
dfBase.head()
dataList = [] #储存获取的路线数据
akn = 0 #使用第几个ak
for i in range(len(dfBase)):
print(i)
ak = AK[akn]
out_lat = dfBase.at[i,'起点纬度']
out_lng = dfBase.at[i,'起点经度']
des_lat = dfBase.at[i,'终点纬度']
des_lng = dfBase.at[i,'终点经度']
#获取步行路径url_walk=r"http://api.map.baidu.com/routematrix/v2/walking?output=json&origins={0},{1}&destinations={2},{3}&{4}&tactics=11&ak={4}".format(out_lat,out_lng,des_lat,des_lng,ak)
result_walk = json.loads(urlopen(url_walk).read()) #json转dict
status_walk = result_walk['status']
print('ak秘钥:{0} 获取步行路线状态码status:{1}'.format(ak, status_walk))
if status_walk == 0: #状态码为0:无异常
timesec_walk = result_walk['result'][0]['duration']['value']#耗时(秒)
elif status_walk == 302 or status_walk == 210 or status_walk == 201:
#302:额度不足;210:IP验证未通过
timesec_walk = 'AK错误'
akn += 1
ak = AK[akn]
else:
timesec_walk = '请求错误'
dataList.append([ak,status_walk,timesec_walk])
dfAll = pandas.DataFrame(dataList, columns=['ak','status_walk','timesec_walk'])
dfAll.to_csv(result_path) #将生成的cvs保存到路径
walk_time_result.csv
文件结果,如图所示。
相关其它博客
基于GBDT+Tkinter+穷举法按排队时间预测最优路径的智能导航推荐系统——机器学习算法应用(含Python工程源码)+数据集(一)
基于GBDT+Tkinter+穷举法按排队时间预测最优路径的智能导航推荐系统——机器学习算法应用(含Python工程源码)+数据集(三)
基于GBDT+Tkinter+穷举法按排队时间预测最优路径的智能导航推荐系统——机器学习算法应用(含Python工程源码)+数据集(四)
工程源代码下载
详见本人博客资源下载页
其它资料下载
如果大家想继续了解人工智能相关学习路线和知识体系,欢迎大家翻阅我的另外一篇博客《重磅 | 完备的人工智能AI 学习——基础知识学习路线,所有资料免关注免套路直接网盘下载》
这篇博客参考了Github知名开源平台,AI技术平台以及相关领域专家:Datawhale,ApacheCN,AI有道和黄海广博士等约有近100G相关资料,希望能帮助到所有小伙伴们。