Alexey0424/wind-turbine-damage-detection-ml

GitHub: Alexey0424/wind-turbine-damage-detection-ml

基于真实风力涡轮机振动信号与频域分解特征,使用多种机器学习模型实现结构损伤检测与定位的SHM研究项目。

Stars: 0 | Forks: 0

# 基于机器学习的风力涡轮机结构损伤检测 ![Python](https://img.shields.io/badge/Python-3.10-blue) ![PyCaret](https://img.shields.io/badge/AutoML-PyCaret%203-orange) ![scikit-learn](https://img.shields.io/badge/ML-scikit--learn-f89939) ![LightGBM](https://img.shields.io/badge/Best%20model-LightGBM-green) ![SHAP](https://img.shields.io/badge/Interpretability-SHAP-9cf) ![pandas](https://img.shields.io/badge/Data-pandas%20%7C%20NumPy-150458) ![SciPy](https://img.shields.io/badge/Signal%20processing-SciPy-8caae6) ![License](https://img.shields.io/badge/License-MIT-lightgrey)

A guyed wind turbine on an Andean hillside streams vibration signals into a frequency-spectrum console

基于振动的**结构损伤检测与定位**,应用于真实的 14 米 原型风力涡轮机,使用加速度计信号、模态分析和机器 学习。作为我在 **EIA 大学(哥伦比亚麦德林)** 的结构健康监测 (SHM) 研究项目中硕士论文的一部分而构建。 - **真实硬件,真实数据**:在哥伦比亚安蒂奥基亚东部的一座装有仪器的涡轮机塔架上,经过为期 1.5 年的 实验活动,收集了 6,000 多条振动记录。 - **物理诱导的损伤**:通过操纵支撑塔架的拉线张力来产生刚度损失, 形成了 12 种不同的损伤场景以及健康基线。 - **物理信息特征**:损伤会改变结构的固有频率 (在这台涡轮机中,第一种振动模式在健康 和损坏状态之间下降了近一半),因此模型是在通过 频域分解提取的模态频率上进行训练的,而不是基于原始信号。 ## 结果 两项监督学习任务,五种算法家族,相同的训练协议 (分层 80/20 拆分,分层 10 折 CV,随机搜索调优,固定种子)。 下方的所有数字均为从执行的 notebook 中复现的 **hold-out** 指标。 **任务 1:损伤检测(二分类,健康 / 损坏)** | Algorithm | Accuracy | AUC | Recall | Precision | F1 | |---|---|---|---|---|---| | Random Forest | **0.917** | 0.964 | 0.917 | 0.916 | 0.917 | | LightGBM | 0.914 | **0.973** | 0.914 | 0.912 | 0.913 | | Gradient Boosting | 0.908 | 0.966 | 0.908 | 0.907 | 0.907 | | KNN | 0.793 | 0.832 | 0.793 | 0.775 | 0.765 | | SVM (linear) | 0.750 | n/a | 0.750 | 0.563 | 0.643 | **任务 2:损伤定位(多分类,健康 / 顶部 / 底部 / 顶部-底部)** | Algorithm | Accuracy | AUC | Recall | Precision | F1 | |---|---|---|---|---|---| | LightGBM | **0.867** | **0.974** | 0.867 | 0.869 | 0.867 | | Gradient Boosting | 0.861 | 0.969 | 0.861 | 0.864 | 0.862 | | Random Forest | 0.835 | 0.957 | 0.835 | 0.838 | 0.835 | | KNN | 0.576 | 0.828 | 0.576 | 0.594 | 0.575 | | SVM (linear) | 0.388 | n/a | 0.388 | 0.522 | 0.345 |

Binary confusion matrix (LightGBM, hold-out) Multiclass confusion matrix (LightGBM, hold-out)
LightGBM hold-out confusion matrices: damage detection (left) and localization (right).

