基于LSTM的剩余寿命预测(PyTorch实现)
首先,我們需要準(zhǔn)備數(shù)據(jù)。對(duì)于剩余壽命預(yù)測(cè)問(wèn)題,我們需要有一些歷史數(shù)據(jù)來(lái)訓(xùn)練我們的模型,并且需要一些測(cè)試數(shù)據(jù)來(lái)驗(yàn)證模型的性能。假設(shè)我們有一個(gè)包含多個(gè)傳感器讀數(shù)的數(shù)據(jù)集,我們可以將其轉(zhuǎn)化為一個(gè)序列預(yù)測(cè)問(wèn)題。具體來(lái)說(shuō),我們可以使用前一段時(shí)間的傳感器讀數(shù)來(lái)預(yù)測(cè)未來(lái)一段時(shí)間內(nèi)設(shè)備的剩余壽命。
我們假設(shè)我們的數(shù)據(jù)集中包含了?N?個(gè)序列,每個(gè)序列由?T?個(gè)時(shí)間步長(zhǎng)的傳感器讀數(shù)組成。為了方便起見(jiàn),我們假設(shè)每個(gè)序列的長(zhǎng)度相同。另外,我們假設(shè)每個(gè)序列的最后一個(gè)時(shí)間步長(zhǎng)對(duì)應(yīng)于設(shè)備故障發(fā)生的時(shí)間。
首先,我們需要加載數(shù)據(jù)并進(jìn)行預(yù)處理。在這個(gè)例子中,我們將使用?Pandas?庫(kù)來(lái)加載數(shù)據(jù)并進(jìn)行預(yù)處理。
import pandas as pddata = pd.read_csv('data.csv')# 對(duì)于每個(gè)序列,將最后一個(gè)時(shí)間步長(zhǎng)作為標(biāo)簽 labels = data.groupby('sequence_id')['sensor_reading'].last().values# 將傳感器讀數(shù)按照序列分組,并轉(zhuǎn)化為 PyTorch 張量 data = data.groupby('sequence_id')['sensor_reading'].apply(lambda x: x.values[:-1]).values data = torch.tensor(list(data))# 將標(biāo)簽也轉(zhuǎn)化為 PyTorch 張量 labels = torch.tensor(labels)接下來(lái),我們需要將數(shù)據(jù)劃分為訓(xùn)練集和測(cè)試集。我們可以使用?sklearn?庫(kù)中的?train_test_split?函數(shù)來(lái)完成這個(gè)任務(wù)。
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)接下來(lái),我們需要定義我們的 LSTM 模型。我們可以使用 PyTorch 中的?LSTM?類來(lái)定義一個(gè) LSTM 模型。對(duì)于每個(gè)時(shí)間步長(zhǎng),我們將傳感器讀數(shù)作為輸入,并使用 LSTM 模型來(lái)預(yù)測(cè)未來(lái)的剩余壽命。我們最后將 LSTM 的輸出傳遞給一個(gè)全連接層,以獲得最終的預(yù)測(cè)結(jié)果。
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接下來(lái),我們需要定義一些超參數(shù),包括批大小、學(xué)習(xí)率、隱藏狀態(tài)的大小等等。
batch_size = 64 num_epochs = 100 learning_rate = 0.001 input_size = 1 hidden_size = 64 output_size = 1接下來(lái),我們需要將數(shù)據(jù)打包成批次并加載到 PyTorch 的?DataLoader?中。這個(gè)步驟非常重要,因?yàn)樗试S我們?cè)谟?xùn)練過(guò)程中隨機(jī)化數(shù)據(jù)的順序,并且每次處理一小批數(shù)據(jù)可以使訓(xùn)練過(guò)程更加高效。
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)接下來(lái),我們需要定義我們的損失函數(shù)和優(yōu)化器。
criterion = nn.MSELoss() optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)接下來(lái),我們可以定義我們的訓(xùn)練循環(huán)。在每個(gè)周期中,我們將模型的參數(shù)更新為使損失函數(shù)最小化的值。我們還可以在每個(gè)周期結(jié)束時(shí)計(jì)算訓(xùn)練和測(cè)試損失,并輸出訓(xùn)練和測(cè)試損失的變化趨勢(shì)。
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))最后,我們可以使用訓(xùn)練好的模型對(duì)測(cè)試集進(jìn)行預(yù)測(cè),并計(jì)算模型的平均絕對(duì)誤差和均方根誤差來(lái)評(píng)估模型的性能。
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))總結(jié)
以上是生活随笔為你收集整理的基于LSTM的剩余寿命预测(PyTorch实现)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 电脑如何关闭445端口
- 下一篇: 详解等保三级7大关键点