熱力学シミュレーション支援型ランダムフォレスト:船舶用ディーゼルエンジンの燃焼室部品における説明可能な故障診断

Congcong Luo a , Minghang Zhao a,* , Xuyun Fu a , Shisheng Zhong a , Song Fu b , Kai Zhang c , Xiaoxia Yu d
a Department of Mechanical Engineering, Harbin Institute of Technology, Weihai, Weihai 264209, China
b School of Mechatronics Engineering, Harbin Institute of Technology, Harbin 150001, China
c School of Mechanical Engineering, Southwest Jiaotong University, Chengdu 610031, China
d School of Mechanical Engineering, Chongqing University of Technology, Chongqing 400054, China

要旨

従来の船舶用ディーゼルエンジンの知的故障診断手法は、故障訓練データの不足による汎化能力の低さや、故障メカニズムに関する事前知識の統合不足による説明性の欠如といった課題を抱えています。これらの問題に対処するため、本研究では 熱力学シミュレーション支援型ランダムフォレスト (TSRF) 手法を提案します。

この手法は、熱力学シミュレーションによって故障の進展特性を明らかにし、それを事前知識として知的故障診断モデルの設計に組み込むものです。まず、システムの基本パラメータを微調整して様々な故障の顕著な特徴をシミュレートし、5つの熱力学故障モデルを開発しました。次に、数値シミュレーションの結果に基づき、燃焼室部品の劣化を表す潜在的な熱力学指標を特定しました。

さらに、SHapley Additive explanations (SHAP) 値を計算して特徴選択を行い、故障状態と有意な相関を持つ変数のみを保持しました。最後に、選別されたパラメータを用いて燃焼室の健全性を評価しました。実験の結果、提案するTSRF手法は優れた分類性能を示し、故障データセットにおいて99.07%という高い平均精度を達成しました。

キーワード:
船舶用ディーゼルエンジン 故障診断 説明可能AI SHAP値

研究の動機

海洋工学および予知保全 (PHM) の分野において、業界は長期にわたる2つの大きなボトルネックに直面しています。

  • データの希少性: 船舶用ディーゼルエンジン(特に外航船の主機)は船の心臓部であり、海上での深刻な故障は動力喪失、座礁、さらには海難事故につながる可能性があります。そのため、設計時の安全率は極めて高く、重大な故障が発生する確率は本来非常に低いものです。さらに、海事業界では厳格な予防保全システム(運転時間に基づく定期整備など)が実施されており、摩耗部品の大部分は、実際に破損して故障データを生成する前に強制的に交換されます。このため、正常データや初期摩耗データは大量に存在する一方で、完全な機能不全や深刻な故障に関する実データは極端に不足しています。
  • 「ブラックボックス」問題: ディープラーニングモデルは通常透明性を欠いており、故障の物理的な原因を説明できなければ、エンジニアがその判断を信頼することは困難です。船級協会による厳格な規制を受ける海運業界において、この不透明性は特に重大です。もしAIの誤診がピストンの焼き付きやクランクシャフトの破損を引き起こした場合、そのエラーの原因がデータバイアスなのか、アルゴリズムの欠陥なのか、あるいはセンサーのドリフトなのかを追跡できなければ、海難事故調査においてその説明責任を果たすことはできません。

これらの課題に対処するため、私たちはTSRF手法を提案しました。物理ベースのメカニズムモデルと高度な説明可能技術を融合させ、高忠実度のシミュレーションモデルを活用することでデータの希少性問題を解決し、同時に診断の意思決定が熱力学の基本原理に準拠していることを保証します。


方法論

本研究のワークフローは、以下の4つの主要なフェーズで構成されています(図を参照):

  1. 熱力学モデリング: 物理的なテストベンチだけに頼るのではなく、6気筒船舶用ディーゼルエンジンの高忠実度1次元熱力学モデルを構築しました。このモデルは実稼働データに基づいて厳密に校正されており、シミュレーション誤差は5%以内に抑えられています。
  2. 故障注入: 校正されたモデルに基づき、物理パラメータを微調整することで5種類の特定の燃焼室故障(シリンダーヘッドの亀裂、ピストンの焼損など)をシミュレートし、実際のエンジンの様々なレベルの故障を網羅するデータセットを生成しました。
  3. SHAPに基づく特徴選択: SHAP値を用いて重要な特徴量を定量的に特定し、診断の意思決定を支配する14の主要パラメータを選別しました。
  4. 分類診断: この物理的に強化されたデータセットを用いてランダムフォレスト (RF) 分類器を訓練し、高精度の故障診断を実現しました。
Structure of TSRF method combining Thermodynamic Simulation and Random Forest for Explainable AI

図 1: TSRF手法のアーキテクチャ。


熱力学モデリングの詳細

高い忠実度を確保するため、1次元ディーゼルエンジンシミュレーションモデルを構築しました。このメカニズムモデルは、物理的な精度とデータセット生成に必要な計算効率のバランスを考慮しています。

モデルトポロジー

エンジンシステムは、流体配管と機能コンポーネントのネットワークとして離散化されています。

  • コアパワーユニット: 6気筒、2ストローク直列構成。
  • 吸排気システム: 吸気/排気マニホールド (PL1, PL2) は複雑な配管ネットワークで接続されています。
  • 過給システム: ターボチャージャー (TC1) とインタークーラー (CO1) が結合されています。

校正と検証

故障注入を行う前に、ベースラインモデルは実測データに基づいて厳密に校正されました。

  • データソース: データ収集モジュール (DCM) を通じて取得された実際の船舶運航データ。
  • 検証: 主要パラメータ(出力、排気温度など)の偏差は厳密に ±5%の誤差範囲内 に制御されています。
1-D thermodynamic simulation model

図 2: ディーゼルエンジン1次元熱力学モデルの概略図。

Model Validation Results

図 5: データ収集モジュール (DCM)。

故障注入メカニズム

1次元モデルでは3D構造の欠陥を直接表現できないため、物理的な劣化メカニズムを等価な熱力学パラメータの変動に変換する現象学的マッピング法を採用しました。

故障タイプ 物理メカニズム モデリング実装
F1: シリンダーヘッド亀裂 熱伝導の阻害。 シリンダーヘッド表面温度 ($T_H$) を346°Cまで上昇。
F2: ピストン焼損 材料欠損とシール不良。 ピストン温度 ($T_P$) の上昇 + 軽微なブローバイ (0.01 kg/s)。
F3: シリンダーライナー摩耗 摩耗によるボア径の拡大。 ボア径の拡大 + 大量のブローバイ (0.03 kg/s)。
F4: ピストンリング摩耗 ガス漏れ。 ブローバイ質量流量の調整 (0.02 kg/s)。
F5: ピストンリング固着 摩擦増大とシール不良。 ボア径変化 + ライナー温度上昇 + ブローバイ。

説明可能性の分析

本研究の革新的な点は、焦点を「故障は何か?」から「なぜその故障と判定されたのか?」へと移行させたことにあります。ピストンリング摩耗 (F4) の事例分析を通じて、この能力を実証しました。

  • 局所的説明 (ウォーターフォールプロット): ウォーターフォールプロットは具体的な予測ロジックを解析します。例えば、モデルが「ピストンリング摩耗」と予測したのは、ブローバイ熱流 (P06) とブローバイ質量流量 (P07) が特定の値を示し、その結果として故障の予測確率が上昇したためです。これは物理法則と一致しています。ピストンリングの摩耗は気密性を損ない、ガス漏れ(ブローバイ)を引き起こします。
  • 大域的説明 (ビースウォームプロット): 大域的分析は、モデルが学習した一般的な法則を明らかにします。タービン前排気圧力 (P11) の低い値が、ピストンリング摩耗の強力な指標であることが分かりました。物理的な観点からもこれは整合性があります。摩耗したピストンリングはシリンダーからのガス漏れを引き起こし、その結果、タービンを駆動するための利用可能なエネルギーが減少するためです。
SHAP Analysis,including Waterfall plot, beeswarm plot, interaction plot and dependence plot

図 11: SHAP値に基づくピストンリング摩耗 (F4) の故障分析:(a) ウォーターフォールプロット、(b) ビースウォームプロット、(c) 交互作用プロット、(d) 依存性プロット。

SHAP可視化コードを表示 (Python)

上記のグラフの実装詳細にご興味がある場合、以下はウォーターフォールプロット、ビースウォームプロット、交互作用プロット、依存性プロットを生成するためのサンプルコードです。👇

import shap
import matplotlib.pyplot as plt
import numpy as np

# --- 0. Setup & Global Settings ---
plt.rcParams['font.family'] = 'Arial'
plt.rcParams['font.size'] = '24'
plt.rcParams['axes.unicode_minus'] = False

# Assumption: 'best_model' is your trained XGBoost/RF model
# Assumption: 'X_train' and 'X_test' are pandas DataFrames

# 1. Calculate SHAP values as Numpy Arrays (for Beeswarm, Dependence, Interaction)
explainer_tree = shap.TreeExplainer(best_model)
shap_values_numpy = explainer_tree.shap_values(X_train) 

# 2. Calculate SHAP values as Explanation Object (Specifically for Waterfall)
explainer_obj = shap.Explainer(best_model, X_test)
shap_values_obj = explainer_obj(X_test)


##################################################################
#                                                                #
#                      (a) Waterfall Plot                        #
#          Visualizes contribution for a single sample           #
#                                                                #
##################################################################

class_idx = 4  # Target class
sample_idx = 3 # Specific sample to explain

plt.figure()
shap.plots.waterfall(
    shap_values_obj[sample_idx, :, class_idx], 
    max_display=9, 
    show=False
)

# Customizing style
ax = plt.gca()
ax.set_xlabel(ax.get_xlabel(), fontsize=36)
ax.set_ylabel(ax.get_ylabel(), fontsize=36)
ax.spines['bottom'].set_linewidth(3)
plt.show()


##################################################################
#                                                                #
#                      (b) Beeswarm Plot                         #
#              Global summary of feature importance              #
#                                                                #
##################################################################

class_idx = 5
plt.figure(figsize=(10, 8))

shap.summary_plot(
    shap_values_numpy[..., class_idx], 
    X_train, 
    feature_names=X_train.columns, 
    plot_type="dot", 
    show=False, 
    cmap='Greys' # or 'plasma'
)

# Customize Color Bar
cbar = plt.gcf().axes[-1] 
cbar.set_ylabel('Parameter Value', fontsize=24)
cbar.tick_params(labelsize=20)
plt.show()


##################################################################
#                                                                #
#                     (c) Interaction Plot                       #
#          Visualizes interaction effects between features       #
#                                                                #
##################################################################

# Note: Calculation can be expensive
shap_interaction_values = explainer_tree.shap_interaction_values(X_test)
class_idx = 4

plt.figure()
shap.summary_plot(
    shap_interaction_values[..., class_idx], 
    X_test, 
    show=False, 
    max_display=6, 
    cmap='Greys' 
)

# Clean up subplots
axes = plt.gcf().axes
for ax in axes:
    ax.spines['bottom'].set_linewidth(2)
    ax.tick_params(axis="x", labelsize=18, width=2)
    ax.set_title(ax.get_title(), fontsize=14) 

plt.subplots_adjust(wspace=0.3, hspace=0.4)    
plt.show()


##################################################################
#                                                                #
#                     (d) Dependence Plot                        #
#           Feature relationship colored by interaction          #
#                                                                #
##################################################################

Feature_X = 'P06'  # Main feature
Feature_Y = 'P07'  # Interaction feature
class_idx = 4

shap.dependence_plot(
    Feature_X, 
    shap_values_numpy[..., class_idx], 
    X_train, 
    interaction_index=Feature_Y, 
    dot_size=100, 
    show=False
)

