pytorch-logistic回归实战

pytorch-logistic回归实战

  • 数据集
  • 代码

学习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回归主要进行二分类预测。

数据集

UCI German Credit 数据集

代码

完整代码

对数据的处理。加载、归一化、划分训练集和测试集:

# 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))

训练情况:
pytorch-logistic回归实战_第1张图片

你可能感兴趣的:(pytorch,python,logistic,regression)