对于RUL的入门,后期的训练模型代码好找,下面给大家简单介绍一下数据的预处理部分
-
1、数据介绍
对于数据的介绍有很多文章,此处就不做赘述了,大家也可以自己去搜搜好的帖子,路过可以瞧瞧以下几篇帖子👇
CMAPSS的个人理解和CMAPSS、PHM08、09、12下载地址_cmapss数据集介绍-CSDN博客
使用LSTM实现C-MAPSS数据集里面的剩余寿命预测(Pytorch)-CSDN博客
-
2、数据集下载
下面是网盘链接,直接下载就行,对照着上面的介绍,大家悟一悟哈
链接:https://pan.baidu.com/s/14Se4CR1BGSD17aFNWcqLcg
提取码:haha
-
3、数据处理步骤
3个步骤:加载数据——滑动窗口处理数据——数据归一化
-
加载数据
import pandas as pd
import numpy as np
# 加载数据
columns = ['engine_id', 'cycle', 'setting1', 'setting2', 'setting3'] + [f's{i}' for i in range(1, 22)]
df = pd.read_csv('CMAPSSDataNASA./train_FD001.txt', sep='\s+', header=None, index_col=False, names=columns)
# 计算每个引擎的RUL
df['RUL'] = df.groupby('engine_id')['cycle'].transform(max) - df['cycle']
df
运行结果大致如下:
-
滑动窗口处理数据
def sliding_window_dataframe(data, window_size, step_size=1):
windows = []
labels = []
for engine_id in data['engine_id'].unique():
engine_data = data[data['engine_id'] == engine_id]
for start in range(len(engine_data) - window_size + 1):
end = start + window_size
windows.append(engine_data.iloc[start:end, 2:-1].values) # 不包含engine_id和cycle列
labels.append(engine_data.iloc[end-1, -1]) # 使用窗口最后一个周期的RUL作为标签
return np.array(windows), np.array(labels)
window_size = 30
step_size = 1
X, y = sliding_window_dataframe(df, window_size=window_size, step_size=step_size)
对于输出的解释:
X(特征):X是一个三维数组,其中第一维对应于不同的窗口,第二维对应于窗口内的时间步(在这个例子中是30个周期),第三维对应于每个时间步的特征(传感器读数和设置值)。因此,如果你有100个窗口,每个窗口30个时间步,每个时间步20个特征,则X的形状将是(100, 30, 20)。
y(标签):y是一个一维数组,每个元素对应于一个窗口的RUL标签。数组的长度与窗口的数量相同,因此如果你有100个窗口,y的形状将是(100,)。
即,一个矩阵对应一个数值。这块强烈建议多想一想以下两点:
①之前的机器学习比如UCI数据分类集,都是一行x对应一个y,现在是一个矩阵块对应一个y。
②剩余寿命就是总寿命-现在的寿命值!
-
数据归一化
from sklearn.preprocessing import StandardScaler, MinMaxScaler
# 假设X是特征数据
scaler = StandardScaler()
# 对每个特征独立进行标准化
num_instances, num_time_steps, num_features = X.shape
X_reshaped = X.reshape(-1, num_features) # 将X重塑为2D,以便进行标准化
X_scaled = scaler.fit_transform(X_reshaped) # 标准化
X = X_scaled.reshape(num_instances, num_time_steps, num_features) # 将X重塑回3D
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
好了!到此就划分完成了训练集和验证集!后面用test_FD001作为测试集!即可!
后续的有空了再更新,比如最简单的CNN模型来预测(啊,还没学会如何调整模型,结果好差TAT)