热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python基于XGBoost开发构建海上船舶航行轨迹多变量序列预测分析模型

船舶航行状态评估、船舶碰撞概率检测等场景种有着对海面船舶航行轨迹较高的预测需求,准确实时地对航行轨迹进行预测分析有助于评估船舶航行的状态,及时对可能存在的潜在威胁进行发现预警处理,航行轨迹预测本质上来讲就是时间序列建模,在我之前的博文中已经有大量的博文和对应的教程,对于时间序列预测建模有比较详细的介绍。

很多场景下多变量序列预测建模大都是基于深度学习完成的,这个也是因为深度学习模型天然的优势,能够处理高维度的数据,基于机器学习模型本质上来讲也是可以完成这项工作的,只不过会比深度学习更加麻烦,这里主要的目的就是以船舶航行轨迹数据集为基准来开发XGBoost时间序列预测模型。

首先看下数据集:

mmsi,lat,lon,Sog,Cog,timestamp
33,30.430935,121.840168,13.3,218,1530665006
33,30.431335,121.840587,13.2,33,1530665016
33,30.432252,121.84158,13.2,145,1530665036
33,30.432675,121.841973,13.2,30,1530665046
33,30.433992,121.84337,13.2,20,1530665076
33,30.434867,121.844305,13.1,39,1530665096
33,30.435257,121.844728,13.1,43,1530665106
33,30.434867,121.844305,13.1,23,1530665119
33,30.43619,121.845688,13.1,50,1530665126
33,30.437892,121.847477,13.1,53,1530665166
33,30.43838,121.84798,13.1,50,1530665176
33,30.43887,121.848482,13.2,28,1530665187
33,30.44061,121.850253,13.1,50,1530665226
33,30.441017,121.850657,13.1,42,1530665236
33,30.43749,121.84707,13.012,54,1530665238
33,30.44155,121.85121,13.1,117,1530665247
33,30.442865,121.852583,13.1,182,1530665276
33,30.443728,121.853523,13.2,0,1530665296
33,30.44415,121.854003,13.2,200,1530665307
33,30.444593,121.854473,13.2,140,1530665317
33,30.445012,121.854958,13.2,107,1530665327
33,30.44195,121.85162,13.212,275,1530665339
33,30.447153,121.857333,13.2,277,1530665377
33,30.447575,121.857832,13.2,267,1530665387
33,30.447575,121.857832,13.2,276,1530665410
33,30.448822,121.859192,13.2,272,1530665416
33,30.45052,121.861037,13.2,260,1530665456
33,30.451377,121.861993,13.2,274,1530665476
33,30.4519,121.86256,13.2,265,1530665486
33,30.452343,121.863042,13.2,250,1530665497
33,30.452773,121.863522,13.2,291,1530665507
33,30.454465,121.86536,13.1,104,1530665547
33,30.455717,121.866725,13.1,99,1530665576
33,30.456632,121.867703,13.1,92,1530665596

可以看到:数据集中给出来了航行过程中记录得到的详细数据,包括:经度和维度还有sog与cog。

首先需要对原始数据集进行解析处理,如下:

with open(data) as f:data_list = json.load(f)
data_dict = {}
for one_list in data_list:mmsi, ts, lat, lon, Sog, Cog = one_listif mmsi in data_dict:data_dict[mmsi].append([ts, lat, lon, Sog, Cog])else:data_dict[mmsi]=[[ts, lat, lon, Sog, Cog]]
X, y = [], []
for one_mmsi in data_dict:one_data = data_dict[one_mmsi]one_data = sorted(one_data, key = lambda e:e[0])one_X, one_y = sliceWindow(one_data, step)X += one_Xy += one_y
X_train, X_test, y_train, y_test = splitData(X, y, ratio=ratio)
dataset = {}
dataset["X_train"], dataset["y_train"] = X_train, y_train
dataset["X_test"], dataset["y_test"] = X_test, y_test
with open(save_path, "w") as f:f.write(json.dumps(dataset))

处理完成后 ,就得到了随机划分后形成的训练集和测试集。

得到数据集后就可以搭建模型了,核心实现如下:

if not os.path.exists(saveDir):os.makedirs(saveDir)
X_train,y_train,X_test,y_test = loadDataSet(data=data, label=label)
#模型构建
model = xgb.XGBRegressor(max_depth=5,n_estimators=200,objective="reg:linear",
)
#训练拟合
model.fit(X_train, y_train)
# 预测
res_dict = {}
train_pred = model.predict(X_train)
evs, mae, mse, r2 = calPerformance(y_train, train_pred)
mapev = mape(train_pred, y_train)
rmse = math.sqrt(mse)
train_info = ("训练集评估指标分析\nRMSE: "+ str(round(rmse, 4))+ ", MAPE: "+ str(round(mapev, 4))+ ", R2: "+ str(round(r2, 4))
)
res_dict["train_true"] = y_train
res_dict["train_predict"] = train_pred.tolist()
plt.clf()
plt.figure(figsize=(12,8))
plt.plot(y_train, label="训练集真实值曲线")
plt.plot(train_pred, label="训练集预测值曲线")
plt.legend()
plt.title(train_info)
plt.savefig(saveDir + "train_compare.png")

这里以lat为例看下训练集对比拟合曲线如下所示:

测试集对比拟合曲线如下:

总体对比曲线如下:

可以看到:模型的拟合效果是很好的了,这里绘制了特征重要性图像:

接下来整合多维度的数据集来依次构建模型,核心方法同上,这里就不再重复介绍了,绘图有别于上述实现,这里着重介绍一下,以训练集数据集为例如下:

plt.clf()
plt.figure(figsize=(40,16))
i=1
for one_label in res_dict:y_true=res_dict[one_label]["train_true"]y_pred=res_dict[one_label]["train_predict"]evs, mae, mse, r2 = calPerformance(y_true, y_pred)mapev = mape(y_pred, y_true)rmse = math.sqrt(mse)train_info = one_label+ " 训练集评估指标分析\nRMSE: " + str(round(rmse, 4)) + ", MAPE: " + str(round(mapev, 4)) + ", R2: " + str(round(r2, 4))plt.subplot(2,2,i)plt.plot(y_true, label="训练集真实值曲线")plt.plot(y_pred, label="训练集预测值曲线")plt.legend()plt.title(train_info)i+=1
plt.savefig(saveDir + "train_compare.png")

效果如下:

测试集可视化同上,效果如下:

总体对比可视化如下所示:

同样这里也绘制了特征重要性可视化:

这个跟我们常识还是比较接近的哈。


推荐阅读
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • python3 nmap函数简介及使用方法
    本文介绍了python3 nmap函数的简介及使用方法,python-nmap是一个使用nmap进行端口扫描的python库,它可以生成nmap扫描报告,并帮助系统管理员进行自动化扫描任务和生成报告。同时,它也支持nmap脚本输出。文章详细介绍了python-nmap的几个py文件的功能和用途,包括__init__.py、nmap.py和test.py。__init__.py主要导入基本信息,nmap.py用于调用nmap的功能进行扫描,test.py用于测试是否可以利用nmap的扫描功能。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 本文介绍了在Python张量流中使用make_merged_spec()方法合并设备规格对象的方法和语法,以及参数和返回值的说明,并提供了一个示例代码。 ... [详细]
  • 本文介绍了一个Python函数same_set,用于判断两个相等长度的数组是否包含相同的元素。函数会忽略元素的顺序和重复次数,如果两个数组包含相同的元素,则返回1,否则返回0。文章还提供了函数的具体实现代码和样例输入输出。 ... [详细]
  • Python的参数解析argparse模块的学习
    本文介绍了Python中参数解析的重要模块argparse的学习内容。包括位置参数和可选参数的定义和使用方式,以及add_argument()函数的详细参数关键字解释。同时还介绍了命令行参数的操作和可接受数量的设置,其中包括整数类型的参数。通过学习本文内容,可以更好地理解和使用argparse模块进行参数解析。 ... [详细]
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
  • 玩转直播系列之消息模块演进(3)
    一、背景即时消息(IM)系统是直播系统重要的组成部分,一个稳定的,有容错的,灵活的,支持高并发的消息模块是影响直播系统用户体验的重要因素。IM长连接服务在直播系统有发挥着举足轻重的 ... [详细]
  • 起因由于我录制过一个小程序的课程,里面有消息模板的讲解。最近有几位同学反馈官方要取消消息模板,使用订阅消息。为了方便大家容易学 PythonFlask构建微信小程序订餐系统 课程。 ... [详细]
  • 数学建模入门python绘制频率直方图
    文章目录例题数据处理绘图操作调用演示例题数据处理将以下的数据保存到磁盘上17275169551696417165167471716216867165521696216865 ... [详细]
  • 文章目录前言pandas主要分为如下几个阶段:表格数据操作:增删改查实现多个表格的处理数据清洗操作:缺失值、重复值、异常值、数据标准化、数 ... [详细]
author-avatar
Yang家联1
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有