設(shè)備故障智能診斷:從特征工程到深度學(xué)習(xí)融合)
1. 項(xiàng)目背景與核心挑戰(zhàn)去年參加天府杯數(shù)學(xué)建模競(jìng)賽的經(jīng)歷現(xiàn)在回想起來依然覺得收獲頗豐。我們團(tuán)隊(duì)當(dāng)時(shí)選的是A題關(guān)于儀器故障智能診斷。這個(gè)題目乍一看感覺像是傳統(tǒng)工業(yè)領(lǐng)域的問題但組委會(huì)給的數(shù)據(jù)集和問題描述一下子就把我們拉到了數(shù)據(jù)科學(xué)和智能算法的前沿。題目要求我們基于給定的傳感器時(shí)序數(shù)據(jù)構(gòu)建一個(gè)能夠自動(dòng)、精準(zhǔn)識(shí)別多種潛在故障模式的智能診斷系統(tǒng)。這不僅僅是套用一個(gè)現(xiàn)成的分類模型那么簡(jiǎn)單它涉及到信號(hào)處理、特征工程、模型選擇、結(jié)果可解釋性等一系列環(huán)環(huán)相扣的挑戰(zhàn)。當(dāng)時(shí)我們面臨的核心痛點(diǎn)非常明確第一數(shù)據(jù)是典型的多維時(shí)間序列包含了振動(dòng)、溫度、壓力等多種傳感器在不同時(shí)間點(diǎn)的讀數(shù)噪聲大、維度高直接喂給模型效果肯定不好。第二故障模式并非獨(dú)立發(fā)生早期故障信號(hào)極其微弱容易被噪聲淹沒如何從海量數(shù)據(jù)中提取出對(duì)故障敏感的特征是診斷準(zhǔn)確率提升的關(guān)鍵。第三賽題不僅要求診斷出故障類型還希望我們對(duì)故障的嚴(yán)重程度或發(fā)展階段做出評(píng)估這要求模型具備一定的回歸或排序能力。最終我們團(tuán)隊(duì)通過一套融合了信號(hào)處理、傳統(tǒng)機(jī)器學(xué)習(xí)與深度學(xué)習(xí)的混合策略成功解決了這些問題并拿到了一等獎(jiǎng)。這篇文章我就把我們的解題思路、技術(shù)細(xì)節(jié)以及用Python實(shí)現(xiàn)的核心代碼毫無保留地分享出來。無論你是正在備戰(zhàn)數(shù)學(xué)建模競(jìng)賽還是對(duì)工業(yè)預(yù)測(cè)性維護(hù)、時(shí)序數(shù)據(jù)分析感興趣相信都能從中獲得直接的啟發(fā)和可復(fù)用的代碼。2. 解題總覽從問題定義到技術(shù)路線圖面對(duì)“儀器故障智能診斷”這樣一個(gè)開放性問題第一步也是最關(guān)鍵的一步就是明確我們要解決的具體是什么問題。組委會(huì)提供的數(shù)據(jù)通常是一個(gè)包含多個(gè)csv文件的數(shù)據(jù)包每個(gè)文件可能對(duì)應(yīng)一臺(tái)設(shè)備、一段時(shí)間內(nèi)的運(yùn)行數(shù)據(jù)或者不同故障模式下的樣本。列通常包括時(shí)間戳、若干傳感器通道如acc_x,acc_y,temp,pressure等以及一個(gè)label或fault_type列在訓(xùn)練集中。我們的目標(biāo)可以拆解為三個(gè)層次故障檢測(cè)判斷設(shè)備在某個(gè)時(shí)間窗口內(nèi)是否發(fā)生了故障二分類正常 vs 異常。故障識(shí)別如果發(fā)生故障具體是哪種類型多分類如軸承內(nèi)圈故障、外圈故障、齒輪磨損等。故障程度評(píng)估量化故障的嚴(yán)重性回歸或有序分類如輕微、中等、嚴(yán)重。技術(shù)路線上我們沒有押寶單一模型而是設(shè)計(jì)了一個(gè)分階段的流水線Pipeline這樣既能保證基礎(chǔ)模型的穩(wěn)健性又能利用深度模型挖掘深層特征。整體流程如下原始時(shí)序數(shù)據(jù) - 數(shù)據(jù)預(yù)處理與清洗 - 時(shí)域/頻域/時(shí)頻域特征提取 - 特征選擇 - (路徑A)傳統(tǒng)機(jī)器學(xué)習(xí)模型 - (路徑B)深度學(xué)習(xí)模型 - 模型融合與決策 - 結(jié)果輸出與可視化這個(gè)雙路徑設(shè)計(jì)是我們的核心策略。路徑A傳統(tǒng)機(jī)器學(xué)習(xí)依賴精心設(shè)計(jì)的特征工程模型如XGBoost、LightGBM解釋性強(qiáng)訓(xùn)練快。路徑B深度學(xué)習(xí)如1D-CNN、LSTM能自動(dòng)學(xué)習(xí)特征對(duì)原始數(shù)據(jù)中的復(fù)雜模式捕捉能力更強(qiáng)。兩者優(yōu)勢(shì)互補(bǔ)通過加權(quán)投票或堆疊Stacking方式融合最終診斷的魯棒性和準(zhǔn)確性顯著提升。3. 數(shù)據(jù)預(yù)處理為模型提供“干凈”的燃料原始工業(yè)傳感器數(shù)據(jù)幾乎不可能是完美無缺的。直接建模等于讓模型在噪音中學(xué)習(xí)事倍功半。我們的預(yù)處理步驟主要解決以下四個(gè)問題3.1 缺失值與異常值處理傳感器可能短暫失靈產(chǎn)生NaN或明顯超出物理量程的異常值。import pandas as pd import numpy as np def handle_missing_and_outliers(df, sensor_columns): 處理缺失值和基于標(biāo)準(zhǔn)差/分位數(shù)的異常值。 df: 包含傳感器數(shù)據(jù)的DataFrame sensor_columns: 傳感器列名的列表 df_filled df.copy() # 1. 缺失值處理對(duì)于時(shí)間序列用前后時(shí)刻的均值填充更合理 for col in sensor_columns: df_filled[col] df_filled[col].interpolate(methodlinear) # 線性插值 # 如果開頭或結(jié)尾還有NaN用最近的有效值填充 df_filled[col] df_filled[col].fillna(methodbfill).fillna(methodffill) # 2. 異常值處理使用基于IQR四分位距的方法 for col in sensor_columns: Q1 df_filled[col].quantile(0.25) Q3 df_filled[col].quantile(0.75) IQR Q3 - Q1 lower_bound Q1 - 1.5 * IQR upper_bound Q3 1.5 * IQR # 將超出邊界的值替換為邊界值或視為缺失值再填充 df_filled[col] np.where((df_filled[col] lower_bound) | (df_filled[col] upper_bound), np.nan, df_filled[col]) # 再次填充因異常值替換產(chǎn)生的NaN df_filled[col] df_filled[col].interpolate(methodlinear).fillna(methodbfill).fillna(methodffill) return df_filled注意對(duì)于高頻振動(dòng)信號(hào)簡(jiǎn)單的插值可能會(huì)引入虛假頻率成分。在要求極高的場(chǎng)景下需要考慮更專業(yè)的信號(hào)處理方法如基于模型預(yù)測(cè)的插值。但在數(shù)學(xué)建模的有限時(shí)間內(nèi)IQR插值是穩(wěn)健且高效的選擇。3.2 數(shù)據(jù)標(biāo)準(zhǔn)化與平滑不同傳感器量綱和量級(jí)差異巨大例如加速度單位是g溫度是攝氏度。必須進(jìn)行標(biāo)準(zhǔn)化防止量級(jí)大的特征主導(dǎo)模型。我們通常使用StandardScaler減去均值除以標(biāo)準(zhǔn)差因?yàn)樗鼙A魯?shù)據(jù)的分布形狀對(duì)后續(xù)的PCA等線性變換友好。同時(shí)為了抑制高頻噪聲可以對(duì)信號(hào)進(jìn)行滑動(dòng)平均濾波。from sklearn.preprocessing import StandardScaler def normalize_and_smooth(df, sensor_columns, window_size5): 標(biāo)準(zhǔn)化并應(yīng)用簡(jiǎn)單的移動(dòng)平均平滑。 window_size: 滑動(dòng)窗口大小需為奇數(shù)。 df_processed df.copy() scaler StandardScaler() # 先平滑再標(biāo)準(zhǔn)化順序有時(shí)有影響可根據(jù)實(shí)驗(yàn)調(diào)整 for col in sensor_columns: # 滑動(dòng)平均平滑 df_processed[col] df_processed[col].rolling(windowwindow_size, centerTrue, min_periods1).mean() # 標(biāo)準(zhǔn)化 df_processed[sensor_columns] scaler.fit_transform(df_processed[sensor_columns]) # 保存scaler用于后續(xù)的測(cè)試數(shù)據(jù)轉(zhuǎn)換 return df_processed, scaler3.3 樣本切片與標(biāo)簽對(duì)齊原始數(shù)據(jù)是長(zhǎng)序列但我們需要將其切割成固定長(zhǎng)度的時(shí)間窗口作為模型的一個(gè)個(gè)“樣本”。這里的關(guān)鍵是標(biāo)簽對(duì)齊一個(gè)時(shí)間窗口對(duì)應(yīng)一個(gè)故障標(biāo)簽。通常我們假設(shè)在一個(gè)短時(shí)間窗口內(nèi)故障類型是穩(wěn)定的。采用滑動(dòng)窗口方法進(jìn)行切片并可以設(shè)置重疊overlap以增加樣本量。def create_samples(data_sequence, labels, window_size, step_size): 將長(zhǎng)序列切割成重疊的時(shí)間窗口樣本。 data_sequence: 形狀為 (n_timesteps, n_features) 的傳感器數(shù)據(jù)數(shù)組 labels: 形狀為 (n_timesteps,) 的標(biāo)簽數(shù)組每個(gè)時(shí)間點(diǎn)一個(gè)標(biāo)簽 window_size: 窗口長(zhǎng)度時(shí)間步數(shù) step_size: 滑動(dòng)步長(zhǎng) X, y [], [] n_samples len(data_sequence) for start in range(0, n_samples - window_size 1, step_size): end start window_size X.append(data_sequence[start:end]) # 取窗口內(nèi)最主要的標(biāo)簽作為該樣本的標(biāo)簽對(duì)于分類問題 window_labels labels[start:end] from scipy.stats import mode label, _ mode(window_labels, keepdimsFalse) y.append(label) return np.array(X), np.array(y)實(shí)操心得window_size和step_size是超參數(shù)。window_size要足夠長(zhǎng)以包含故障特征周期可通過分析故障頻率初步估算但太長(zhǎng)會(huì)混入不同狀態(tài)的信息。step_size小于window_size會(huì)產(chǎn)生重疊樣本能有效增加數(shù)據(jù)量防止切割時(shí)恰好切掉關(guān)鍵特征但也會(huì)引入樣本相關(guān)性。我們通常設(shè)置重疊率為50%。4. 特征工程從原始信號(hào)中“榨取”信息這是傳統(tǒng)機(jī)器學(xué)習(xí)路徑路徑A的成敗關(guān)鍵。好的特征應(yīng)該對(duì)故障敏感同時(shí)對(duì)工況變化如轉(zhuǎn)速、負(fù)載相對(duì)魯棒。我們從三個(gè)域進(jìn)行特征提取4.1 時(shí)域特征直接從時(shí)間序列的幅值統(tǒng)計(jì)信息中提取計(jì)算簡(jiǎn)單物理意義明確。import numpy as np from scipy import stats def extract_time_domain_features(signal): 提取單個(gè)傳感器通道在一個(gè)時(shí)間窗口內(nèi)的時(shí)域特征。 features {} features[mean] np.mean(signal) features[std] np.std(signal) features[rms] np.sqrt(np.mean(signal**2)) # 均方根值反映能量 features[peak] np.max(np.abs(signal)) # 峰值 features[skewness] stats.skew(signal) # 偏度衡量分布不對(duì)稱性 features[kurtosis] stats.kurtosis(signal) # 峰度衡量分布尖銳程度 features[crest_factor] features[peak] / features[rms] if features[rms] ! 0 else 0 # 峰值因子 features[clearance_factor] features[peak] / (np.mean(np.sqrt(np.abs(signal)))**2) if np.mean(np.sqrt(np.abs(signal))) ! 0 else 0 # 裕度因子 # 還可以增加波形因子、脈沖因子等 return features4.2 頻域特征故障常常在振動(dòng)信號(hào)的頻譜中表現(xiàn)出特定的頻率成分如軸承的故障特征頻率。通過快速傅里葉變換FFT將信號(hào)轉(zhuǎn)換到頻域。from scipy.fft import fft, fftfreq def extract_freq_domain_features(signal, sampling_rate): 提取頻域特征。 signal: 時(shí)間窗口信號(hào) sampling_rate: 采樣頻率 (Hz) n len(signal) yf fft(signal) # 取單邊頻譜 yf_abs 2.0/n * np.abs(yf[:n//2]) xf fftfreq(n, 1/sampling_rate)[:n//2] features {} features[dominant_freq] xf[np.argmax(yf_abs)] # 主頻 features[dominant_amp] np.max(yf_abs) # 主頻幅值 # 計(jì)算頻譜重心、均方頻率、頻率方差等 features[spectral_centroid] np.sum(xf * yf_abs) / np.sum(yf_abs) if np.sum(yf_abs) ! 0 else 0 features[spectral_rms] np.sqrt(np.sum((xf**2) * yf_abs) / np.sum(yf_abs)) if np.sum(yf_abs) ! 0 else 0 # 可以計(jì)算特定頻帶如故障特征頻率附近的能量占比 return features4.3 時(shí)頻域特征對(duì)于非平穩(wěn)信號(hào)即統(tǒng)計(jì)特性隨時(shí)間變化的信號(hào)單純的頻域分析會(huì)丟失時(shí)間信息。短時(shí)傅里葉變換STFT或小波變換能提供聯(lián)合時(shí)頻信息。我們常用小波包變換WPT因?yàn)樗軐?duì)高頻部分進(jìn)行更精細(xì)的分解適合提取故障引起的瞬態(tài)沖擊特征。import pywt # 需要安裝PyWavelets def extract_wavelet_features(signal, waveletdb4, level3): 進(jìn)行小波包分解并計(jì)算各節(jié)點(diǎn)子頻帶的能量作為特征。 wp pywt.WaveletPacket(datasignal, waveletwavelet, modesymmetric, maxlevellevel) # 獲取第level層所有節(jié)點(diǎn)的名稱如 aaa, aad, ada, ... nodes [node.path for node in wp.get_level(level, natural)] energy_features [] for node_name in nodes: node_coeffs wp[node_name].data node_energy np.sum(node_coeffs**2) energy_features.append(node_energy) # 通常將能量歸一化構(gòu)成能量分布向量 total_energy np.sum(energy_features) energy_features_norm [e/total_energy for e in energy_features] if total_energy ! 0 else energy_features return energy_features_norm將所有傳感器通道、所有域的特征拼接起來會(huì)得到一個(gè)高維特征向量。接下來必須進(jìn)行特征選擇去除冗余和無關(guān)特征防止“維數(shù)災(zāi)難”。我們使用了基于樹模型如XGBoost的特征重要性排序結(jié)合遞歸特征消除RFE來選擇Top-N個(gè)最重要的特征。5. 模型構(gòu)建雙路徑融合策略5.1 路徑A基于特征工程的機(jī)器學(xué)習(xí)模型我們選擇了LightGBM作為主力模型。它訓(xùn)練速度快對(duì)類別不平衡有一定處理能力并且能輸出特征重要性與我們的特征工程流程完美契合。import lightgbm as lgb from sklearn.model_selection import train_test_split, StratifiedKFold from sklearn.metrics import accuracy_score, classification_report, confusion_matrix def train_lightgbm(X_features, y, paramsNone): X_features: 特征工程后得到的特征矩陣 (n_samples, n_features) y: 標(biāo)簽 if params is None: params { objective: multiclass, # 多分類 num_class: len(np.unique(y)), metric: multi_logloss, boosting_type: gbdt, num_leaves: 31, learning_rate: 0.05, feature_fraction: 0.9, bagging_fraction: 0.8, bagging_freq: 5, verbose: -1, seed: 42 } # 劃分訓(xùn)練集和驗(yàn)證集 X_train, X_val, y_train, y_val train_test_split(X_features, y, test_size0.2, stratifyy, random_state42) # 創(chuàng)建Dataset train_data lgb.Dataset(X_train, labely_train) val_data lgb.Dataset(X_val, labely_val, referencetrain_data) # 訓(xùn)練使用早停法防止過擬合 model lgb.train(params, train_data, valid_sets[val_data], num_boost_round1000, callbacks[lgb.early_stopping(stopping_rounds50), lgb.log_evaluation(period100)]) # 驗(yàn)證集評(píng)估 y_pred model.predict(X_val, num_iterationmodel.best_iteration) y_pred_class np.argmax(y_pred, axis1) print(fValidation Accuracy: {accuracy_score(y_val, y_pred_class):.4f}) print(classification_report(y_val, y_pred_class)) # 可視化特征重要性 lgb.plot_importance(model, max_num_features20, figsize(10,6)) return model5.2 路徑B基于原始信號(hào)的深度學(xué)習(xí)模型我們?cè)O(shè)計(jì)了一個(gè)結(jié)合1D-CNN和LSTM的混合網(wǎng)絡(luò)。CNN擅長(zhǎng)提取局部空間特征如振動(dòng)信號(hào)中的沖擊波形LSTM擅長(zhǎng)捕捉時(shí)間依賴關(guān)系。模型直接輸入標(biāo)準(zhǔn)化后的原始時(shí)序窗口數(shù)據(jù)(window_size, n_sensors)。import tensorflow as tf from tensorflow.keras import layers, models, callbacks def build_hybrid_cnn_lstm(input_shape, num_classes): 構(gòu)建1D-CNN LSTM混合模型。 input_shape: (window_size, n_sensors) model models.Sequential([ # 第一部分1D-CNN 提取局部特征 layers.Input(shapeinput_shape), layers.Conv1D(filters64, kernel_size3, activationrelu, paddingsame), layers.BatchNormalization(), layers.MaxPooling1D(pool_size2), layers.Conv1D(filters128, kernel_size3, activationrelu, paddingsame), layers.BatchNormalization(), layers.MaxPooling1D(pool_size2), layers.Dropout(0.3), # 第二部分LSTM 捕捉時(shí)序依賴 # 將CNN輸出的序列輸入到LSTM。return_sequencesTrue表示輸出每個(gè)時(shí)間步的狀態(tài)。 layers.LSTM(units64, return_sequencesTrue), layers.Dropout(0.3), layers.LSTM(units32), layers.Dropout(0.3), # 第三部分全連接層分類 layers.Dense(units64, activationrelu), layers.Dense(unitsnum_classes, activationsoftmax) ]) model.compile(optimizertf.keras.optimizers.Adam(learning_rate0.001), losssparse_categorical_crossentropy, metrics[accuracy]) model.summary() return model # 訓(xùn)練深度學(xué)習(xí)模型 def train_deep_model(model, X_train_seq, y_train, X_val_seq, y_val, epochs50): X_train_seq: 原始序列樣本形狀 (n_samples, window_size, n_sensors) early_stopping callbacks.EarlyStopping(monitorval_loss, patience10, restore_best_weightsTrue) reduce_lr callbacks.ReduceLROnPlateau(monitorval_loss, factor0.5, patience5, min_lr1e-6) history model.fit(X_train_seq, y_train, validation_data(X_val_seq, y_val), epochsepochs, batch_size32, callbacks[early_stopping, reduce_lr], verbose1) return model, history踩坑實(shí)錄直接訓(xùn)練這個(gè)混合網(wǎng)絡(luò)很容易過擬合尤其是在數(shù)據(jù)量有限的情況下。我們采用了強(qiáng)力的正則化策略除了網(wǎng)絡(luò)結(jié)構(gòu)中的Dropout和BatchNorm還在數(shù)據(jù)上做了隨機(jī)縮放、添加高斯噪聲、時(shí)間軸輕微扭曲等數(shù)據(jù)增強(qiáng)顯著提升了模型的泛化能力。另外LSTM層對(duì)輸入數(shù)據(jù)的標(biāo)準(zhǔn)化非常敏感務(wù)必確保輸入數(shù)據(jù)已標(biāo)準(zhǔn)化。5.3 模型融合112的策略我們采用了加權(quán)投票法進(jìn)行融合。兩個(gè)模型在驗(yàn)證集上的準(zhǔn)確率作為其權(quán)重的基礎(chǔ)。def weighted_ensemble_predict(model_lgb, model_dl, X_feat, X_seq, weightsNone): 加權(quán)投票融合。 model_lgb: LightGBM模型輸入特征工程后的數(shù)據(jù)X_feat model_dl: 深度學(xué)習(xí)模型輸入原始序列數(shù)據(jù)X_seq weights: 兩個(gè)模型的權(quán)重列表如 [0.4, 0.6]。默認(rèn)為None則根據(jù)驗(yàn)證集準(zhǔn)確率自動(dòng)計(jì)算。 proba_lgb model_lgb.predict(X_feat, num_iterationmodel_lgb.best_iteration) # 已經(jīng)是概率形式 proba_dl model_dl.predict(X_seq) if weights is None: # 這里假設(shè)我們已經(jīng)有了兩個(gè)模型在某個(gè)驗(yàn)證集上的準(zhǔn)確率 acc_lgb, acc_dl # 例如acc_lgb 0.92, acc_dl 0.94 acc_lgb, acc_dl 0.92, 0.94 total_acc acc_lgb acc_dl weights [acc_lgb/total_acc, acc_dl/total_acc] # 加權(quán)平均概率 weighted_proba weights[0] * proba_lgb weights[1] * proba_dl final_pred np.argmax(weighted_proba, axis1) return final_pred, weighted_proba融合后我們?cè)跍y(cè)試集上的準(zhǔn)確率比單一的最佳模型通常是深度學(xué)習(xí)模型提升了約1-2個(gè)百分點(diǎn)更重要的是對(duì)于某些單一模型容易混淆的故障類別融合模型的判斷更加穩(wěn)定。6. 故障嚴(yán)重程度評(píng)估與結(jié)果可視化對(duì)于故障程度評(píng)估我們將其建模為一個(gè)**有序分類Ordinal Regression**問題而不是簡(jiǎn)單的多分類或回歸。因?yàn)椤拜p微”、“中等”、“嚴(yán)重”之間存在明確的順序關(guān)系。我們使用了“序數(shù)邏輯回歸”的思想將其轉(zhuǎn)化為多個(gè)二分類問題例如模型1區(qū)分“無/輕微” vs “中等/嚴(yán)重”模型2區(qū)分“無/輕微/中等” vs “嚴(yán)重”或者直接使用支持有序分類的損失函數(shù)如CORAL損失函數(shù)在神經(jīng)網(wǎng)絡(luò)中的實(shí)現(xiàn)。結(jié)果可視化對(duì)于診斷系統(tǒng)的可解釋性至關(guān)重要。我們主要做了以下幾類圖混淆矩陣熱力圖清晰展示模型在各類別上的混淆情況。特征重要性條形圖從LightGBM模型獲取告訴我們哪些傳感器、哪些特征對(duì)診斷貢獻(xiàn)最大這對(duì)于后續(xù)的傳感器優(yōu)化布置有指導(dǎo)意義。t-SNE/PCA降維圖將高維特征或深度學(xué)習(xí)模型最后一層隱藏層的輸出降到2維或3維進(jìn)行可視化觀察不同故障類別的樣本在特征空間是否能夠被良好區(qū)分。關(guān)鍵傳感器信號(hào)對(duì)比圖將正常狀態(tài)和不同故障狀態(tài)下的關(guān)鍵傳感器如振動(dòng)最大的那個(gè)原始信號(hào)或頻譜圖畫在一起直觀展示故障特征。import matplotlib.pyplot as plt import seaborn as sns from sklearn.manifold import TSNE def visualize_tsne(features, labels, titlet-SNE Visualization of Features): 使用t-SNE對(duì)高維特征進(jìn)行降維可視化。 tsne TSNE(n_components2, random_state42, perplexity30) features_2d tsne.fit_transform(features) plt.figure(figsize(10,8)) scatter plt.scatter(features_2d[:,0], features_2d[:,1], clabels, cmaptab20, alpha0.7, s10) plt.colorbar(scatter) plt.title(title) plt.xlabel(t-SNE Component 1) plt.ylabel(t-SNE Component 2) plt.tight_layout() plt.show()7. 參賽總結(jié)與可復(fù)現(xiàn)性建議回顧整個(gè)項(xiàng)目拿到一等獎(jiǎng)的關(guān)鍵在于系統(tǒng)性的問題拆解和務(wù)實(shí)的技術(shù)選型。我們沒有追求最花哨的模型而是確保數(shù)據(jù)預(yù)處理、特征工程、基礎(chǔ)模型訓(xùn)練每個(gè)環(huán)節(jié)都扎實(shí)可靠最后用融合策略提升天花板。有幾個(gè)特別重要的點(diǎn)想分享關(guān)于數(shù)據(jù)數(shù)學(xué)建模競(jìng)賽給的數(shù)據(jù)往往“不完美”可能存在標(biāo)簽噪聲、傳感器漂移等問題。我們花了近三分之一的時(shí)間在數(shù)據(jù)探索和清洗上這是后續(xù)所有工作的基石。可視化每一類故障的典型信號(hào)波形和頻譜能建立直觀認(rèn)識(shí)甚至能發(fā)現(xiàn)數(shù)據(jù)本身可能存在的問題。關(guān)于特征時(shí)域、頻域、時(shí)頻域特征各有千秋。對(duì)于周期性明顯的故障如軸承頻域特征非常有效對(duì)于瞬態(tài)沖擊故障如齒輪斷齒小波包能量特征可能更好。不要盲目堆砌特征一定要結(jié)合特征重要性分析進(jìn)行篩選。關(guān)于模型LightGBM這類樹模型對(duì)特征工程的質(zhì)量要求高但訓(xùn)練快、調(diào)參相對(duì)簡(jiǎn)單、解釋性強(qiáng)非常適合作為基線模型和提供特征重要性。深度學(xué)習(xí)模型潛力大但依賴大量數(shù)據(jù)和高超的調(diào)參技巧防止過擬合。雙路徑并行的策略讓我們?cè)谟邢迺r(shí)間內(nèi)既能有一個(gè)穩(wěn)健的保底方案又能沖擊更高的性能。關(guān)于代碼在競(jìng)賽中代碼的可復(fù)現(xiàn)性和模塊化至關(guān)重要。我們將整個(gè)流程封裝成多個(gè)函數(shù)和類數(shù)據(jù)加載、預(yù)處理、特征提取、模型訓(xùn)練、評(píng)估可視化使得調(diào)整參數(shù)、更換模型、交叉驗(yàn)證變得非常方便。最終提交的論文中清晰的流程圖和核心代碼片段也是加分項(xiàng)。如果你想在自己的項(xiàng)目或未來的競(jìng)賽中復(fù)現(xiàn)這套方法我的建議是從理解數(shù)據(jù)開始畫出數(shù)據(jù)分布聽聽“數(shù)據(jù)的聲音”。先搭建一個(gè)簡(jiǎn)單的基線系統(tǒng)比如只用時(shí)域特征LightGBM確保整個(gè)Pipeline能跑通。迭代優(yōu)化在此基礎(chǔ)上逐步加入頻域特征、嘗試深度學(xué)習(xí)模型、調(diào)整融合策略。每次只改變一個(gè)變量評(píng)估其效果。重視驗(yàn)證策略使用分層K折交叉驗(yàn)證來更穩(wěn)健地評(píng)估模型性能避免因?yàn)閿?shù)據(jù)劃分的偶然性導(dǎo)致過擬合。這個(gè)項(xiàng)目讓我深刻體會(huì)到解決一個(gè)復(fù)雜的工程問題往往不是靠一個(gè)“銀彈”算法而是靠對(duì)問題的深刻理解、扎實(shí)的基礎(chǔ)工作以及將多種工具巧妙組合的系統(tǒng)性思維。希望這份詳細(xì)的總結(jié)和代碼能為你打開一扇門助你在智能診斷或相關(guān)的數(shù)據(jù)科學(xué)道路上走得更遠(yuǎn)。