树集成模型显然占据主导地位:在模态频率空间中,损伤状态之间的 决策边界是非线性的,这正是线性 SVM 退化为 多数类行为 (Kappa = 0) 而 boosting 树大放异彩的所在。此 notebook 是 论文方法论的**基线**,上述每一个数字都是直接从其 保留的输出中复现的。 ## 工作原理 ``` raw accelerometry (6 channels @ 1 kHz, TDMS/LVM) │ tare subtraction → detrend → Hann smoothing → Butterworth band-pass (0-30 Hz) │ → resample to 100 Hz → detrend ▼ Frequency Domain Decomposition (per record) │ cross-spectral density matrices between same-axis sensors │ → SVD at every frequency line → first singular value spectrum │ → peak picking: top-5 natural frequencies × 2 axes = 10 features ▼ data preparation │ class balancing across 14 campaigns → 6,000+ records │ IQR outlier replacement (per damage scenario, median imputation) ▼ AutoML training (PyCaret) │ SVM · KNN · Random Forest · Gradient Boosting · LightGBM │ stratified 10-fold CV → random-search tuning → hold-out evaluation ▼ deployable pipelines (preprocessing + model, pickled) + SHAP interpretability ``` 完整的实现,包含从原始训练运行中保留的每个指标表、混淆矩阵、特征重要性 图和 SHAP 分析,位于 [`wind_turbine_fdd_ml_pipeline.ipynb`](wind_turbine_fdd_ml_pipeline.ipynb): | Section | Contents | |---|---| | 1-3 | 项目介绍,活动标记,信号处理配置 | | 4 | 信号预处理 & FDD 特征提取(在私有原始数据上运行) | | 5 | 数据导入,异常值处理,数据集组装 | | 6.1 | 二分类损伤检测:5 个模型,调优,评估 | | 6.2 | 多分类损伤定位:5 个模型,调优,评估 | ## 可解释性

SHAP summary (LightGBM, binary task)
SHAP summary for the LightGBM detector: low first-mode frequencies push predictions toward "damaged", matching the physics (stiffness loss lowers natural frequencies).

SHAP 值(树模型)和置换特征重要性(其他模型)证实 模型依赖于具有物理意义的特征,主要是最低的固有 频率,而不是人工痕迹,这正是使得该方法对于 必须泛化到未见损伤配置的监测系统具有可信度的原因。 ## 数据可用性 加速度数据集(6,000+ 条记录,14 次采集活动)是在 EIA 大学的一个研究项目下收集的,**不对外公开**。Notebook 保留了所有执行输出(得分网格、hold-out 指标、混淆矩阵和 可解释性图表),因此无需访问 原始数据即可审查整个 pipeline。此 repository 中不包含任何原始信号,并且派生 特征的预览仅限于标准的截断表格表头。 ## 复现性说明 - 全程使用固定的 `session_id`:每次拆分、折叠和搜索都是确定性的。 - 归一化和插补位于 PyCaret pipeline **内部**,仅在训练 拆分数据上进行拟合,与 hold-out 集没有任何泄漏。 - 在支持的地方,训练使用了 GPU 加速(LightGBM OpenCL)。 - **技术栈**:PyCaret 3 在后台统筹 **scikit-learn** 的评估器和 pipeline (SVM、KNN、Random Forest 和 Gradient Boosting 是 scikit-learn 模型; LightGBM 通过其 scikit-learn API 接入)。信号处理使用 **SciPy** (滤波、重采样、CSD、SVD),数据处理使用 **pandas/NumPy**,绘图使用 **Matplotlib/seaborn**,可解释性使用 **SHAP**,原始采集文件 使用 **npTDMS** 读取。 - 依赖项:[`requirements.txt`](requirements.txt)(PyCaret 3 支持 Python 3.9 到 3.11)。 - 标签和图中的文本混合了英语和西班牙语,因为采集系统是 用西班牙语配置的;notebook 头部包含一个词汇表。 ## 作者 **Alexey David Velásquez Betancurt**,工程学硕士。 论文:基于机器学习的风力涡轮机损伤诊断方法论, EIA 大学,麦德林,哥伦比亚。 GitHub: [@Alexey0424](https://github.com/Alexey0424) 基于 [MIT License](LICENSE) 授权。
标签:Apex, Python, 信号处理, 异常检测, 无后门, 机器学习, 结构健康监测, 逆向工具, 风力发电机