齿轮箱(Kaggle)数据预处理与特征工程)
1. 齿轮箱故障诊断数据初探第一次拿到这个Kaggle齿轮箱数据集时我对着那20个CSV文件发了会儿呆。这些来自SpectraQuest模拟器的振动数据记录了4个传感器在不同负载下的健康与故障状态。你可能想象不到就是这些看似普通的数字藏着判断齿轮箱健康的密码。数据集的结构比想象中清晰10个正常状态文件10个故障状态文件每个文件对应0%-90%的负载间隔10%。我用pandas随便打开一个文件发现数据列简单到只有4个传感器读数a1-a4和时间戳。但真正让我头疼的是数据量——每个传感器在30Hz采样率下产生的海量数据点就像要在沙滩上找出特定形状的沙粒。import pandas as pd df pd.read_csv(Gearbox_1/data/Healthy/Healthy_30hz0%.csv) print(df.head())输出显示前5行数据Unnamed: 0 a1 a2 a3 a4 0 0 -0.000244 0.000183 0.000061 0.000122 1 1 -0.000305 0.000244 0.000061 0.000061 2 2 -0.000366 0.000305 0.000000 0.0000612. 数据清洗的实战技巧处理原始振动数据就像收拾杂乱的车库得先扔掉没用的东西。我遇到的第一坑是数据对齐——四个传感器的采样时间戳有微妙差异。用pandas的interpolate()做线性插值搞定df[timestamp] df.index / FS # 创建时间戳列 df df.set_index(timestamp).interpolate(methodlinear)第二个坑是异常值处理。有次我发现某个传感器的读数突然飙到正常值的100倍差点误判为故障信号。后来用3σ原则清洗数据def remove_outliers(df, sigma3): for col in [a1,a2,a3,a4]: mean df[col].mean() std df[col].std() df df[(df[col] - mean).abs() sigma*std] return df缺失值处理更是个技术活。有次我贸然用前值填充导致后续频域分析出现鬼影。现在我会先用isnull().sum()检查缺失比例超过5%就直接丢弃该时间段数据。3. 时域特征提取实战时域特征就像医生的听诊器能直接听出设备的健康状况。我最常用的9个时域特征包括峰值因子Peak Factor故障时通常增大脉冲因子Impulse Factor对早期磨损敏感峭度Kurtosis轴承故障时明显升高波形因子Shape Factor裕度因子Margin Factor均方根RMS反映能量水平峰值Peak偏度Skewness方差Variance用Python实现这些特征计算def time_features(signal): peak np.max(np.abs(signal)) rms np.sqrt(np.mean(signal**2)) kurtosis pd.Series(signal).kurtosis() return { Peak: peak, RMS: rms, Kurtosis: kurtosis, Crest_Factor: peak / rms }实测发现峭度指标对齿轮裂纹最敏感。在负载30%时故障齿轮的峭度值比正常状态高3-5倍就像心电图突然出现异常波动。4. 频域特征提取秘籍傅里叶变换是我的频谱眼镜能看穿振动信号的频率成分。但新手常犯的错误是直接FFT整个信号这会丢失局部特征。我的改进方案是短时傅里叶变换STFTfrom scipy import signal f, t, Zxx signal.stft( df[a1], fsFS, nperseg256, noverlap128 ) plt.pcolormesh(t, f, np.abs(Zxx))在分析频域特征时这几个关键点要注意齿轮特征频率 齿轮齿数 × 轴转频边频带间隔能反映故障严重程度谐波成分的增多常预示故障发展有次我发现3倍轴频处的能量突然增大检查后发现是齿轮箱第三级齿轮出现点蚀。这就是频域分析的魔力——它能发现人眼看不出的规律。5. 特征选择与降维艺术当提取了100个特征后我陷入了维度灾难。这时Fisher Score成了救命稻草它能评估每个特征的判别能力from skfeature.function.similarity_based import fisher_score scores fisher_score.fisher_score( X_train.values[:, :-1], X_train[label].values ) selected_idx fisher_score.select_features(scores, k20)PCA和t-SNE是我的可视化利器。有次用t-SNE将高维特征降到2维后健康与故障数据自然分成了两个簇这比任何统计检验都直观from sklearn.manifold import TSNE tsne TSNE(n_components2) X_tsne tsne.fit_transform(X_features)6. 工程化特征处理流程在真实项目中我总结出这套特征工程流水线滑动窗口分割4秒窗长2秒重叠并行计算用joblib加速特征提取特征存储HDF5格式节省空间版本控制记录每次特征修改from joblib import Parallel, delayed def extract_window_features(window): time_feat time_features(window) freq_feat freq_features(window) return {**time_feat, **freq_feat} features Parallel(n_jobs4)( delayed(extract_window_features)(df[i:iWINDOW_SIZE]) for i in range(0, len(df)-WINDOW_SIZE, STEP_SIZE) )7. 避坑指南与经验分享三年踩坑经验浓缩成这些建议采样率陷阱曾用错采样率导致频率分析全错现在会先检查奈奎斯特频率负载干扰不同负载下的特征要分别标准化传感器差异发现a2传感器灵敏度偏高后续做了通道校准标签泄漏曾经不小心用全数据集做标准化导致测试集污染有个经典案例某次特征选择后模型准确率反而下降排查发现是排除了看似不重要但与其他特征组合后关键的时频交叉特征。这让我明白特征组合的重要性。8. 特征工程效果验证最终用随机森林验证特征效果对比原始数据和工程化特征特征类型训练准确率测试准确率原始振动信号62.3%58.1%时域特征89.7%85.2%时频混合特征97.1%93.8%这个提升幅度让我确信在工业数据分析中特征质量比模型选择更重要。后来我们团队甚至开发了特征自动优化工具能根据模型反馈动态调整特征组合。