最近,想尝试一下利用机器学习进行航班的延误预测,一开始的倾向是使用GBDT算法,使用了在scikit-learn上的肿瘤数据作为初步模型测试,使用网格搜索后发现,其预测结果仅仅只有50%不到,还不如KNN——《机器学习之Knn算法》。
后来在网上看到了XGBOOST算法,于是常识了一波,准确率可以达到90%,比knn要强出5%以上,所以在模型的选择上,博主决定使用XGBOOST。
对于GBDT和XGBOOST的原理,以及各超参的控制机理,博主这边还只是初步尝试,后面会较深入的去琢磨一番,然后完善博客,但是工具的使用还是简单的,问题在于数据集。
一、航班数据集
1.1 搜集数据
国内的航班数据几乎没有,也没有免费的公开网站,而公司的数据几乎不可用,因为只有航线、航司、出发、到达、计划时间等,没有博主需要的实际时间、天气状况、航班号等。
为此博主花了一整天时间搜罗各大网站,终于发现了这个国外网站——stat-computing.org,貌似需要翻墙。可以查询到美国的航空公司航班准点率数据,博主选取的是2016年的。
此外,还有这位博主,提供的数据也被博主参考了进来——《通过使用 Python 创建机器学习模型来预测航班晚点情况》。
但是唯一遗憾就是缺少天气数据,经过不断的搜索,博主发现了一个美国气象局,可以查到2016年的历史天气数据——ATL亚特兰大国际机场天气状况
亚特兰大国际机场2016年1月部分数据 |
---|
![]() |
本想通过爬虫进行爬取数据,但实际情况不允许。不过博主也是讲table标签数据copy下来,然后利用python进行数据的整理与合并。
经过分析,博主个人认为风速和降水量,由于变化幅度大,可以作为影响航班的主要因素,隐藏只提取这两个因素作为天气指数。
1.2 天气数据处理和合并
由于是调研,选取的是美国大型航空公司——DL达美,并选取了五个机场:ATL(佐治亚州亚特兰大:哈茨菲尔德-杰克逊亚特兰大国际机场)、DTW(底特律韦恩县国际机场)、JFK(纽约:约翰·F·肯尼迪国际机场)、MSP(明尼苏达州明尼阿波利斯:明尼阿波利斯圣保罗国际机场)、SEA(华盛顿州:西雅图/塔科马国际机场)
由两个文件,一个是USA_fightDataSet.xlsx
,这个Excel文件记录的是起飞时间、机场、计划飞行时间、实际飞行实际、航班号等数据;另一个是由机场和月份组成的60个txt文件,里面是html的table标签数据。
博主要做的就是将table标签里的当天的天气情况,即风速和降水量,插入到表格相应的位置,代码如下:
## 获取天气数据的类方法
import pandas as pd
import numpy as np
np.set_printoptions(threshold=np.inf)
# 获取数据
def getData(url, airport, mon):
# 读取配置文件
table = pd.read_html(url);
# 数据行数
dayOfMonth = np.array(table[1])[1:, 0]
size = dayOfMonth.size
# 选取最后一个元素进行判断,因为爬取的数据有时候最后一个又从1号开始,这里进行判断排除处理
ele = dayOfMonth[size-1]
if ele == '1':
dayOfMonth = np.array(table[1])[1:size, 0]
wsp_data = np.array(table[5])[1:size, 1]
precipitation_data = table[7].values[1:size, 0]
else :
# 读取数据,这里将header删掉,取数据
# 日
dayOfMonth = np.array(table[1])[1:, 0]
# windSpeed的平均值
wsp_data = np.array(table[5])[1:, 1]
# 降水量
precipitation_data = table[7].values[1:, 0]
# 填充月份
size = dayOfMonth.size
month = np.array([mon for i in range(size)])
# 填充机场
airport = np.array([airport for i in range(size)])
# 输出结果
return np.vstack([month, dayOfMonth, airport, wsp_data, precipitation_data]).T
# 迭代合并数组,从2开始
def fibonacci