馬 亮,郭力強,劉丙杰,楊 靜
(海軍潛艇學院,山東 青島 266199)
大型裝備具有高復雜性、高耦合度、非線性等特點,裝備性能影響因素多,關系復雜。由于大型裝備試驗次數少,試驗數據量有限,易導致測試數據易缺失,覆蓋性不高。為全面了解裝備性能影響因素,有必要對缺失數據進行插補。
目前,常用的數據插補方法有統計量插補法和回歸預測插補法。隨著機器學習和數據挖掘技術的興起,回歸預測插補法引起了廣泛的關注。文獻[1]針對統計量插補法效果不理想的問題,使用BP神經網絡模型對研究流域降水數據進行插補,取得了較好的插補精度。但模型泛化能力弱,對樣本數量要求高。文獻[2]提出了聯合極大似然估計與EM算法相結合的多重插補方法,但是僅在缺失數據比例小于35%時得到理想結果,存在適用范圍受限的問題。文獻[3]提出了一種基于均值插補法的EM算法,并與基于線性回歸和Bootstrap的修正EM算法進行了比較,結論認為基于Bootstrap的修正EM算法更準確。然而,EM算法在原理上需要有龐大的數據集作為支撐,以保證估計值漸近無偏并服從正態分布,否則可能會陷入局部極值。文獻[4]提出了基于K近鄰的插補方法,可應用于連續型數據的插補。隨機森林的創始人Breiman在文獻[5]首次使用模型對缺失數據插補,驗證了隨機森林對缺失數據插補的可行性。文獻[6]分別使用極限學習機、BP神經網絡、支持向量機和XGBoost等機器學習模型對潛熱通量缺失數據進行插補,結果表明XGBoost與極限學習機的插補效果最佳。
國內外對數據插補方法的研究表明,數據插補問題的本質是一個高噪聲的多重回歸預測問題。由于大型復雜裝備試驗具有小樣本的特點,這就要求回歸器在小樣本上具有較好的擬合效果和泛化能力。相比于傳統的決策樹(decision tree)[7],支持向量機(support vector machine)[8]等對樣本數量要求高、容易過擬合的單一模型,集成學習算法會綜合多個基學習器的建模結果,以此獲取比單個模型更好的預測效果,從理論上適合應用于解決裝備小樣本試驗缺失數據插補問題。
本文以基于Bagging算法的隨機森林和Boosting算法的XGBoost為代表,分析集成學習的建模原理,探討應用集成學習算法解決裝備小樣本試驗數據缺失問題的有效性,并在KEEL公測數據集上對該方法進行了推廣驗證。
集成學習算法(ensemble learning)是通過在數據上構建多個模型,綜合考慮所有模型的建模結果來提高預測性能的算法。由多個模型集成的模型叫做集成學習器,組成集成學習器的每個模型叫做基學習器,并要求其性能至少要超過隨機學習器[9]。由于集成學習算法在處理預測和分類問題中的出色性能,近年來成為KDDcup、Kaggle、天池等大型數據競賽中的奪冠利器。
隨機森林是一種以決策樹模型為核心的Bagging算法,用于完善單決策樹在處理回歸和分類問題中精度不高、容易過擬合的缺陷。2001年Leo Breiman將其提出的Bagging理論與CART決策樹,以及隨機子空間方法(random subspace method)相結合,提出了一種非參數分類與回歸算法—隨機森林(random forest)[10]。
隨機森林的基本思想可歸納為:首先使用自助重抽樣(Bootstrape)的方法從數據量為N的原始樣本集D中有放回地隨機抽取生成m個與原始樣本集D同樣大小的訓練樣本集Dm,在此基礎上構建對應的決策樹;然后在對決策樹的每一個節點進行分支時,從全部Z個特征中隨機抽取一個特征子集,即只選擇部分特征進行分支,并從這些子集中選擇一個最優分支來建立決策樹;最后將構建的多棵決策樹作為集成學習器形成隨機森林,通過對每個基學習器的結果進行評估或者多數表決的方法決定集成學習器的結果[11]。

圖1 隨機森林構建單顆決策樹的流程圖
Bagging算法的核心思想是通過并行構建多個盡可能相互獨立的基學習器,借助基學習器之間的“獨立性”來降低模型整體的方差,從而獲得比單顆決策樹更低的泛化誤差和更強的泛化能力。泛化誤差可理解為模型在未知數據集上預測誤差,一般可認為由偏差、方差和噪聲構成。其中偏差是預測值與真實值之間的差異,用于衡量模型的精度;方差是模型在不同數據集上輸出的結果的方差,用于衡量模型穩定性;噪音是數據收集過程當中不可避免的、與數據真實分布無關的信息。

