暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

基于AutoML的航班延迟起飞预测模型搭建

火火日记 2020-06-18
413
随着人工智能的热潮在全球各地不断发展,企业对于机器学习模型准确率、开发效率的要求越来越高。基于这样的背景,AutoML技术正逐步进入人们的视野。谷歌、AWS、Oracle、H2O等多家企业也陆续推出了基于AutoML的数据科学服务。

AutoML是什么?
训练过预测模型的人可能都知道,我们往往需要花费大量的精力来进行算法、模型选择、调参等工作。而像调参这种工作是需要积累一定算法经验后才可以做的,是需要一定的技术门槛的。
那么说起AutoML实际上就是让尽可能多的工作能够被自动化完成,进一步降低机器学习的门槛,让没有该领域专业知识的人也可以使用机器学习来完成相关的工作。同时又大大提高了模型开发效率。

那么今天我就为大家介绍一下如何利用甲骨文数据科学平台的AutoML训练预测模型。
我将分别利用开源的H2O.AI AutoML与甲骨文ADS AutoML预测航班延迟起飞情况,并对两个模型进行对比。

OK那我们开始!
整个过程分为6个部分
  1. 安装
  2. 数据加载
  3. 数据探索(EDA)
  4. 训练预测模型
  5. 模型评价
  6. 模型解释

1. 安装
安装需要使用的包
* ADS(Accelerated Data Science)是由甲骨文开发并提供的Python库。通过 ADS DataseFactory、ADS Evaluator、ADS Explainer等丰富的函数,提供数据探索、数据处理、模型解释及AutoML能力。
import pandas as pd


import warnings
warnings.filterwarnings('ignore')


import logging
logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.ERROR)


from ads.dataset.factory import DatasetFactory
复制


2. 数据加载
我们可以通过ADS DatasetFactory将多种数据源的数据加载到Data Science Notebook中。下面我们就将Block Storage中的样例数据加载进来做预测。该样例数据为2015年航班延迟数据,由30个列100万条数据构成。
flights = DatasetFactory.open("/home/datascience/ads-examples/3P_data/flights.csv")flights.head()
复制


系统会提示我们,设定预测变量(Target)。
*只有在设定好预测变量后,才能使用数据探索和预处理中的自动化函数。
下面我们将DepDelay
设定为预测变量
预测变量: 模型预测的参数也叫做因变量。通常我们表示为“Y”,在这里"Y"为DepDelay
自变量: 除预测变量"DepDelay"
以外的其他变量。通常我们表示为“X”
flights = flights.set_target('DepDelay')
复制

3. 数据探索(EDA)
探索性数据分析(Exploratory Data Analysis,EDA)主要是对数据进行清洗,对数据进行描述(描述统计量,图表),查看数据的分布,比较数据之间的关系,对数据进行总结。
在这一部分通过ADS的show_in_notebook()
函数,可轻松确认数据分布情况,并对缺失数据、不均衡数据等问题进行自动化处理,无需单独写代码。

3.1 数据概览
flights.show_in_notebook()
复制
执行show_in_notebook()函数后如下图,会显示Summary、Feature、Correlations、Warning 4部分信息。

Summary:数据概况

Feature:所有变量的统计信息

Correlations:所有变量间的相关性

Warnings:异常信息内容提示

3.2 数据转换
下面我们将删除与预测变量"DepDelay"不相关的变量。由于我们要预测延迟起飞而非延迟到达,因此实际到达时间,飞行时间等信息对预测结果无影响。
flights_nocheat = flights.drop_columns(["ArrDelay", "ArrTime", "DepTime",
"AirTime", "ActualElapsedTime"]).sample(frac=0.1)
复制

