基于LSTM的剩余寿命预测(PyTorch实现)
首先,我們需要準備數據。對于剩余壽命預測問題,我們需要有一些歷史數據來訓練我們的模型,并且需要一些測試數據來驗證模型的性能。假設我們有一個包含多個傳感器讀數的數據集,我們可以將其轉化為一個序列預測問題。具體來說,我們可以使用前一段時間的傳感器讀數來預測未來一段時間內設備的剩余壽命。
我們假設我們的數據集中包含了?N?個序列,每個序列由?T?個時間步長的傳感器讀數組成。為了方便起見,我們假設每個序列的長度相同。另外,我們假設每個序列的最后一個時間步長對應于設備故障發生的時間。
首先,我們需要加載數據并進行預處理。在這個例子中,我們將使用?Pandas?庫來加載數據并進行預處理。
import pandas as pddata = pd.read_csv('data.csv')# 對于每個序列,將最后一個時間步長作為標簽 labels = data.groupby('sequence_id')['sensor_reading'].last().values# 將傳感器讀數按照序列分組,并轉化為 PyTorch 張量 data = data.groupby('sequence_id')['sensor_reading'].apply(lambda x: x.values[:-1]).values data = torch.tensor(list(data))# 將標簽也轉化為 PyTorch 張量 labels = torch.tensor(labels)接下來,我們需要將數據劃分為訓練集和測試集。我們可以使用?sklearn?庫中的?train_test_split?函數來完成這個任務。
from sklearn.model_selection import train_test_splittrain_data, test_data, train_labels, test_labels = train_test_split(data, labels, test_size=0.2, random_state=42)接下來,我們需要定義我們的 LSTM 模型。我們可以使用 PyTorch 中的?LSTM?類來定義一個 LSTM 模型。對于每個時間步長,我們將傳感器讀數作為輸入,并使用 LSTM 模型來預測未來的剩余壽命。我們最后將 LSTM 的輸出傳遞給一個全連接層,以獲得最終的預測結果。
import torch.nn as nnclass LSTMModel(nn.Module):def __init__(self, input_size, hidden_size, output_size):super(LSTMModel, self).__init__()self.hidden_size = hidden_sizeself.lstm = nn.LSTM(input_size, hidden_size, batch_first=True)self.fc = nn.Linear(hidden_size, output_size)def forward(self, x):h0 = torch.zeros(1, x.size(0), self.hidden_size).to(x.device)c0 = torch.zeros(1, x.size(0), self.hidden_size).to(x.device)out, _ = self.lstm(x, (h0, c0))out = self.fc(out[:, -1, :])return out接下來,我們需要定義一些超參數,包括批大小、學習率、隱藏狀態的大小等等。
batch_size = 64 num_epochs = 100 learning_rate = 0.001 input_size = 1 hidden_size = 64 output_size = 1接下來,我們需要將數據打包成批次并加載到 PyTorch 的?DataLoader?中。這個步驟非常重要,因為它允許我們在訓練過程中隨機化數據的順序,并且每次處理一小批數據可以使訓練過程更加高效。
from torch.utils.data import TensorDataset, DataLoadertrain_dataset = TensorDataset(train_data, train_labels) train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)test_dataset = TensorDataset(test_data, test_labels) test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=True)接下來,我們需要定義我們的損失函數和優化器。
criterion = nn.MSELoss() optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)接下來,我們可以定義我們的訓練循環。在每個周期中,我們將模型的參數更新為使損失函數最小化的值。我們還可以在每個周期結束時計算訓練和測試損失,并輸出訓練和測試損失的變化趨勢。
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') model = LSTMModel(input_size, hidden_size, output_size).to(device)for epoch in range(num_epochs):train_loss = 0.0test_loss = 0.0model.train()for i, (inputs, labels) in enumerate(train_loader):inputs = inputs.float().unsqueeze(-1).to(device)labels = labels.float().unsqueeze(-1).to(device)optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()train_loss += loss.item()model.eval()with torch.no_grad():for i, (inputs, labels) in enumerate(test_loader):inputs = inputs.float().unsqueeze(-1).to(device)labels = labels.float().unsqueeze(-1).to(device)outputs = model(inputs)loss = criterion(outputs, labels)test_loss += loss.item()train_loss /= len(train_loader)test_loss /= len(test_loader)print('Epoch [{}/{}], Train Loss: {:.4f}, Test Loss: {:.4f}'.format(epoch+1, num_epochs, train_loss, test_loss))最后,我們可以使用訓練好的模型對測試集進行預測,并計算模型的平均絕對誤差和均方根誤差來評估模型的性能。
from sklearn.metrics import mean_absolute_error, mean_squared_errorpredictions = []model.eval()with torch.no_grad():for inputs, labels in test_loader:inputs = inputs.float().unsqueeze(-1).to(device)labels = labels.float().unsqueeze(-1).to(device)outputs = model(inputs)predictions.append(outputs.cpu().numpy())predictions = np.concatenate(predictions, axis=0)mae = mean_absolute_error(test_labels.numpy(), predictions) rmse = np.sqrt(mean_squared_error(test_labels.numpy(), predictions))總結
以上是生活随笔為你收集整理的基于LSTM的剩余寿命预测(PyTorch实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑如何关闭445端口
- 下一篇: 详解等保三级7大关键点