下面是关于“Pytorch实现逻辑回归分类”的完整攻略。
1. 逻辑回归分类
逻辑回归是一种二分类算法,用于将输入数据分为两个类别。在逻辑回归中,我们使用sigmoid函数将输入数据映射到0和1之间,然后将其作为概率输出。如果输出概率大于0.5,则将输入数据分类为1,否则分类为0。
2. Pytorch实现逻辑回归分类
在Pytorch中,可以使用torch.nn模块实现逻辑回归分类。下面是实现逻辑回归分类的步骤:
2.1 准备数据
首先,我们需要准备数据。在本例中,我们使用sklearn库中的make_classification函数生成一个二分类数据集。
from sklearn.datasets import make_classification
# 生成二分类数据集
X, y = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, random_state=1)
2.2 定义模型
接下来,我们需要定义逻辑回归模型。在本例中,我们使用torch.nn模块中的Linear和Sigmoid函数实现逻辑回归模型。
import torch.nn as nn
# 定义逻辑回归模型
class LogisticRegression(nn.Module):
def __init__(self):
super(LogisticRegression, self).__init__()
self.linear = nn.Linear(2, 1)
self.sigmoid = nn.Sigmoid()
def forward(self, x):
x = self.linear(x)
x = self.sigmoid(x)
return x
model = LogisticRegression()
在上面的代码中,我们首先定义了一个LogisticRegression类,继承自nn.Module类。在构造函数中,我们定义了一个Linear层和一个Sigmoid层。在forward()函数中,我们将输入数据传递给Linear层和Sigmoid层,并返回输出结果。
2.3 定义损失函数和优化器
接下来,我们需要定义损失函数和优化器。在本例中,我们使用二元交叉熵损失函数和随机梯度下降优化器。
import torch.optim as optim
# 定义损失函数和优化器
criterion = nn.BCELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
在上面的代码中,我们首先定义了一个二元交叉熵损失函数。然后,我们使用SGD优化器,将模型参数传递给优化器。
2.4 训练模型
接下来,我们需要训练模型。在本例中,我们使用随机梯度下降优化器,迭代1000次,每次迭代使用一个批次的数据进行训练。
# 训练模型
for epoch in range(1000):
# 将数据转换为Tensor类型
inputs = torch.Tensor(X)
labels = torch.Tensor(y.reshape(-1, 1))
# 前向传播
outputs = model(inputs)
# 计算损失
loss = criterion(outputs, labels)
# 反向传播
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 每100次迭代输出一次损失
if (epoch + 1) % 100 == 0:
print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch + 1, 1000, loss.item()))
在上面的代码中,我们首先将数据转换为Tensor类型。然后,我们使用模型进行前向传播,并计算损失。接下来,我们使用反向传播更新模型参数。最后,我们每100次迭代输出一次损失。
2.5 测试模型
最后,我们需要测试模型。在本例中,我们使用测试数据集评估模型的性能。
# 测试模型
with torch.no_grad():
# 将测试数据转换为Tensor类型
inputs = torch.Tensor(X_test)
labels = torch.Tensor(y_test.reshape(-1, 1))
# 使用模型进行预测
outputs = model(inputs)
predicted = (outputs > 0.5).float()
# 计算准确率
accuracy = (predicted == labels).sum().item() / len(labels)
print('Accuracy: {:.2f}%'.format(accuracy * 100))
在上面的代码中,我们首先将测试数据转换为Tensor类型。然后,我们使用模型进行预测,并计算准确率。
3. 示例说明
3.1 示例1:使用Pytorch实现逻辑回归分类
import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.datasets import make_classification
# 生成二分类数据集
X, y = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, random_state=1)
# 定义逻辑回归模型
class LogisticRegression(nn.Module):
def __init__(self):
super(LogisticRegression, self).__init__()
self.linear = nn.Linear(2, 1)
self.sigmoid = nn.Sigmoid()
def forward(self, x):
x = self.linear(x)
x = self.sigmoid(x)
return x
model = LogisticRegression()
# 定义损失函数和优化器
criterion = nn.BCELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
# 训练模型
for epoch in range(1000):
# 将数据转换为Tensor类型
inputs = torch.Tensor(X)
labels = torch.Tensor(y.reshape(-1, 1))
# 前向传播
outputs = model(inputs)
# 计算损失
loss = criterion(outputs, labels)
# 反向传播
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 每100次迭代输出一次损失
if (epoch + 1) % 100 == 0:
print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch + 1, 1000, loss.item()))
# 测试模型
with torch.no_grad():
# 生成测试数据集
X_test, y_test = make_classification(n_samples=100, n_features=2, n_informative=2, n_redundant=0, random_state=1)
# 将测试数据转换为Tensor类型
inputs = torch.Tensor(X_test)
labels = torch.Tensor(y_test.reshape(-1, 1))
# 使用模型进行预测
outputs = model(inputs)
predicted = (outputs > 0.5).float()
# 计算准确率
accuracy = (predicted == labels).sum().item() / len(labels)
print('Accuracy: {:.2f}%'.format(accuracy * 100))
在上面的代码中,我们首先使用make_classification函数生成一个二分类数据集。然后,我们定义了一个LogisticRegression类,继承自nn.Module类。在构造函数中,我们定义了一个Linear层和一个Sigmoid层。在forward()函数中,我们将输入数据传递给Linear层和Sigmoid层,并返回输出结果。接下来,我们使用二元交叉熵损失函数和随机梯度下降优化器。然后,我们使用模型进行训练,并输出损失。最后,我们使用测试数据集评估模型的性能,并输出准确率。
3.2 示例2:使用Pytorch实现逻辑回归分类并绘制决策边界
import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
# 生成二分类数据集
X, y = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, random_state=1)
# 定义逻辑回归模型
class LogisticRegression(nn.Module):
def __init__(self):
super(LogisticRegression, self).__init__()
self.linear = nn.Linear(2, 1)
self.sigmoid = nn.Sigmoid()
def forward(self, x):
x = self.linear(x)
x = self.sigmoid(x)
return x
model = LogisticRegression()
# 定义损失函数和优化器
criterion = nn.BCELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
# 训练模型
for epoch in range(1000):
# 将数据转换为Tensor类型
inputs = torch.Tensor(X)
labels = torch.Tensor(y.reshape(-1, 1))
# 前向传播
outputs = model(inputs)
# 计算损失
loss = criterion(outputs, labels)
# 反向传播
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 每100次迭代输出一次损失
if (epoch + 1) % 100 == 0:
print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch + 1, 1000, loss.item()))
# 绘制决策边界
w = list(model.parameters())[0][0].detach().numpy()
b = list(model.parameters())[1].detach().numpy()
x1 = np.linspace(-3, 3, 100)
x2 = -(w[0] * x1 + b) / w[1]
plt.plot(x1, x2, color='red')
# 绘制数据点
plt.scatter(X[:, 0], X[:, 1], c=y)
plt.show()
在上面的代码中,我们首先使用make_classification函数生成一个二分类数据集。然后,我们定义了一个LogisticRegression类,继承自nn.Module类。在构造函数中,我们定义了一个Linear层和一个Sigmoid层。在forward()函数中,我们将输入数据传递给Linear层和Sigmoid层,并返回输出结果。接下来,我们使用二元交叉熵损失函数和随机梯度下降优化器。然后,我们使用模型进行训练,并输出损失。最后,我们使用训练好的模型绘制决策边界,并将数据点绘制在图表上。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Pytorch实现逻辑回归分类 - Python技术站