学习pytorch过程中,学习logistic回归的一个demo。
logistic回归是一种广义线性回归,与多重线性回归分析相似。它们的模型形式基本上相同,都具有 wx + b,其中w和b是待求参数。
其区别在于他们的因变量不同,多重线性回归直接将wx+b作为因变量,即y =wx+b,而logistic回归则通过函数L将wx+b对应一个隐状态p,p =L(wx+b),然后根据p 与1-p的大小决定因变量的值。如果L是logistic函数,就是logistic回归,如果L是多项式函数就是多项式回归。
即logistic回归会在线性回归后再加一层logistic函数的调用。logistic回归主要进行二分类预测。
数据集
代码
对数据的处理。加载、归一化、划分训练集和测试集:
# german.data-numeric是numpy处理好的数值化数据。使用load方法读取
data = np.loadtxt("german.data-numeric")
# 归一化。将数据变成(0,1)之间的小数
n, l = data.shape
# 按列遍历
for j in range(l - 1):
meanVal = np.mean(data[:, j])
# 标准差。方差的算术平方根
stdVal = np.std(data[:, j])
data[:, j] = (data[:, j] - meanVal) / stdVal
# 打乱数据
np.random.shuffle(data)
# 数据集格式,前24列为24个维度,第25列为标签
train_data = data[:900, :l - 1] # 特征数据
train_lab = data[:900, l - 1] - 1 # 标签
test_data = data[900:, :l - 1]
test_lab = data[900:, l - 1] - 1
定义模型:
import torch
import torch.nn as nn
# 定义模型
class LR(nn.Module):
def __init__(self):
super(LR, self).__init__()
# 24个维度
self.fc = nn.Linear(24, 2)
def forward(self, x):
out = self.fc(x)
# Sigmod函数是最常见的logistic函数
out = torch.sigmoid(out)
return out
训练:
# 开始训练
for i in range(epochs):
# 指定模式为训练模式,计算梯度
net.train()
# 输入值都需要转化成torch的Tensor
x = torch.from_numpy(train_data).float()
y = torch.from_numpy(train_lab).long()
y_hat = net(x)
# 计算损失
loss = criterion(y_hat, y)
# 前一步的损失清零
optm.zero_grad()
# 反向传播
loss.backward()
# 优化
optm.step()
# 每100次,输出相关信息
if (i + 1) % 100 == 0:
# 指定模型为计算模式
net.eval()
test_in = torch.from_numpy(test_data).float()
test_l = torch.from_numpy(test_lab).long()
test_out = net(test_in)
# 使用测试集,计算准确率
accu = test(test_out, test_l)
print("Epoch:{},Loss:{:.4f},Accuracy:{:.2f}".format(i + 1, loss.item(), accu))
训练情况: