Bootstrap

自定义数据集 使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测,对预测结果计算精确度和召回率及F1分数

自定义数据集:继承  torch.utils.data.Dataset  类创建自定义数据集,并重写  __len__  和  __getitem__  方法。

 

定义逻辑回归模型:继承  nn.Module  类,定义一个线性层,并在  forward  方法中应用sigmoid激活函数。

 

训练模型:使用二元交叉熵损失函数  BCELoss  和随机梯度下降优化器  SGD  进行训练。

 

保存模型:使用  torch.save  保存模型的参数。

 

加载模型并预测:加载保存的模型参数,设置模型为评估模式,对新数据进行预测。

 

计算评估指标:使用  sklearn.metrics  中的函数计算精确度、召回率及F1分数

import torch

import torch.nn as nn

import torch.optim as optim

from torch.utils.data import Dataset, DataLoader

from sklearn.metrics import precision_score, recall_score, f1_score

 

 

# 自定义数据集

class MyDataset(Dataset):

    def __init__(self, data, labels):

        self.data = torch.FloatTensor(data)

        self.labels = torch.FloatTensor(labels)

 

    def __len__(self):

        return len(self.data)

 

    def __getitem__(self, idx):

        return self.data[idx], self.labels[idx]

 

 

# 生成一些自定义数据

np.random.seed(0)

data = np.random.randn(100, 10)

labels = np.random.randint(0, 2, size=(100, 1))

 

# 创建数据集和数据加载器

dataset = MyDataset(data, labels)

dataloader = DataLoader(dataset, batch_size=10, shuffle=True)

 

 

# 定义逻辑回归模型

class LogisticRegression(nn.Module):

    def __init__(self, input_dim):

        super(LogisticRegression, self).__init__()

        self.linear = nn.Linear(input_dim, 1)

 

    def forward(self, x):

        return torch.sigmoid(self.linear(x))

 

 

model = LogisticRegression(input_dim=10)

 

# 定义损失函数和优化器

criterion = nn.BCELoss()

optimizer = optim.SGD(model.parameters(), lr=0.01)

 

# 训练模型

num_epochs = 100

for epoch in range(num_epochs):

    for batch_data, batch_labels in dataloader:

        optimizer.zero_grad()

        outputs = model(batch_data)

        loss = criterion(outputs, batch_labels.view(-1, 1))

        loss.backward()

        optimizer.step()

    if (epoch + 1) % 10 == 0:

        print(f'Epoch [{epoch + 1}/{num_epochs}], Loss: {loss.item():.4f}')

 

# 保存模型

torch.save(model.state_dict(), 'logistic_regression.pth')

 

# 加载模型进行预测

loaded_model = LogisticRegression(input_dim=10)

loaded_model.load_state_dict(torch.load('logistic_regression.pth'))

loaded_model.eval()

 

# 进行预测

new_data = np.random.randn(10, 10)

new_data = torch.FloatTensor(new_data)

with torch.no_grad():

    predictions = loaded_model(new_data)

    predicted_labels = (predictions > 0.5).float()

 

# 计算精确度、召回率及F1分数

true_labels = np.random.randint(0, 2, size=(10, 1))

precision = precision_score(true_labels, predicted_labels.numpy())

recall = recall_score(true_labels, predicted_labels.numpy())

f1 = f1_score(true_labels, predicted_labels.numpy())

 

print(f'Precision: {precision:.4f}')

print(f'Recall: {recall:.4f}')

print(f'F1-score: {f1:.4f}')

;