XGBOOST_航班延误预测

最近,公司想尝试一下利用机器学习进行航班的延误预测,于是将调研任务交给了博主。一开始的倾向是使用GBDT算法,使用了在scikit-learn上的肿瘤数据作为初步模型测试,使用网格搜索后发现,其预测结果仅仅只有50%不到,还不如KNN——《机器学习之Knn算法》

后来在网上看到了XGBOOST算法,于是常识了一波,准确率可以达到90%,比knn要强出5%以上,所以在模型的选择上,博主决定使用XGBOOST。

对于GBDT和XGBOOST的原理,以及各超参的控制机理,博主这边还只是初步尝试,后面会较深入的去琢磨一番,然后完善博客,但是工具的使用还是简单的,问题在于数据集。

一、航班数据集

1.1 搜集数据

国内的航班数据几乎没有,也没有免费的公开网站,而公司的数据几乎不可用,因为只有航线、航司、出发、到达、计划时间等,没有博主需要的实际时间、天气状况、航班号等。

为此博主花了一整天时间搜罗各大网站,终于发现了这个国外网站——stat-computing.org,貌似需要翻墙。可以查询到美国的航空公司航班准点率数据,博主选取的是2016年的。

此外,还有这位博主,提供的数据也被博主参考了进来——找不到链接,后期补上

但是唯一遗憾就是缺少天气数据,经过不断的搜索,博主发现了一个美国气象局,可以查到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(n, airport):
    if n==2 :
        url1 = "D:\\File\\航班预测\\天气数据\\"+airport+"\\table" + str(1) + ".txt"
        url2 = "D:\\File\\航班预测\\天气数据\\"+airport+"\\table" + str(2) + ".txt"
        return np.concatenate([getData(url1, airport, 1), getData(url2, airport, 2)])
    else :
        url = "D:\\File\\航班预测\\天气数据\\"+airport+"\\table" + str(n) + ".txt"
        return np.concatenate([fibonacci(n-1, airport), getData(url, airport, n)])

# 将各机场数据拼接
def getWeatherData():
    result1 = fibonacci(12, 'ATL')
    result2 = fibonacci(12, 'DTW')
    result3 = fibonacci(12, 'JFK')
    result4 = fibonacci(12, 'MSP')
    result5 = fibonacci(12, 'SEA')
    return np.concatenate([result1, result2, result3, result4, result5])

##
## 调用上面的天气数据包,然后与USA_fightDataSet.xlsx表格数据进行合并
import weatherData.getWeatherData as gd
import numpy as np
import openpyxl
np.set_printoptions(threshold=np.inf)

# 获取天气数据结果
result = gd.getWeatherData()

# 获取FlightData表格数据
wb = openpyxl.load_workbook('D:\\File\\航班预测\\天气数据\\USA_fightDataSet.xlsx')
sheet = wb['FlightData_DL']

# 获取fightData的行数,必须+1,因为后面的for循环判断是<判断
rows = sheet.max_row+1

# 获取天气数据的行数
rows_weather = result.shape[0]

# 外层fightData数据
for i in range(3, rows):

    # 获取月份/日期/出发和到达机场名字
    # 注意,openpyxl读取的数据是从1开始计数的
    month = sheet.cell(row=i, column=3).value

    # 表格读取的数据莫名其妙不是字符串,导致后面判断总是false,需要转一下
    dayOfMonth = str(sheet.cell(row=i, column=4).value)
    ori_airport = sheet.cell(row=i, column=9).value  # 出发机场
    dest_airport = sheet.cell(row=i, column=13).value  # 到达机场

    # 内层循环天气数据
    for j in range(0, rows_weather):

        # 获取天气行数据
        weather_row = result[j]

        # 获取天气的各数据
        w_month = weather_row[0]
        w_dayOfMonth = weather_row[1]
        w_airport = weather_row[2]
        w_wsp = weather_row[3] # 风速
        w_precipitation = weather_row[4] # 降水量

        # 循环对比,如果月份/日期/机场名字都对应,则将风速和降水量插入表格
        if month == w_month and dayOfMonth == w_dayOfMonth and ori_airport == w_airport:
            sheet.cell(row=i, column=10).value = w_wsp
            sheet.cell(row=i, column=11).value = w_precipitation
        if month == w_month and dayOfMonth == w_dayOfMonth and dest_airport == w_airport:
            sheet.cell(row=i, column=14).value = w_wsp
            sheet.cell(row=i, column=15).value = w_precipitation

# 保存操作
wb.save('D:\\jdFile\\航班预测\\天气数据\\USA_fightDataSet.xlsx')
最终的表格部分数据
在这里插入图片描述

1.3 数据集处理

To Be Continued……

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章