请给出一个多变量时序二分类的机器学习代码,数据由csv给出,包含不同患者的时间序列,背景是不同患者在24小时内各项指标,判断其是否死亡
时间: 2024-05-24 18:14:33 浏览: 118
下面是一个使用Python实现的多变量时序二分类机器学习代码,该代码基于PyTorch框架和LSTM模型。数据是从一个CSV文件中读取的,包含了不同患者在24小时内各项指标的时间序列数据。该代码旨在根据这些指标,对患者是否死亡进行预测。
```python
import torch
from torch import nn
from torch.utils.data import Dataset, DataLoader
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
# 读取CSV文件并进行数据预处理
data = pd.read_csv('data.csv')
scaler = StandardScaler()
X = data.drop(['patient_id', 'label'], axis=1).values
X = scaler.fit_transform(X)
y = data['label'].values
# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 定义数据集
class PatientDataset(Dataset):
def __init__(self, X, y):
self.X = torch.tensor(X, dtype=torch.float32)
self.y = torch.tensor(y, dtype=torch.float32)
def __len__(self):
return len(self.X)
def __getitem__(self, idx):
return self.X[idx], self.y[idx]
# 定义模型
class LSTM(nn.Module):
def __init__(self, input_size, hidden_size, num_layers, output_size):
super(LSTM, self).__init__()
self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)
self.fc = nn.Linear(hidden_size, output_size)
def forward(self, x):
out, _ = self.lstm(x)
out = self.fc(out[:, -1, :])
return out
# 训练模型
batch_size = 32
num_epochs = 50
learning_rate = 0.001
train_dataset = PatientDataset(X_train, y_train)
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
model = LSTM(input_size=X.shape[1], hidden_size=128, num_layers=2, output_size=1)
criterion = nn.BCEWithLogitsLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
for epoch in range(num_epochs):
for X_batch, y_batch in train_loader:
optimizer.zero_grad()
y_pred = model(X_batch)
loss = criterion(y_pred.flatten(), y_batch)
loss.backward()
optimizer.step()
print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')
# 测试模型
test_dataset = PatientDataset(X_test, y_test)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)
model.eval()
with torch.no_grad():
correct = 0
total = 0
for X_batch, y_batch in test_loader:
y_pred = model(X_batch)
y_pred = torch.sigmoid(y_pred).round().flatten().long()
correct += (y_pred == y_batch.long()).sum().item()
total += len(y_batch)
accuracy = correct / total
print(f'Test Accuracy: {accuracy:.4f}')
```
该代码首先读取CSV文件,并使用标准化对数据进行预处理。然后,它将数据集划分为训练集和测试集,其中80%用于训练,20%用于测试。
接下来,代码定义了一个名为PatientDataset的数据集类,它将原始数据转换为PyTorch张量,并将其作为输入和标签提供给模型。然后,代码定义了一个名为LSTM的模型,它包括一个LSTM层和一个全连接层。最后,代码使用BCEWithLogitsLoss作为损失函数,Adam优化器来训练模型,并在每个时代结束时记录损失。
在模型训练完之后,代码使用测试集评估模型性能。在评估期间,代码将模型设置为评估模式,以便在前馈过程中不会更新参数。它计算了模型的准确性,并将结果打印到控制台。
请注意,这只是一个简单的示例代码,可能需要进行优化以获得更好的性能。此外,该模型的性能还取决于CSV文件中包含的指标数量、数据质量和其他因素。
阅读全文