删除不相关变量后,我们最终确定了训练数据集。接下来我们将确认预测变量"DepDelay"和其他自变量之间的相关性。
删除不相关变量后,我们最终确定了训练数据集。接下来我们将确认预测变量"DepDelay"和其他自变量之间的相关性。
flights_nocheat.target.show_in_notebook(feature_names=["DayOfWeek", "DayofMonth",
"UniqueCarrier"])
复制
由于"DepDelay"是数值型变量,而我们预测的是否延迟起飞而非延迟时长。因此对"DepDelay"进行转换。
我们将"DepDelay"值高于15分钟的转换为“延迟”,"DepDelay"值低于15分钟的转换为“非延迟”
下面可以通过show_in_notebook()函数确认"DepDelay"属性的变化。
转换前由于是数值型变量,故默认显示为Histogram,而转换后由于是类别型变量,故默认显示为Count Plot。
type(flights_nocheat)
# RegressionDataset
复制

# 转换前show_in_notebook() 默认显示为 Histogram Graph
flights_nocheat.target.show_in_notebook()
复制

利用Lamda函数进行转换
flights_binary = flights_nocheat.assign_column("DepDelay", lambda x: x is None or x>15)
type(flights_binary)
# BinaryClassificationDataset
复制

# 数据转换后, show_in_notebook() 默认显示为Count Plot Graph
flights_binary.target.show_in_notebook()
复制
由上图可以发现,延迟和非延迟的数据比例约为2:8。该训练数据集是比较典型的非均衡数据。

3.3 自动数据处理
在训练模型前,我们需要对数据进行处理。我们可以通过get_recommendations() 函数确认系统推荐的数据处理事项。或者可以通过auto_transform()函数,让系统自动帮助我们处理数据。
系统自动处理事项如下:
  • 删除常数和主键字段
  • 缺失值自动填补
  • 删除线性相关的自变量
  • 非均衡数据自动处理
flights_binary.get_recommendations()
复制

由于非均衡处理需要花费一定时间,我们可以对其进行disable处理。fix_imbalance=False
flights_clean = flights_binary.auto_transform(fix_imbalance=False)
复制

确认处理后的训练数据集
flights_clean.show_in_notebook()
复制
[len(flights_binary.columns), len(flights_clean.columns)]
复制
变量由原来的25个减少为14个。

3.4 变量选择
如下可以通过设定K值,选择与预测变量强相关的Top12因变量,进行模型训练。
# 相关性Top12变量选择
modeling_dataset = flights_clean.select_best_features(k=12)
print(modeling_dataset.columns.values)
复制

以上我们完成了训练模型前的所有数据处理工作

4. 训练预测模型
4.1 基于H2O AutoML训练模型
首先我们利用H2O.AI提供的 开源AutoML包训练模型

导入相关包
import h2o
import os
from h2o.automl import H2OAutoML
复制

初始化环境
# H2O Proxy 初始化
http_proxy = os.environ.get("http_proxy", "")
HTTP_PROXY = os.environ.get("HTTP_PROXY", "")
os.environ["HTTP_PROXY"] = ""
os.environ["http_proxy"] = ""
h2o.init()
复制


将数据集转换为H2O DataFrame
h2o_df = modeling_dataset.to_h2o_dataframe()
h2o_df.head(5)
复制

分割Training, Test, Validation Data
train, valid, test = h2o_df.split_frame(ratios=list([.7, .15]), seed = 1)
[train.shape, valid.shape, test.shape]
复制


将输入变量设定为X,预测变量 DepDelay设定为Y
x = train.columns
y = "DepDelay"
x.remove(y)
复制

执行H2OAutoML作业会同时训练多个模型。通过Leader函数选择最佳模型
%%time
h2o_aml = H2OAutoML(max_models=20, seed=1, max_runtime_secs=100)
h2o_aml.train(x=x, y=y, training_frame=train, validation_frame=valid)
h2o_model = h2o_aml.leader
复制

整个模型训练需要21.7秒

通过Predict函数预测"DepDelay",并确认准确率
print("\nH2O Accuracy: ", (h2o_model.predict(test)[0] == test["DepDelay"]).sum() / test.shape[0])
复制

模型准确率为69%

下面重置Proxy后,基于Oracle ADS AutoML训练模型
os.environ["http_proxy"] = http_proxy
os.environ["HTTP_PROXY"] = HTTP_PROXY
复制

4.2 基于Oracle ADS AutoML训练模型
导入相关包
from ads.automl.provider import OracleAutoMLProvider
复制