然而,由于所有基學習器都是在相同的原始樣本集上進行采樣訓練,很難實現完全相互獨立。假設任意決策樹之間的相關系數為ρ,可將隨機森林輸出結果的方差表示為:
即單顆決策樹之間的相關性越弱,隨機森林通過降低方差提升的泛化能力越強。因此,為確保Bagging算法的有效性,一方面單個基學習器的誤差率至少要保證小于50%,另一方面要盡可能降低基學習器之間的相關性。

圖2 基學習器誤差率變化影響示意圖
由于隨機森林引入樣本自助重抽樣和隨機分支策略,通過樣本有放回抽樣和特征無放回抽樣樣本的方式,從樣本和特征兩個維度出發,盡可能使得每顆決策樹的訓練相互獨立。同時可以使用袋外數據(out of bag data)測試模型,有效地提升了效率;在決策樹的每個節點只選擇部分特征進行分支,從而使樹的增長只依賴于該部分的特征,而不是全部特征,在處理高維數據上有著出色性能[12];最終的輸出結果由多顆決策樹的輸出結果平均或投票決定,因此對數據噪聲和異常值有了較好的容忍性。
相比于與Bagging算法,Boosting的核心思想是按順序依次構建相互關聯和影響的基學習器,通過某種集成結果輸出規則來多次提升弱學習器對樣本的預測結果,達到降低模型的整體偏差的目標,構成性能出色的強學習器。假設衡量模型預測結果與真實結果的差異的損失函數為L(x,y),基學習器為f(x),算法集成輸出結果為H(x),則Boosting算法的建模流程可表示為:依據上一個弱學習器f(x)t-1的結果計算損失函數L(x,y),并使用L(x,y)結果自適應影響下一個弱學習器f(x)t的構建。經T次迭代后,根據某種集成輸出規則計算所有弱學習器的f(x)0~f(x)T的預測結果得到H(x)。
Boosting算法的開山代表是AdaBoost[13](adaptive boosting)算法,它的基本思想是:首先在抽取的訓練樣本上建立一棵決策樹,根據該決策樹預測的結果f(x)t和損失函數值L(x,y),增加被預測錯誤的樣本xi在數據集中的樣本權重wi,并讓加權后的數據集被用于訓練下一棵決策樹,即通過調整訓練數據的分布來間接影響后續弱學習器的構建。
2001年Jerome Friedman提出一種全新的損失函數計算公式—弗里德曼均方誤差[14]:
impurity_decrease=
w是葉子節點上的樣本權重,ri=y-H(xi)是樣本xi上的殘差。即通過這種擬合殘差的方式直接影響后續弱學習器的構建結構,并且采用調和左右葉子節點權重的分支規則加速了CART決策樹的預測效率,在AdaBoost的基礎上,形成GBDT(gradient boosting decision tree)算法。
2015年T.Q.Chen提出XGBoost[15](eXtreme gradient boosting)算法,在GDBT的基礎上改進集成輸出結果的評估策略,通過對損失函數進行二階泰勒展開和添加正則項的方法,有效避免了過擬合問題并加快了模型收斂速度。其輸出結果的評估策略可表示為式(1):
(1)


(2)

(3)

(4)
其中:gi表示樣本xi的一階導數;hi表示樣本xi的二階導數;wj表示第j個葉子節點的輸出值,Ij表示第j個葉子節點含有樣本的子集。簡化式(4)中的目標函數,可定義:
(5)
觀察可得,目標函數是一個凸函數:
(6)
在式(6)中對wj求導,令一階導數等于0,可求得使目標函數達到最小值的wj,即:

