张燕红 王凤芹 王丽娜 杜 晶
(海军航空大学 烟台 264001)
飞参数据是借助飞机上的参数记录系统记录并保存的飞机飞行过程中的状态、性能信息和关键技术参数的一系列数据,在飞机研制、飞行状态监控、飞行质量分析评估、视情维修、事故调查等应用方面有着非常重要的参考价值。飞参数据通常由飞机的飞行记录系统自动记录,并以文件形式存储在SD卡中,其往往涵盖整个完整的飞行过程,未明确划分飞行阶段。然而飞机飞行状态和性能在起飞、巡航、下降等不同飞行阶段存在很大差异,飞机性能监控、飞行质量分析评估、飞行安全预测等诸多研究均建立在飞行阶段划分的思想上[1~2]。因此,利用飞参数据划分飞行阶段对在飞行领域开展深层次研究具有重要的指导意义[3]。
根据飞行技术手册和飞行特点,飞机的整个飞行过程通常可简单分为以下五个通用阶段:起飞、爬升、巡航、下降、着陆[4],如图1所示。目前,飞行阶段的划分一般有两种方式:一是靠人工经验判断;二是利用飞参数据采用算法分类模型实现。显然,人工经验判断主观性强、效率低,不能满足信息系统自动化的要求。在利用飞参数据划分飞行阶段方面,有的采用主成分分析和支持向量机的方法,建立飞行阶段划分模型[5]。还有的采用贝叶斯、神经网络和决策树等方法[6]。不同的方法有不同的优缺点。
图1 飞行阶段划分
决策树算法是一种典型的分类方法。基于训练样本数据集、所有特征和切分点,依据基尼指数生成决策树,即分类规则,然后通过决策树对测试样本数据进行分类。而随机森林是利用多个决策树对样本进行训练并预测的一种分类器,它兼顾了解决分类和回归问题的能力。对于分类问题,随机森林算法输出的类别是由个别决策树输出类别的众数决定的。对于回归问题,随机森林把每一个决策树的输出进行平均得到最终的回归结果。因此,相比于单一的决策树算法,随机森林的表现一般要更优。本文对某型飞机实际飞行过程中产生的飞行数据,采用随机森林算法划分飞行阶段,同时将基于CART决策树的随机森林算法与单一CART决策树算法进行对比仿真,取得了较好的实验效果,解决了每次依靠人工划分飞行阶段,主观性强、效率低的问题。
飞机记录的飞参数据通常有几十种,经过研究发现,影响阶段划分的只有其中的某几种,而大部分飞参数据与阶段划分无明显关联,称为冗余参数。如果把所有的飞行参数都用于构建决策树模型,就会使决策树有非常多的分叉,复杂臃肿,甚至导致误判。因此在使用决策树和随机森林算法构建分类模型之前,需要对飞行参数进行约简。参数约简的主要思想是去除冗余、无关的参数,只保留关键参数,以提高决策效率。
本文所使用的飞参数据包含高度、俯仰角、空速、磁航向角度、攻角、升降速度、发动机转速、机体轴向加速度、横滚角等42 个特征参数。根据各个飞行阶段的特点,提取的主要参数为高度、俯仰角、空速、机体轴向加速度四个飞行参数,作为特征参数。
决策树算法常见的决策分支方式有三种:基于信息增益的ID3、基于信息增益比的C4.5 和基于基尼指数的CART。前两者是基于信息熵的。sklearn中只实现了ID3 与CART 决策树。由于ID3 决策树涉及了大量的对数运算,运算复杂,而CART 决策树更适合大规模样本处理,因而本文采用CART 决策树进行飞行阶段划分。
采用CART 决策树构建分类模型时,利用已经划分好飞行阶段的飞参数据建立训练样本数据集,输入为训练样本数据集、设定好基尼指数的阈值以及样本个数阈值,输出为CART 决策树。建立CART 决策树分类模型的方法是根据飞参训练样本数据集,先构建根结点,再自顶向下利用飞参训练样本数据集递归创建每一个结点,从而构建划分飞行阶段的整个CART决策树。具体步骤如下:
1)判断结点中的样本个数是否小于预定阈值,或者是否没有更多特征,如果是,则返回决策树,停止迭代,算法结束;如果否,则进行第2)步。
2)计算结点现有特征对当前训练数据集的基尼指数,判断样本集的基尼指数是否小于预定的阈值,如果是,则返回决策树,停止迭代,算法结束;如果否,则进行第3)步。
3)在所有特征的所有切分点中,依据基尼指数最小的原则,选定最优特征与最佳切分点,划分属性。即根据选定的最优特征与最佳切分点,将当前结点生成两个子结点,并将训练样本数据集相应地也分配到这两个子结点中。
4)对刚刚生成的两个子结点,重复刚才的步骤1)、2)、3)。
基于决策树算法的飞行阶段划分的流程图如图2所示。
Python 中sklearn 模块定义了DecisionTreeClassifier类实现决策树算法,关键代码如下:
#将数据分为训练数据集和测试数据集
x_train,x_test,y_train,y_test=train_test_split(x_train,y_train,test_size=0.5)
#创建决策树对象
clf=DecisionTreeClassifier(criterion='gini',random_state=1,max_depth=4)
#根据数据构造决策树
model=clf.fit(x_train,y_train)
#预测
y_pred=model.predict(x_test)
#计算准确度
score_c=clf.score(x_test,y_test)
随机森林是利用多个决策树对样本进行训练并进行预测的一种分类器,它的基础是决策树。一个测试样本,对于决策树算法,只能有一个分类结果;而对于随机森林算法,森林中的每个决策树都会有一个分类结果。随机森林算法会根据各个决策树的分类结果,将投票次数最多的类别定为最后的输出类别。随机森林算法能处理高维特征,不容易产生过拟合,模型训练速度比较快,特别是对规模较大的数据而言[11]。
本文设计的随机森林分类模型采用的是有放回的抽取飞参数据。根据前面的分析,仍然选取飞机的高度、俯仰角、空速以及机体轴向加速度四个飞行参数作为特征参数,划分飞行阶段。
从原始数据集S 中有放回地随机抽取2/3,构造子数据集,作为每个决策树的训练样本集S,再从选取的4 个飞行参数中随机选取两个,作为CART 决策树的特征输入量。再从选出的特征子集中选择基尼指数在最小情况下时进行分裂。
基于随机森林算法的飞行阶段划分流程图如图3所示。
图3 随机森林算法流程图
Python 中sklearn 模块定义了RandomForest-Classifier类实现随机森林算法。关键代码如下:
#将数据分为训练数据集和测试数据集
x_train,x_test,y_train,y_test=train_test_split(x_train,y_train,test_size=0.5)
#创建随机森林对象
rfc=RandomForestClassifier(random_state=1,criterion='gini',n_estimators=25)
#根据数据构造随机森林
model=rfc.fit(x_train,y_train)
#预测
y_pred=model.preict(x_test)
#计算准确度
score_r=rfc.score(x_test,y_test)
为验证本文算法的有效性,选取某型飞机连续飞行31min,采集的共21186 帧数据作为数据集,该数据集包含42 个飞行参数。实验在Windows 10 操作系统下,用Python程序设计语言在Anaconda 3环境中进行。
以某机型的实际飞行数据进行基于随机森林算法的飞行阶段划分,并仿真对比决策树算法,需首先进行数据准备。在飞行过程中由经验丰富的一级飞行教官人工划分飞行阶段,得到已划分好飞行阶段的飞行参数数据集。为实验方便,将起飞、爬升、巡航、下降以及着陆这5 个阶段依次编号为1、2、3、4、5,作为标签。用sklearn 中的train_test_split函数,将上述已划分好起飞、爬升、巡航、下降以及着陆这5 个阶段的飞行参数数据集分成训练样本集与测试样本集。随机森林的输入为建立好的训练样本数据和其对应的飞行阶段编号,以此进行训练,得到训练好的随机森林模型;然后将建立好的测试样本数据经已训练好的随机森林模型进行飞行阶段的分类识别,输出分类识别出的飞行阶段编号;最后对比输出结果与实际结果的匹配度,计算识别准确度,并记录识别时间。得到的实验结果如表1所示。
表1 飞行阶段的划分结果
因而可以得到在测试样本数据集规模为10593 帧时,利用决策树算法与随机森林算法对测试数据进行飞行阶段划分的结果,如图4所示。
图4 各飞行阶段的识别率对比图
从实验结果可以看出,对某型飞机一段时间的实际飞行数据,使用随机森林分类算法,对起飞、下降、着陆等特征区别明显的阶段几乎可以完全识别出来,连巡航阶段也达到了99.01%的准确度。而决策树算法在各个阶段的识别率均低于随机森林算法,且只有着陆阶段可以完全识别。以上分析表明,对于该型飞机,使用随机森林算法划分飞行阶段,相比于直接使用决策树算法效果更好,而且,实验表明,在样本数量相同的情况下,随机森林算法用时更短,识别速度更快。
为在明确划分各个飞行阶段的基础上,进行更为深入的飞行领域研究,本文采用基于CART 决策树的随机森林算法,对某型飞机产生的实际飞行数据进行飞行阶段划分,并与单一CART 决策树算法进行对比仿真。实验结果表明,使用随机森林算法进行飞行阶段划分的准确率是非常高的,比决策树算法更为有效。所以可以将基于随机森林算法的飞行阶段划分方法应用到该型飞机的飞行训练中,以实现飞行阶段划分的客观性、高效性和自动化,为飞行质量评估、飞机性能测试、故障诊断等各种飞行训练系统提供应用基础。