分割training, test, validation数据
train, valid, test = modeling_dataset.train_validation_test_split(test_size=0.1, validation_size=0.2, random_state=42)
[train.X.shape, valid.X.shape, test.X.shape]
复制


通过OracleAutoMLProvider设定AutoML Type
利用automl.driver 生成Oracle AutoML模型。为了选择最佳模型,系统首先会生成一个基准模型baseline model,预测分类或回归问题的基准模型我们称之为 Zero Rule (ZeroR)模型
  • 回归预测中,ZeroR基准模型会预测训练数据集中的平均值
  • 分类预测中,ZeroR基准模型会预测训练数据集中最频繁出现的值

然后基于算法List中的不同算法训练多个模型,与基准模型做对比,最后选择最佳模型。
通过AutoML Provider选择最佳模型的方式如下:
  • 选择最佳的变量
  • 最少的Sampling
  • 选择最佳的算法
  • 选择最佳的参数
olabs_automl = OracleAutoMLProvider()
复制

下一步我们需要输入raining Data、Validation Data、automl package provider等参数。另外需要在model_list中输入需要执行的算法清单,系统会自动跑出最佳算法的最佳参数。下面我们将Lite GBM输入到model_list中
import lightgbm
复制

%%time
from ads.automl.driver import AutoML
automl = AutoML(train, validation_data=valid,
provider=olabs_automl)
olabs_model, baseline = automl.train(min_features=["CRSDepTime", "TaxiOut"], model_list=["LogisticRegression", "LGBMClassifier", "XGBClassifier", "RandomForestClassifier"], random_state = 42, score_metric = 'roc_auc')
复制


确认模型准确率
print("\nOLabs Score: ", olabs_model.score(test.X, test.y))
复制
准确率为73.4%

确认最佳模型的最终参数
olabs_model.selected_model_params_
复制


确认模型执行次数
olabs_model.num_total_trials_
复制


确认模型概要
olabs_model.summary()
复制


通过可视化的方式确认模型调优过程
automl.visualize_feature_selection_trials()
复制


automl.visualize_tuning_trials()
复制

对数据处理内容进行可视化
olabs_model.visualize_transforms()
复制


5. 模型评价
对各个模型执行ADSEvaluator(test, models=[baseline, olabs_model] ,对比预测模型与基准模型
from ads.evaluations.evaluator import ADSEvaluator
from ads.common.data import MLData


evaluator = ADSEvaluator(test, models=[baseline, olabs_model])
evaluator.show_in_notebook()
复制


6. 模型解释
利用ADS Expalation模块对模型进行解释。首先需要生成ADS explainer objects,然后再分别生成Global explanation和 local explanation
关于模型解释的基本用语:
  • Explainability: 对模型预测的依据的解释和理解
  • Interpretability: 能够理解模型解释结果的人的水准
  • Global Explanations: 对模型本身的理解
  • local Explanations: 对特定数据集预测结果的解释
  • Model-Agnostic Explanations: 对模型训练过程以及变量的选择过程理解为黑盒子,不进行解释
ADS explanation 模块支持 interpretable, model-agnostic, local/global explanations等功能

导入相关包
from ads.explanations.explainer import ADSExplainer
from ads.explanations.mlx_global_explainer import MLXGlobalExplainer
复制

通过MLXGlobalExplainer provider创建Explainer Object和 Global Explainer Object
olabs_explainer = ADSExplainer(test, olabs_model)
global_explainer = olabs_explainer.global_explanation(provider=MLXGlobalExplainer())
复制

确认变量重要度
global_explainer.feature_importance_summary()
复制

运行结果如下

计算变量重要度
feature_importance = global_explainer.compute_feature_importance()
复制

确认变量重要度结果
feature_importance.get_global_explanation()
复制

到这里基于AutoML的航班延迟起飞预测就做完了。通过甲骨文数据科学平台的ADS AutoML功能可以对数据处理、特征工程、算法选择、调参等部分进行自动化处理!

OK,今天的内容就到这里,谢谢大家~





文章转载自火火日记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论