戰(zhàn):從信號(hào)處理到模型性能提升)
在實(shí)際科研和工程實(shí)踐中將頻域分析與特征融合技術(shù)結(jié)合是提升模型性能、沖擊高水平學(xué)術(shù)期刊如1區(qū)TOP期刊的有效策略。許多研究生在開(kāi)展相關(guān)工作時(shí)常常面臨幾個(gè)核心痛點(diǎn)如何將時(shí)域信號(hào)有效地轉(zhuǎn)換到頻域轉(zhuǎn)換后哪些頻域特征具有區(qū)分度如何將時(shí)域、頻域乃至其他域的特征進(jìn)行有效融合而非簡(jiǎn)單拼接融合后的特征又如何輸入到下游分類(lèi)或回歸模型中本文將圍繞“頻域分析特征融合”這一技術(shù)主線以一個(gè)具體的故障診斷或生理信號(hào)分類(lèi)場(chǎng)景為例手把手帶你從數(shù)據(jù)預(yù)處理開(kāi)始完成特征提取、融合策略設(shè)計(jì)、模型構(gòu)建與結(jié)果驗(yàn)證的全流程并深入探討其中的關(guān)鍵參數(shù)、常見(jiàn)陷阱與優(yōu)化方向。無(wú)論你是計(jì)算機(jī)、生物醫(yī)學(xué)工程還是機(jī)械故障預(yù)測(cè)方向的研究生這套方法都能為你的論文核心創(chuàng)新點(diǎn)提供扎實(shí)的技術(shù)實(shí)現(xiàn)路徑。1. 理解頻域分析與特征融合的核心價(jià)值在開(kāi)始代碼之前必須厘清基本概念和設(shè)計(jì)動(dòng)機(jī)這是決定后續(xù)工作能否達(dá)到預(yù)期效果的基礎(chǔ)。1.1 為什么需要頻域分析時(shí)域信號(hào)直接反映了觀測(cè)值隨時(shí)間的變化但很多關(guān)鍵信息如周期性、共振頻率、能量分布在時(shí)域中并不直觀。例如一臺(tái)旋轉(zhuǎn)機(jī)械的振動(dòng)信號(hào)時(shí)域波形可能只是雜亂無(wú)章的波動(dòng)但通過(guò)傅里葉變換FFT轉(zhuǎn)換到頻域后可以清晰地看到在特定轉(zhuǎn)速對(duì)應(yīng)的頻率點(diǎn)出現(xiàn)能量峰值這很可能就是故障特征頻率。頻域分析的核心目的是從另一個(gè)維度揭示信號(hào)的內(nèi)在結(jié)構(gòu)。常用的變換方法包括快速傅里葉變換FFT最常用將信號(hào)分解為不同頻率的正弦波得到幅度譜和相位譜。短時(shí)傅里葉變換STFT適用于非平穩(wěn)信號(hào)能獲得信號(hào)頻率隨時(shí)間的變化情況得到時(shí)頻譜圖。小波變換Wavelet Transform在時(shí)域和頻域都具有良好的局部化性質(zhì)適合分析瞬態(tài)、突變信號(hào)。選擇哪種方法取決于你的信號(hào)特性平穩(wěn)/非平穩(wěn)以及你關(guān)心的特征是全局頻率分布還是時(shí)變頻率特性。1.2 特征融合的本質(zhì)與層次特征融合不是簡(jiǎn)單地將時(shí)域特征數(shù)組和頻域特征數(shù)組在維度上連接Concatenate。盲目的拼接會(huì)導(dǎo)致特征空間維度爆炸、引入大量冗余甚至噪聲反而降低模型性能。有效的特征融合應(yīng)當(dāng)是有設(shè)計(jì)的、層次化的信息整合數(shù)據(jù)級(jí)融合最底層直接對(duì)原始數(shù)據(jù)進(jìn)行融合如多傳感器數(shù)據(jù)對(duì)齊后融合本例中不常用。特征級(jí)融合我們討論的重點(diǎn)。分別從時(shí)域、頻域甚至?xí)r頻域提取特征后通過(guò)策略進(jìn)行融合。關(guān)鍵在于特征選擇與降維。決策級(jí)融合分別用不同特征訓(xùn)練模型再對(duì)多個(gè)模型的預(yù)測(cè)結(jié)果進(jìn)行綜合如投票、加權(quán)平均。這屬于模型集成范疇。本文聚焦于特征級(jí)融合。其核心挑戰(zhàn)在于如何保證融合后的特征集既能保留各原始特征域的有效信息又能剔除冗余形成更具判別力的新特征表示。2. 環(huán)境準(zhǔn)備與項(xiàng)目結(jié)構(gòu)我們以一個(gè)公開(kāi)數(shù)據(jù)集為例例如凱斯西儲(chǔ)大學(xué)CWRU的軸承故障數(shù)據(jù)集這是一個(gè)經(jīng)典的故障診斷基準(zhǔn)數(shù)據(jù)集。你也可以替換為自己的心電ECG、腦電EEG或振動(dòng)信號(hào)數(shù)據(jù)。2.1 軟件環(huán)境與依賴庫(kù)確保你的Python環(huán)境包含以下核心庫(kù)。建議使用Anaconda創(chuàng)建獨(dú)立的虛擬環(huán)境。# 創(chuàng)建并激活環(huán)境 (可選) conda create -n frequency_fusion python3.8 conda activate frequency_fusion # 安裝核心依賴 pip install numpy scipy pandas matplotlib seaborn pip install scikit-learn # 用于特征處理與機(jī)器學(xué)習(xí)模型 pip install pywt # 用于小波變換 pip install tsfresh # 用于自動(dòng)提取大量時(shí)域特征 (可選但強(qiáng)大) # 如果使用深度學(xué)習(xí)模型 pip install torch # 或 pip install tensorflow keras2.2 項(xiàng)目目錄結(jié)構(gòu)建議一個(gè)清晰的結(jié)構(gòu)有助于管理代碼、數(shù)據(jù)和實(shí)驗(yàn)記錄。frequency_feature_fusion_project/ │ ├── data/ │ ├── raw/ # 存放原始數(shù)據(jù) │ ├── processed/ # 存放處理后的數(shù)據(jù)分段、濾波后 │ └── features/ # 存放提取出的特征文件(.csv, .npy) │ ├── src/ │ ├── data_preprocessing.py # 數(shù)據(jù)加載、分段、標(biāo)準(zhǔn)化 │ ├── feature_extraction.py # 時(shí)域、頻域特征提取函數(shù) │ ├── feature_fusion.py # 特征融合策略實(shí)現(xiàn) │ ├── model.py # 機(jī)器學(xué)習(xí)或深度學(xué)習(xí)模型定義 │ └── utils.py # 工具函數(shù)繪圖、評(píng)估等 │ ├── notebooks/ │ └── exploratory_analysis.ipynb # 用于數(shù)據(jù)探索和實(shí)驗(yàn) │ ├── configs/ │ └── params.yaml # 超參數(shù)配置文件可選 │ ├── outputs/ │ ├── figures/ # 保存生成的圖表 │ └── results/ # 保存模型評(píng)估結(jié)果 │ └── main.py # 主程序入口3. 從原始信號(hào)到特征矩陣完整流程實(shí)現(xiàn)本節(jié)將分步實(shí)現(xiàn)一個(gè)完整的流程。我們假設(shè)你已經(jīng)將CWRU數(shù)據(jù)下載到data/raw/目錄下并已按故障類(lèi)型和負(fù)載整理了文件。3.1 數(shù)據(jù)預(yù)處理與分段原始振動(dòng)信號(hào)通常很長(zhǎng)需要被分割成多個(gè)固定長(zhǎng)度的樣本樣本窗口每個(gè)樣本對(duì)應(yīng)一個(gè)標(biāo)簽如健康、內(nèi)圈故障、外圈故障。# src/data_preprocessing.py import numpy as np import pandas as pd from scipy import signal import os def load_and_segment_data(file_path, label, sample_length1024, overlap_ratio0.5): 加載數(shù)據(jù)文件并將其分割成固定長(zhǎng)度的小樣本。 參數(shù): file_path: 數(shù)據(jù)文件路徑。 label: 該文件對(duì)應(yīng)的類(lèi)別標(biāo)簽。 sample_length: 每個(gè)樣本的長(zhǎng)度如1024個(gè)點(diǎn)。 overlap_ratio: 重疊率0表示無(wú)重疊0.5表示50%重疊。 返回: samples: 樣本數(shù)組形狀為 (n_samples, sample_length)。 labels: 標(biāo)簽數(shù)組形狀為 (n_samples,)。 # 假設(shè)數(shù)據(jù)是單列文本文件 data np.loadtxt(file_path) step int(sample_length * (1 - overlap_ratio)) if step 0: step 1 n_samples (len(data) - sample_length) // step 1 samples np.zeros((n_samples, sample_length)) labels np.full(n_samples, label) for i in range(n_samples): start i * step end start sample_length samples[i] data[start:end] return samples, labels def normalize_samples(samples, methodz-score): 對(duì)樣本進(jìn)行歸一化消除量綱影響。 參數(shù): samples: 輸入樣本數(shù)組 (n_samples, n_points)。 method: 歸一化方法z-score標(biāo)準(zhǔn)化或 minmax歸一化。 返回: normalized_samples: 歸一化后的樣本。 if method z-score: mean np.mean(samples, axis1, keepdimsTrue) std np.std(samples, axis1, keepdimsTrue) std[std 0] 1 # 防止除零 return (samples - mean) / std elif method minmax: min_val np.min(samples, axis1, keepdimsTrue) max_val np.max(samples, axis1, keepdimsTrue) range_val max_val - min_val range_val[range_val 0] 1 return (samples - min_val) / range_val else: raise ValueError(歸一化方法必須是 z-score 或 minmax) # 示例批量處理一個(gè)文件夾的數(shù)據(jù) def process_data_folder(raw_data_dir, output_dir, sample_length1024): all_samples [] all_labels [] label_map {} # 可以映射故障類(lèi)型到數(shù)字標(biāo)簽 # 遍歷文件假設(shè)文件名包含了標(biāo)簽信息 for idx, filename in enumerate(os.listdir(raw_data_dir)): if filename.endswith(.txt): filepath os.path.join(raw_data_dir, filename) # 簡(jiǎn)單示例從文件名解析標(biāo)簽實(shí)際需根據(jù)數(shù)據(jù)集調(diào)整 if normal in filename: label 0 elif inner in filename: label 1 elif outer in filename: label 2 else: label 3 label_map[label] filename samples, labels load_and_segment_data(filepath, label, sample_length) samples normalize_samples(samples, methodz-score) all_samples.append(samples) all_labels.append(labels) # 合并所有數(shù)據(jù) X np.vstack(all_samples) y np.hstack(all_labels) # 保存處理后的數(shù)據(jù) np.save(os.path.join(output_dir, segmented_samples.npy), X) np.save(os.path.join(output_dir, segmented_labels.npy), y) print(f數(shù)據(jù)處理完成。樣本形狀{X.shape}標(biāo)簽形狀{y.shape}) return X, y, label_map關(guān)鍵解釋與檢查點(diǎn)樣本長(zhǎng)度 (sample_length)需根據(jù)信號(hào)特性選擇。太短可能丟失周期信息太長(zhǎng)則樣本數(shù)減少且包含過(guò)多無(wú)關(guān)信息。對(duì)于軸承故障1024或2048是常見(jiàn)起點(diǎn)。重疊率 (overlap_ratio)增加重疊可以生成更多樣本緩解數(shù)據(jù)不足但會(huì)導(dǎo)致樣本間相關(guān)性增強(qiáng)。通常設(shè)置在0到0.75之間。歸一化標(biāo)準(zhǔn)化Z-Score能消除信號(hào)絕對(duì)幅值的影響使模型更關(guān)注波形形狀和頻率成分在振動(dòng)信號(hào)處理中更常用。檢查點(diǎn)運(yùn)行后打印X.shape應(yīng)類(lèi)似(n_samples, 1024)。可視化幾個(gè)不同類(lèi)別的樣本觀察波形是否有肉眼可見(jiàn)的差異。3.2 時(shí)域特征提取時(shí)域特征計(jì)算簡(jiǎn)單物理意義明確。我們可以從每個(gè)樣本窗口中提取一組統(tǒng)計(jì)特征。# src/feature_extraction.py import numpy as np from scipy import stats def extract_time_domain_features(signal_segment): 從一個(gè)信號(hào)片段中提取時(shí)域統(tǒng)計(jì)特征。 參數(shù): signal_segment: 一維數(shù)組一個(gè)樣本的信號(hào)數(shù)據(jù)。 返回: features_dict: 包含時(shí)域特征的字典。 features {} # 有量綱指標(biāo) features[peak] np.max(np.abs(signal_segment)) features[peak_to_peak] np.ptp(signal_segment) # 峰峰值 features[mean] np.mean(signal_segment) features[std] np.std(signal_segment) # 標(biāo)準(zhǔn)差 features[rms] np.sqrt(np.mean(signal_segment**2)) # 均方根值 features[skewness] stats.skew(signal_segment) # 偏度 features[kurtosis] stats.kurtosis(signal_segment) # 峭度 # 無(wú)量綱指標(biāo) (對(duì)負(fù)載、轉(zhuǎn)速變化相對(duì)不敏感) 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_segment)))**2) if np.mean(np.sqrt(np.abs(signal_segment))) ! 0 else 0 # 裕度因子 features[shape_factor] features[rms] / np.mean(np.abs(signal_segment)) if np.mean(np.abs(signal_segment)) ! 0 else 0 # 波形因子 features[impulse_factor] features[peak] / np.mean(np.abs(signal_segment)) if np.mean(np.abs(signal_segment)) ! 0 else 0 # 脈沖因子 # 其他 features[energy] np.sum(signal_segment**2) return features # 批量提取 def batch_extract_time_features(samples): 批量提取時(shí)域特征。 參數(shù): samples: 樣本數(shù)組 (n_samples, n_points)。 返回: time_feature_matrix: 時(shí)域特征矩陣 (n_samples, n_time_features)。 time_feature_names: 時(shí)域特征名稱列表。 n_samples samples.shape[0] feature_list [] # 先提取一個(gè)樣本獲取特征名 sample_feat extract_time_domain_features(samples[0]) feature_names list(sample_feat.keys()) n_features len(feature_names) time_feature_matrix np.zeros((n_samples, n_features)) for i in range(n_samples): feat_dict extract_time_domain_features(samples[i]) time_feature_matrix[i] [feat_dict[name] for name in feature_names] return time_feature_matrix, feature_names3.3 頻域特征提取這是核心步驟。我們通過(guò)FFT獲取信號(hào)的頻譜再?gòu)念l譜中提取特征。# src/feature_extraction.py (續(xù)) def extract_frequency_domain_features(signal_segment, sampling_rate): 從一個(gè)信號(hào)片段中提取頻域特征。 假設(shè) signal_segment 已經(jīng)過(guò)預(yù)處理如去趨勢(shì)、加窗。 參數(shù): signal_segment: 一維數(shù)組。 sampling_rate: 信號(hào)的采樣頻率 (Hz)。 返回: features_dict: 包含頻域特征的字典。 features {} n len(signal_segment) # 執(zhí)行FFT fft_vals np.fft.fft(signal_segment) # 取絕對(duì)值得到幅度譜 fft_amp np.abs(fft_vals[:n//2]) # 取單邊譜 # 計(jì)算頻率軸 freqs np.fft.fftfreq(n, 1/sampling_rate)[:n//2] # 基本統(tǒng)計(jì)量 features[freq_mean] np.mean(fft_amp) features[freq_std] np.std(fft_amp) features[freq_rms] np.sqrt(np.mean(fft_amp**2)) # 頻譜重心 (Frequency Center) features[fc] np.sum(freqs * fft_amp) / np.sum(fft_amp) if np.sum(fft_amp) ! 0 else 0 # 均方頻率 (Mean Square Frequency) features[msf] np.sum((freqs**2) * fft_amp) / np.sum(fft_amp) if np.sum(fft_amp) ! 0 else 0 # 頻率方差 (Frequency Variance) features[freq_var] np.sum(((freqs - features[fc])**2) * fft_amp) / np.sum(fft_amp) if np.sum(fft_amp) ! 0 else 0 # 頻譜峰度與偏度 features[freq_skewness] stats.skew(fft_amp) features[freq_kurtosis] stats.kurtosis(fft_amp) # 頻帶能量比 (示例劃分低頻、中頻、高頻) total_energy np.sum(fft_amp**2) low_band_mask freqs sampling_rate * 0.25 # 假設(shè)低頻段為0-0.25倍采樣率 mid_band_mask (freqs sampling_rate * 0.25) (freqs sampling_rate * 0.5) high_band_mask freqs sampling_rate * 0.5 features[low_band_energy_ratio] np.sum(fft_amp[low_band_mask]**2) / total_energy if total_energy ! 0 else 0 features[mid_band_energy_ratio] np.sum(fft_amp[mid_band_mask]**2) / total_energy if total_energy ! 0 else 0 features[high_band_energy_ratio] np.sum(fft_amp[high_band_mask]**2) / total_energy if total_energy ! 0 else 0 # 主頻 (幅度最大的頻率) if len(fft_amp) 0: features[main_freq] freqs[np.argmax(fft_amp)] else: features[main_freq] 0 return features def batch_extract_freq_features(samples, sampling_rate): 批量提取頻域特征。 參數(shù): samples: 樣本數(shù)組 (n_samples, n_points)。 sampling_rate: 采樣頻率。 返回: freq_feature_matrix: 頻域特征矩陣 (n_samples, n_freq_features)。 freq_feature_names: 頻域特征名稱列表。 n_samples samples.shape[0] # 可選對(duì)每個(gè)樣本加窗減少頻譜泄漏 window np.hanning(samples.shape[1]) windowed_samples samples * window # 獲取特征名 sample_feat extract_frequency_domain_features(windowed_samples[0], sampling_rate) feature_names list(sample_feat.keys()) n_features len(feature_names) freq_feature_matrix np.zeros((n_samples, n_features)) for i in range(n_samples): feat_dict extract_frequency_domain_features(windowed_samples[i], sampling_rate) freq_feature_matrix[i] [feat_dict[name] for name in feature_names] return freq_feature_matrix, feature_names關(guān)鍵參數(shù)與解釋采樣頻率 (sampling_rate)必須準(zhǔn)確知道你的數(shù)據(jù)采樣頻率Hz這是頻域分析的基礎(chǔ)。CWRU數(shù)據(jù)通常為12kHz或48kHz。加窗直接對(duì)有限長(zhǎng)度信號(hào)做FFT會(huì)引入頻譜泄漏能量擴(kuò)散到其他頻率。乘以漢寧窗Hanning等窗函數(shù)可以緩解此問(wèn)題但會(huì)輕微降低頻率分辨率。對(duì)于初步分析加窗是推薦做法。頻帶劃分low_band_energy_ratio等特征需要根據(jù)先驗(yàn)知識(shí)劃分頻帶。例如軸承故障特征頻率通常位于中高頻。你可以根據(jù)故障特征頻率理論值來(lái)動(dòng)態(tài)劃分頻帶這比固定比例更有效。3.4 特征融合策略實(shí)現(xiàn)現(xiàn)在我們有time_feature_matrix(形狀: [n_samples, n_time_feat]) 和freq_feature_matrix(形狀: [n_samples, n_freq_feat])。簡(jiǎn)單的拼接是第一步但遠(yuǎn)非終點(diǎn)。# src/feature_fusion.py import numpy as np from sklearn.decomposition import PCA from sklearn.feature_selection import SelectKBest, f_classif from sklearn.preprocessing import StandardScaler def simple_concatenate(time_features, freq_features): 直接拼接時(shí)域和頻域特征。 fused_features np.concatenate([time_features, freq_features], axis1) print(f拼接后特征維度: {fused_features.shape}) return fused_features def weighted_fusion(time_features, freq_features, time_weight0.5, freq_weight0.5): 加權(quán)融合??梢詫?duì)不同特征域賦予不同權(quán)重但權(quán)重的選擇需要依據(jù)如基于特征重要性。 這里僅為示例實(shí)際中更推薦在特征選擇后對(duì)重要特征進(jìn)行加權(quán)。 # 首先分別標(biāo)準(zhǔn)化 scaler_t StandardScaler() scaler_f StandardScaler() time_norm scaler_t.fit_transform(time_features) freq_norm scaler_f.fit_transform(freq_features) fused_features time_weight * time_norm freq_weight * freq_norm return fused_features def pca_fusion(time_features, freq_features, n_components0.95): 先拼接再用PCA降維融合。PCA可以去除線性相關(guān)性保留主要信息。 參數(shù): n_components: 可以是整數(shù)指定維度或浮點(diǎn)數(shù)保留方差的百分比。 concatenated np.concatenate([time_features, freq_features], axis1) scaler StandardScaler() concatenated_scaled scaler.fit_transform(concatenated) pca PCA(n_componentsn_components) fused_features_pca pca.fit_transform(concatenated_scaled) print(fPCA融合后維度: {fused_features_pca.shape}解釋方差比: {np.sum(pca.explained_variance_ratio_):.4f}) return fused_features_pca, pca def selective_fusion_by_importance(time_features, freq_features, y, k20): 基于特征重要性如ANOVA F值進(jìn)行選擇性融合。 1. 拼接所有特征。 2. 計(jì)算每個(gè)特征與標(biāo)簽的相關(guān)性/重要性。 3. 選擇Top K個(gè)最重要的特征進(jìn)行融合。 concatenated np.concatenate([time_features, freq_features], axis1) scaler StandardScaler() concatenated_scaled scaler.fit_transform(concatenated) # 使用SelectKBest進(jìn)行特征選擇 selector SelectKBest(score_funcf_classif, kmin(k, concatenated_scaled.shape[1])) selected_features selector.fit_transform(concatenated_scaled, y) # 獲取被選中的特征索引和名稱需要傳入特征名列表 selected_indices selector.get_support(indicesTrue) print(f選擇了 {len(selected_indices)} 個(gè)最重要的特征。) return selected_features, selected_indices注意加權(quán)融合中的權(quán)重設(shè)置非常關(guān)鍵。隨意設(shè)置如0.5/0.5通常沒(méi)有理論依據(jù)。更好的做法是先分別用純時(shí)域和純頻域特征訓(xùn)練一個(gè)基線模型根據(jù)其性能或通過(guò)特征重要性分析如基于樹(shù)模型的特征重要性來(lái)動(dòng)態(tài)分配權(quán)重或者直接在融合后的特征上使用正則化模型如Lasso讓模型自動(dòng)學(xué)習(xí)特征權(quán)重。4. 模型訓(xùn)練、驗(yàn)證與結(jié)果分析特征融合完成后我們使用一個(gè)分類(lèi)器來(lái)驗(yàn)證融合特征的有效性。這里以經(jīng)典的隨機(jī)森林為例因?yàn)樗芴峁┨卣髦匾员阌谖覀兎治觥? main.py 或單獨(dú)的模型訓(xùn)練腳本 import numpy as np from sklearn.model_selection import train_test_split, cross_val_score from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import classification_report, confusion_matrix, accuracy_score import matplotlib.pyplot as plt import seaborn as sns # 假設(shè)我們已經(jīng)得到了融合后的特征矩陣 X_fused 和標(biāo)簽 y # X_fused, y load_your_fused_features_and_labels() # 1. 劃分訓(xùn)練集和測(cè)試集 X_train, X_test, y_train, y_test train_test_split(X_fused, y, test_size0.2, random_state42, stratifyy) # 2. 訓(xùn)練隨機(jī)森林分類(lèi)器 clf RandomForestClassifier(n_estimators100, random_state42, n_jobs-1) clf.fit(X_train, y_train) # 3. 在測(cè)試集上評(píng)估 y_pred clf.predict(X_test) accuracy accuracy_score(y_test, y_pred) print(f測(cè)試集準(zhǔn)確率: {accuracy:.4f}) print(\n分類(lèi)報(bào)告:) print(classification_report(y_test, y_pred, target_names[健康, 內(nèi)圈故障, 外圈故障])) # 根據(jù)你的標(biāo)簽調(diào)整 # 4. 繪制混淆矩陣 cm confusion_matrix(y_test, y_pred) plt.figure(figsize(8,6)) sns.heatmap(cm, annotTrue, fmtd, cmapBlues, xticklabels[健康, 內(nèi)圈故障, 外圈故障], yticklabels[健康, 內(nèi)圈故障, 外圈故障]) plt.ylabel(真實(shí)標(biāo)簽) plt.xlabel(預(yù)測(cè)標(biāo)簽) plt.title(混淆矩陣) plt.tight_layout() plt.savefig(outputs/figures/confusion_matrix.png) plt.show() # 5. 特征重要性分析 (如果特征維度可管理) if hasattr(clf, feature_importances_): importances clf.feature_importances_ # 你需要有一個(gè)特征名稱列表 feature_names_all # feature_names_all time_feature_names freq_feature_names indices np.argsort(importances)[::-1] plt.figure(figsize(10, 6)) plt.title(特征重要性 (Top 20)) plt.bar(range(20), importances[indices[:20]], aligncenter) plt.xticks(range(20), [feature_names_all[i] for i in indices[:20]], rotation45, haright) plt.tight_layout() plt.savefig(outputs/figures/feature_importance.png) plt.show()驗(yàn)證邏輯 為了證明“頻域特征融合”的有效性你需要進(jìn)行對(duì)比實(shí)驗(yàn)基線模型僅使用原始信號(hào)或僅時(shí)域特征訓(xùn)練模型記錄準(zhǔn)確率。頻域模型僅使用頻域特征訓(xùn)練模型記錄準(zhǔn)確率。融合模型使用你設(shè)計(jì)的融合特征訓(xùn)練模型記錄準(zhǔn)確率。分析融合模型的準(zhǔn)確率、精確率、召回率、F1-score是否顯著優(yōu)于前兩者混淆矩陣是否顯示某些難分類(lèi)別的性能得到了提升5. 常見(jiàn)問(wèn)題、陷阱與排查路徑在實(shí)際操作中你幾乎一定會(huì)遇到以下問(wèn)題。5.1 特征提取與融合階段的常見(jiàn)坑問(wèn)題現(xiàn)象可能原因檢查與解決方案頻域特征如fc,msf計(jì)算出現(xiàn)NaN或Inf頻譜幅度和np.sum(fft_amp)為零導(dǎo)致除零錯(cuò)誤。檢查原始信號(hào)是否全為零或常數(shù)。在除法前添加極小值eps或判斷分母是否為零。模型在訓(xùn)練集上表現(xiàn)完美在測(cè)試集上極差過(guò)擬合1. 特征維度太高樣本量太少。2. 使用了未來(lái)信息如用全局統(tǒng)計(jì)量做歸一化。3. 特征中存在數(shù)據(jù)泄露。1. 增加樣本量或使用PCA/LDA降維。2. 確保歸一化、PCA等操作僅在訓(xùn)練集上擬合然后轉(zhuǎn)換訓(xùn)練集和測(cè)試集。3. 重新檢查數(shù)據(jù)分割流程確保沒(méi)有穿越時(shí)間序列的依賴關(guān)系。融合后的模型性能反而下降1. 融合引入了大量冗余或噪聲特征。2. 時(shí)域和頻域特征尺度差異巨大簡(jiǎn)單拼接導(dǎo)致模型偏向大數(shù)值特征。3. 加權(quán)融合權(quán)重設(shè)置不合理。1. 使用特征選擇如SelectKBest, RFE篩選特征。2.必須進(jìn)行特征標(biāo)準(zhǔn)化如StandardScaler。3. 放棄固定權(quán)重采用基于模型的特征重要性或使用正則化。不同負(fù)載或工況下模型失效提取的特征對(duì)工況敏感如有量綱指標(biāo)。1. 優(yōu)先使用無(wú)量綱指標(biāo)如波形因子、脈沖因子。2. 考慮進(jìn)行工況歸一化或使用遷移學(xué)習(xí)、領(lǐng)域自適應(yīng)方法。5.2 結(jié)果分析與論文寫(xiě)作要點(diǎn)可復(fù)現(xiàn)性在論文中必須詳細(xì)說(shuō)明采樣頻率、樣本長(zhǎng)度、重疊率、具體的特征列表或公式、融合方法、分類(lèi)器及其超參數(shù)。最好公開(kāi)代碼和數(shù)據(jù)。統(tǒng)計(jì)顯著性不要只比較一次隨機(jī)劃分的準(zhǔn)確率。使用k折交叉驗(yàn)證并報(bào)告平均準(zhǔn)確率及標(biāo)準(zhǔn)差。進(jìn)行統(tǒng)計(jì)檢驗(yàn)如t-test來(lái)證明性能提升是顯著的??梢暬撐闹袘?yīng)有清晰的圖表。時(shí)域波形和頻譜圖對(duì)比健康 vs 故障。特征重要性排序圖。t-SNE或PCA降維后的特征分布圖展示融合后特征是否使不同類(lèi)別更易分離?;煜仃?。不同方法對(duì)比的柱狀圖帶誤差棒。消融實(shí)驗(yàn)這是沖擊高水平論文的關(guān)鍵。設(shè)計(jì)實(shí)驗(yàn)證明你提出的融合策略的每個(gè)部分都是有效的。例如實(shí)驗(yàn)A僅時(shí)域特征。實(shí)驗(yàn)B僅頻域特征。實(shí)驗(yàn)C時(shí)域頻域簡(jiǎn)單拼接。實(shí)驗(yàn)D時(shí)域頻域你設(shè)計(jì)的特征選擇/加權(quán)/PCA融合策略。 清晰展示從A到D的性能提升軌跡。6. 最佳實(shí)踐與擴(kuò)展方向6.1 工程與科研最佳實(shí)踐清單數(shù)據(jù)預(yù)處理清單[ ] 確認(rèn)采樣頻率和信號(hào)單位。[ ] 檢查并處理缺失值或異常點(diǎn)。[ ] 進(jìn)行必要的濾波如帶通濾波去除高頻噪聲和工頻干擾。[ ] 對(duì)信號(hào)進(jìn)行去趨勢(shì)處理scipy.signal.detrend。[ ] 確定合適的樣本長(zhǎng)度和重疊率并通過(guò)可視化確認(rèn)分段合理性。[ ] 在樣本級(jí)別進(jìn)行歸一化/標(biāo)準(zhǔn)化。特征工程清單[ ] 時(shí)域特征至少包含有量綱統(tǒng)計(jì)量均值、標(biāo)準(zhǔn)差、RMS和無(wú)量綱指標(biāo)峭度、峰值因子。[ ] 頻域特征必須包含頻譜重心、均方頻率、頻帶能量。嘗試計(jì)算包絡(luò)譜Hilbert變換后求頻譜以突出故障沖擊特征。[ ] 考慮時(shí)頻域特征如小波包能量熵這對(duì)非平穩(wěn)信號(hào)非常有效。[ ] 使用tsfresh庫(kù)自動(dòng)提取大量時(shí)域特征然后進(jìn)行過(guò)濾。融合與建模清單[ ]始終先做特征標(biāo)準(zhǔn)化再進(jìn)行融合或輸入模型。[ ] 優(yōu)先嘗試簡(jiǎn)單拼接PCA/特征選擇作為基線融合方法。[ ] 使用交叉驗(yàn)證評(píng)估模型避免單次劃分的偶然性。[ ] 記錄所有實(shí)驗(yàn)的超參數(shù)和結(jié)果使用工具如MLflow, WandB進(jìn)行管理。6.2 高級(jí)擴(kuò)展方向深度特征融合使用一維CNN自動(dòng)從原始時(shí)域信號(hào)中提取深層特征同時(shí)使用另一個(gè)分支從FFT頻譜中提取特征然后在中間層進(jìn)行融合如拼接、相加、注意力機(jī)制最后接全連接層分類(lèi)。這是當(dāng)前頂刊的主流做法。注意力機(jī)制在融合時(shí)不是平等對(duì)待所有特征。使用注意力網(wǎng)絡(luò)為不同特征或不同特征域分配權(quán)重讓模型聚焦于更重要的信息。多尺度特征在同一域內(nèi)如時(shí)域提取不同尺度的特征如不同滑動(dòng)窗口的統(tǒng)計(jì)量再進(jìn)行融合以捕獲不同時(shí)間粒度的模式。基于圖的特征融合將每個(gè)樣本的特征視為圖節(jié)點(diǎn)構(gòu)建特征關(guān)系圖利用圖神經(jīng)網(wǎng)絡(luò)GNN進(jìn)行信息傳播和融合。面向開(kāi)放集的融合不僅融合已知故障的特征還設(shè)計(jì)異常檢測(cè)機(jī)制用于發(fā)現(xiàn)訓(xùn)練集中未出現(xiàn)的故障類(lèi)型。從簡(jiǎn)單的時(shí)頻域特征拼接到引入注意力機(jī)制的深度融合網(wǎng)絡(luò)其演進(jìn)邏輯始終是讓融合過(guò)程本身具有學(xué)習(xí)能力能夠根據(jù)具體任務(wù)和數(shù)據(jù)自適應(yīng)地整合多源信息。你的論文創(chuàng)新點(diǎn)可以體現(xiàn)在這個(gè)演進(jìn)鏈條的任何一個(gè)環(huán)節(jié)上只要你能通過(guò)嚴(yán)謹(jǐn)?shù)膶?shí)驗(yàn)證明其有效性。