注:pytorch实现逻辑回归与线性回归部分大体结构相似,想细致了解可以转至线性回归
逻辑回归(分类)
核心任务:计算属于每一类的概率:
逻辑回归损失用交叉熵BCE(二元):
将小批量数据的所有BCE损失求和并求均值:
代码实现
本例中输入x = [1, 2, 3] 输出y = [0, 0, 1] 0表示负类,1表示正类 由此构建逻辑回归模型,并画出预测曲线
import torch.nn
import torch.nn.functional as F
#准备数据
x_data = torch.Tensor([[1], [2], [3]])
y_data = torch.Tensor([[0], [0], [1]])
#构造模型
class LogisticRegressionModel(torch.nn.Module):
#初始化与线性模型一样,因为σ没有需要训练的参数
def __init__(self):
super(LogisticRegressionModel, self).__init__()
self.linear = torch.nn.Linear(1, 1)
def forward(self, x):
y_pred = F.sigmoid(self.linear(x))
return y_pred
model = LogisticRegressionModel()
#构造损失和优化器
#这里采用交叉熵
criterion = torch.nn.BCELoss(size_average=False)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
#训练的循环
for epoch in range(1000):
y_pred = model(x_data) #前馈
l = criterion(y_pred, y_data) #计算损失
print(epoch, l.item())
optimizer.zero_grad() #梯度清零
l.backward() #反向传播
optimizer.step() #更新梯度
#预测
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(1, 10, 200)
x_test = torch.Tensor(x).view((200, 1)) #这里相当于一个reshape
y_test = model(x_test)
y = y_test.data.numpy() #在这里需要将Tensor转化回numpy
plt.plot(x, y)
plt.plot([0, 10], [0.5, 0.5], c='r')
plt.xlabel('hours')
plt.ylabel('probability of pass')
plt.grid()
plt.show()
运行结果
如图可以看到当输入为2.5时正类和负类的概率相等,大于2.5为正类,小于2.5为负类