# Customize Axes
ax = plt.gca()
ax.tick_params(axis='both', which='major', labelsize=36, width=2)
ax.set_ylabel(f'SHAP value ({Feature_X})', fontsize=36)
ax.spines['bottom'].set_linewidth(3)
ax.spines['left'].set_linewidth(3)
plt.show()


##################################################################
#                                                                #
#            (e) Advanced Composite Plot (Beeswarm + Bar)        #
#      Combines Beeswarm (Bottom Axis) & Importance (Top Axis)   #
#                                                                #
##################################################################

class_idx = 5
fig, ax1 = plt.subplots(figsize=(10, 8))

# 1. Main Beeswarm Plot (on ax1)
shap.summary_plot(
    shap_values_numpy[..., class_idx], 
    X_train, 
    feature_names=X_train.columns, 
    plot_type="dot", 
    show=False, 
    color_bar=True, 
    cmap='Greys' # or 'plasma'
)

# Customize Color Bar
cbar = plt.gcf().axes[-1] 
cbar.set_ylabel('Parameter Value', fontsize=24)
cbar.tick_params(labelsize=20)

# Adjust layout to make room for the top axis
plt.gca().set_position([0.2, 0.2, 0.65, 0.65]) 

# 2. Feature Importance Bar Plot (on Top Axis ax2)
# Create a twin axis sharing the y-axis
ax2 = ax1.twiny() 

shap.summary_plot(
    shap_values_numpy[..., class_idx], 
    X_train, 
    plot_type="bar", 
    show=False
)

# Align position with the main plot
plt.gca().set_position([0.2, 0.2, 0.65, 0.65]) 

# Style the bars (Transparent & Light Color)
bars = ax2.patches
for bar in bars:
    bar.set_color('#CCE5FB') # Light blue background bars
    bar.set_alpha(0.4)       # Transparency

# Customize Axes Labels
ax1.set_xlabel(f'Shapley Value Contribution (F{class_idx})', fontsize=24, labelpad=5)
ax1.set_ylabel('Parameters', fontsize=24)
ax2.set_xlabel('Mean Shapley Value (Parameter Importance)', fontsize=24, labelpad=10)

# Move ax2 (Bar plot axis) to the top
ax2.xaxis.set_label_position('top') 
ax2.xaxis.tick_top()

# Ensure ax1 (dots) is drawn ON TOP OF ax2 (bars)
ax1.set_zorder(ax1.get_zorder() + 1) 
ax1.patch.set_visible(False) # Make ax1 background transparent

plt.show()

研究のハイライト

本研究は、この分野に対して以下の重要な貢献を行ったと考えています。

  • 船舶用ディーゼルエンジンの燃焼室部品における5つの代表的な故障に対するパラメータ化モデルを確立しました。
  • 複数の特徴選択手法との比較を通じて、SHAP手法の有効性を検証しました。
  • データ駆動型アプローチと熱力学メカニズムモデルを融合させることで、説明可能な故障診断に新たな視点を提供しました。

引用

本研究が皆様の研究に役立つ場合は、ぜひ以下の論文をお読みください 😊

BibTeX

@article{luo2025thermodynamic,
  title     = {Thermodynamic simulation-assisted random forest: Towards explainable fault diagnosis of combustion chamber components of marine diesel engines},
  author    = {Luo, Congcong and Zhao, Minghang and Fu, Xuyun and Zhong, Shisheng and Fu, Song and Zhang, Kai and Yu, Xiaoxia},
  journal   = {Measurement},
  volume    = {251},
  pages     = {117252},
  year      = {2025},
  publisher = {Elsevier},
  doi       = {10.1016/j.measurement.2025.117252},
}

標準フォーマット

C. Luo, M. Zhao, X. Fu, S. Zhong, S. Fu, K. Zhang, X. Yu. Thermodynamic simulation-assisted random forest: Towards explainable fault diagnosis of combustion chamber components of marine diesel engines[J]. Measurement, 2025, 251: 117252.

ScienceDirectで閲覧