(7)
式(8)可以用來評價樹模型的得分,其數值越小,樹模型的得分越高。由此可以得出用于樹模型進行分枝的得分公式:
(8)
統計量插補法的基本思想是通過計算缺失特征的某一統計量,并用這個值來插補該特征的所有缺失數據。常用的統計量有平均值、中位數值和眾數值。該方法思想簡單,應用最為廣泛,可根據缺失數據類型分別處理:通常情況下,若缺失值為連續數據,則使用對該特征未缺失部分樣本平均值或中位數值插補的方法;若缺失值為離散數據,則以該特征未缺失部分樣本出現頻率最多的數值進行插補。
回歸預測插補法的基本思想是通過構建回歸模型,從數據中挖掘特征矩陣與標簽之間的關聯規則,訓練能夠映射特征矩陣與標簽關系的回歸器,實現對缺失數據的預測,并將預測結果作為插補結果。由于數據集的標簽和特征是人為標注的,因此可以通過自定義特征矩陣和標簽,重新構建數據子集的方式進行回歸預測。
2.2.1 單特征值缺失情況
在樣本數量為n,特征數量為m的數據集上,假設某一特征xi存在缺失值,將存在缺失值的特征xi定義為數據集的標簽y,其余m-1個未存在缺失值的特征和原始標簽定義為數據集的特征矩陣X。那么,不含缺失值的樣本中既存在特征值也存在標簽值,將其作為用于構建回歸模型訓練集(training set);包含缺失值的樣本中只存在特征值沒有標簽值,將其作為用于檢測回歸模型性能的測試集(testing set),其中測試集中缺失的標簽值即為回歸預測的對象。通過這種方式完成數據子集的重建以及訓練集和測試集劃分。
2.2.2 多特征值缺失問題
當數據集的多個特征值存在缺失時,可采用如下方法實現數據子集的重建和迭代劃分:
Step1:根據缺失數據集的特點,設定快速填充基準和特征重要性評估策略。快速填充基準可使用平均值、中位值等統計量,以快速對缺失值較少的特征進行插補;特征重要性評估策略可根據特征缺失程度大小或特征對標簽的貢獻度,以此確定對多個缺失特征的插補順序Uindex。一般來說,當某一特征的缺失值越少,損失的信息也就越少,使用統計量快速插補的效果越好;反之特征的缺失值越多,損失的信息也就越多,使用統計量填充的效果越差,應當優先選中進行回歸預測。
Step2:根據多個缺失特征的插補排序Uindex=[U1,U2,U3,...,Ut(t≤m)],使用快速填充基準對U1外的m-1特征的缺失值進行填充,將多特征值缺失問題轉換成單特征值缺失問題,按照單特征值缺失的情況進行數據子集的重建以及訓練集和測試集劃分。
Step3:選擇數據預處理方式和回歸結果評估指標,采用5折交叉驗證的方法優化回歸模型超參數后,訓練回歸器得到U1缺失值的預測結果,并將本輪的數據插補結果返回至缺失數據集相應位置,作為下一次迭代回歸的輸入。
Step4:按照Uindex排序重復Step2~3過程,經t次迭代回歸預測后,最終得到整個缺失數據集的插補結果,再根據回歸結果評估指標對快速填充基準、特征重要性評估策略及回歸器進行改進和提升。
潛射導彈因其機動范圍廣、攻擊突然性強,裝彈數量多、反擊威力大等特點備受各大軍事強國重視。潛射導彈彈射出筒經過水介質出水至空中再進入預定彈道,水下飛行段和出水段是潛射導彈發射所獨有的過程,對發射結果影響巨大。
出筒速度是影響水下彈道姿態和發射精度的關鍵因素之一[16-17]。受眾多客觀條件影響,發射深度、海流速度、海浪高度和氣幕彈等都會對出筒速度產生影響[18-20]。為確保導彈安全可靠的發射,需根據試驗數據的有關信息對導彈出筒速度的影響因素進行分析。但是受水下發射特殊環境的影響,觀測數據易出現缺失,因此有必要對試驗缺失數據進行有效插補。
實驗在Windows 10環境下進行,使用JupyterLab 3.10 IDE和Python 3.9 Kernel,調用Scikit-Learn庫版本為1.01。CPU配置為AMD Ryzen 5-5600H,主頻3.30 GHz,內存16 GB。
以某型潛射導彈發射試驗樣本為原始數據集,以發射深度、潛艇航速、海流速度、海面波高作為原始特征,出筒速度為原始標簽數據,采用完全隨機缺失方式,缺失數據標記為NaN值,建立缺失數據集。
初始采用平均值作為快速填充基準,將數據缺失程度作為特征重要性評估策略,使用Z-Score標準化的方法對特征數據進行預處理。為反映插補數據對真實數據的整體擬合程度,以回歸確定系數R2(R2=SSR/SST)作為插補效果評估指標,用于檢驗和提升回歸器插補效果。由于回歸器的泛化性能受超參數的影響較大,模型的復雜程度越高,超參數的數量越多。因此,為提高數據插補的效率,使用Optuna框架[21]采用TPE (tree-structured parzen estimator approach)[22]貝葉斯過程對回歸器超參數實現自動優化。數據集的重建劃分和回歸器訓練過程部分代碼如下所示:
X_full實驗數據集特征矩陣 y_full實驗數據集標簽
X_missing缺失數據集特征矩陣 y_full缺失數據集標簽
X 重建數據集特征矩陣 y重建數據集標簽
from sklearn.impute import SimpleImputer as SI
from sklearn.preprocessing import StandardScaler
import optuna
按照特征缺失程度進行插補排序
sortindex = np.argsort(X_missing.isnull().sum(axis=0)).values
for i in sortindex:
構建新特征矩陣
X = X_missing
X = pd.concat([X.iloc[:,X.columns!=i],y_full],axis=1)
使用統計量對含有缺失值的特征進行快速填充
X = SI(missing_values=np.nan,strategy='mean').fit_transform(X)
構造新標簽
y = X_missing.iloc[:,i]
新標簽真實數據
y_full = X_full.iloc[:,i]
數據預處理
scaler = StandardScaler()
X = scaler.fit_transform(X)
scaler = StandardScaler()
X = scaler.fit_transform(X)
劃分訓練集測試集
Y_train = y_new[y_new.notnull()]
Y_test = y_full[y_new.isnull()]
X_train = X_new_mean[Y_train.index,:]
X_test = X_new_mean[Y_test.index,:]
自動優化回歸器超參數
best_params,best_score = optimizer_optuna(300,"TPE")
實例化回歸模型
Reg = Regressor(best_params)
訓練回歸器
Reg = Reg.fit(X_train,Y_train)
預測缺失數據
Y_predict = Reg.predict(X_test)
將預測結果返回至缺失數據集
X_missing.loc[X_missing.iloc[:,i].isnull(),i] = Y_predict
評估數據插補效果
loss = criterion (X_full,X_missing)
初始設置特征矩陣缺失比例為20%,同時使用統計量法和回歸預測法對缺失數據進行插補。為評估集成學習算法的插補性能,分別使用基于Bagging思想的Random Forests和Boosting思想的XGBoost兩種典型的算法作為回歸器,并使用KNN和MLP算法與之比較。統計量法和回歸預測法對缺失數據的插補結果如圖3所示。

圖3 20%缺失比例下插補效果評估圖
在特征矩陣缺失比例為20%的情況下,使用平均值和中位數值插補得到的R2結果分別為0.833和0.820;使用KNN、MLP、Random Forest和XGBoost回歸器插補得到的R2結果分別為0.975、0.961、0.983、0.980。可以看出回歸插補法的效果明顯優于統計量插補法,其中使用集成算法構件的回歸器性能最優。
為進一步檢驗回歸預測插補法的適用范圍,將特征矩陣缺失比例調整為10%、15%、20%、25%、30%,分別建立缺失數據集進行插補實驗,得到如表1和圖4所示的結果。

表1 不同缺失比例下的插補效果

圖4 不同缺失比例下的插補效果
由圖4可知,回歸預測插補法具有較好的適用性,在不同缺失比例下,均能保持較好的數據插補效果。隨著數據缺失比例的增大,統計量插補法的效果越差,回歸插補法的優勢體現的越明顯,其中,使用集成算法的回歸器在25%、25%和30%等高缺失比例下,R2結果均能保持在0.95以上,驗證了該方法的可靠性,可應用于裝備小樣本試驗缺失數據插補。
除了裝備小樣本試驗,插補缺失數據是數據分析和處理工作中必不可少的一環,有必要驗證該方法的通用性和推廣價值。因此,使用KEEL公測數據集“dee”和“wizmir”進行上述數據插補實驗。其中“dee”數據集的樣本數量為365,特征數量為6;“wizmir”數據集的樣本數量為1461,特征數量為6。得到的插補結果如表2所示。

表2 KEEL公測數據集下的插補效果
由表2可知,該方法在公測數據集上具有通用性,在10%和20%缺失比例下,R2結果仍能保持在0.92以上。但是回歸預測插補法在回歸器的構建、超參數優化以及模型性能評估上需要投入大量的時間成本和計算代價。綜合衡量,統計量插補法適合在樣本數量大、缺失特征數目少、整體數據缺失比例較低(<10%)的數據集;而回歸預測插補法更適合用于缺失比例較高、特征相關性顯著的數據集。
針對裝備小樣本試驗次數少,測試數據易缺失的特點和常用數據插補方法對數據量要求高、計算復雜的問題,本文提出了一種基于集成學習的數據插補方法。驗證結果表明,該方法明顯優于統計量插補法,模型的數據擬合能力和泛化能力較強,在不同缺失比例下均有較好表現,能偶有效解決裝備小樣本試驗數據缺失問題,同時具有一定的推廣價值和通用性。為進一步提高缺失數據的插補效果,下一步將結合時序數據的預測處理方法,進一步優化缺失數據插補效果。