Pytorch Logistic回归

    参考《深度学习入门之Pytorch》
    Logistic回归实现二分类问题

    数据下载链接:data(提取码:q8gd)


1. 首先读取 数据 data.txt

#logistic回归
#读取data.txt
import matplotlib.pyplot as plt
with open('data.txt','r') as f:
    data_list = f.readlines()
    data_list = [i.split('\n')[0] for i in data_list]
    data_list = [i.split(',') for i in data_list]
    data = [(float(i[0]),float(i[1]),float(i[2])) for i in data_list]
#q前两个数据表示X,Y坐标,最后一个数据表示类别

打开data.txt,前两个数据是横纵坐标,最后一个是类别0,1。这个数据有两个属性一个类别。 接着把数据按类别不同画出来。

x0 = list(filter(lambda x: x[-1]==0.,data)) #filter去除不符合条件的,保留符合条件的数据
x1 = list(filter(lambda x: x[-1]==1.,data))#数据按类别筛选
plot_x0_x = [i[0] for i in x0]
plot_x0_y = [i[1] for i in x0]
plot_x1_x = [i[0] for i in x1]
plot_x1_y = [i[1] for i in x1]

plt.plot(plot_x0_x,plot_x0_y,'ro',label='x_0')
plt.plot(plot_x1_x,plot_x1_y,'gx',label='x_1')
plt.legend(loc='best')

 

 Pytorch的操作对象是Tensor,这里要把数据类型转为Tensor.

import torch
import numpy as np
from torch import nn

# #转换数据
np_data = np.array(data, dtype='float32') # 转换成 numpy array
x_data = torch.from_numpy(np_data[:, 0:2]) # 转换成 Tensor, 大小是 [100, 2]
y_data = torch.from_numpy(np_data[:, -1]).unsqueeze(1) # 转换成 Tensor,大小是 [100, 1]

2. 构造分类模型

class LR(nn.Module):
    def __init__(self):
        super(LR,self).__init__()
        self.lr = nn.Linear(2,1)   #输入两个属性输出一个类别
        self.sm = nn.Sigmoid()     #Sigmoid激活函数就是Logistic回归的精髓
    def forward(self,x):
        x = self.lr(x)
        x = self.sm(x)
        return x
LR_model = LR()
if torch.cuda.is_available():
    LR_model.cuda()
criterion = nn.BCELoss()   #BCE是二分类损失函数 交叉熵
optimizer = torch.optim.SGD(LR_model.parameters(),lr=1e-3,momentum=0.9)

 3.训练模型,如果支持CUDA,要把模型和数据都放在CUDA上运行,用 .cuda()就可以绑定。

for epoch in range(18000):
    if torch.cuda.is_available():
        x = x_data.cuda()
        y = y_data.cuda()
    else:
        x = x_data
        y = y_data
    #===========forward==================#
    out = LR_model(x)
    loss = criterion(out,y)
    mask = out.ge(0.5).float()  #把输出结果大于0.5的归于1,小于归成0
    correct = (mask==y).sum()
    acc = correct.item()/x.size(0)
    #===========backward==================#
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    
    if (epoch+1)%1000== 0:  #每迭代一千次,看一下当前loss,acc
        print('*'*10)
        print('epoch:{},loss is:{},acc is:{}'.format(epoch,loss.item(),acc))

结果如下:

4. 在数据图上画出分界线。

#画出分界线
w0,w1 = LR_model.lr.weight[0]  
w0 = w0.item() #tensor是标量可以用item直接转换
w1 = w1.item()
b = LR_model.lr.bias[0]
b = b.item()

plot_x = np.arange(30,100,0.1)#从之前的图大致看出x轴范围
plot_y = (-w0*plot_x-b)/w1  #w1y+w0 x+b=0直线

plt.plot(plot_x0_x,plot_x0_y,'ro',label='x_0')
plt.plot(plot_x1_x,plot_x1_y,'gx',label='x_1')
plt.legend(loc='best')
plt.plot(plot_x,plot_y)

Pytorch版本的问题,原书代码可能会有许多报错,百度一下即可。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: PyTorch实现Logistic回归的步骤如下: 1. 导入必要的库和数据集。 2. 定义模型:Logistic回归模型通常由一个线性层和一个sigmoid函数组成。 3. 定义损失函数:Logistic回归使用二元交叉熵作为损失函数。 4. 定义优化器:使用随机梯度下降(SGD)作为优化器。 5. 训练模型:使用训练数据集训练模型,并在每个epoch后计算损失函数和准确率。 6. 测试模型:使用测试数据集测试模型,并计算准确率。 7. 可视化结果:使用matplotlib库可视化训练和测试的损失函数和准确率。 下面是一个简单的PyTorch实现Logistic回归的示例代码: ``` import torch import torch.nn as nn import torch.optim as optim import matplotlib.pyplot as plt # 导入数据集 from sklearn.datasets import load_breast_cancer data = load_breast_cancer() X = data.data y = data.target # 将数据转换为张量 X = torch.tensor(X, dtype=torch.float32) y = torch.tensor(y, dtype=torch.float32) # 定义模型 class LogisticRegression(nn.Module): def __init__(self): super(LogisticRegression, self).__init__() self.linear = nn.Linear(X.shape[1], 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=.01) # 训练模型 losses = [] accuracies = [] for epoch in range(100): # 前向传播 y_pred = model(X) # 计算损失函数和准确率 loss = criterion(y_pred, y.view(-1, 1)) accuracy = ((y_pred > .5).float() == y.view(-1, 1)).float().mean() # 反向传播和优化 optimizer.zero_grad() loss.backward() optimizer.step() # 记录损失函数和准确率 losses.append(loss.item()) accuracies.append(accuracy.item()) # 打印训练过程 print('Epoch [{}/{}], Loss: {:.4f}, Accuracy: {:.4f}'.format(epoch+1, 100, loss.item(), accuracy.item())) # 测试模型 with torch.no_grad(): y_pred = model(X) accuracy = ((y_pred > .5).float() == y.view(-1, 1)).float().mean() print('Test Accuracy: {:.4f}'.format(accuracy.item())) # 可视化结果 plt.plot(losses) plt.title('Training Loss') plt.xlabel('Epoch') plt.ylabel('Loss') plt.show() plt.plot(accuracies) plt.title('Training Accuracy') plt.xlabel('Epoch') plt.ylabel('Accuracy') plt.show() ``` 在这个示例中,我们使用了乳腺癌数据集作为示例数据集。我们首先将数据集转换为张量,然后定义了一个Logistic回归模型。我们使用二元交叉熵作为损失函数,使用随机梯度下降(SGD)作为优化器。我们训练模型并记录损失函数和准确率,然后使用测试数据集测试模型并计算准确率。最后,我们使用matplotlib库可视化训练和测试的损失函数和准确率。 ### 回答2: Logistic回归是一种二元分类算法,其主要目的是根据给定的输入数据,预测其所属的类别。在本文中,我们将介绍如何使用PyTorch实现Logistic回归。 首先,我们需要导入必要的PyTorch库: import torch import torch.nn as nn import torch.optim as optim 然后,我们需要定义我们的数据集。这里我们假设我们有n个数据样本,每个样本包含m个特征和一个二元类别。我们可以将这些数据存储在两个PyTorch张量中:一个包含特征,一个包含类别标签。 x = torch.randn(n, m) # 特征张量 y = torch.randint(high=2, size=(n, 1)).float() # 类别标签张量 接下来,我们需要定义我们的Logistic回归模型。这里我们将使用一个包含单个线性层的简单神经网络,以及一个sigmoid激活函数。 class LogisticRegression(nn.Module): def __init__(self, input_size): super(LogisticRegression, self).__init__() self.linear = nn.Linear(input_size, 1) def forward(self, x): output = self.linear(x) output = torch.sigmoid(output) return output model = LogisticRegression(m) 接下来,我们需要定义我们的损失函数和优化器。对于Logistic回归,通常使用二元交叉熵作为损失函数,使用随机梯度下降作为优化器。 criterion = nn.BCELoss() optimizer = optim.SGD(model.parameters(), lr=0.1) 现在我们可以开始训练我们的模型了。首先,我们将定义训练的迭代次数。然后,我们将循环n_epochs次并在每次迭代中计算模型的损失和梯度,并使用优化器更新模型参数。 n_epochs = 1000 for epoch in range(n_epochs): # 前向传播 y_pred = model(x) # 计算损失 loss = criterion(y_pred, y) # 反向传播 optimizer.zero_grad() loss.backward() optimizer.step() # 输出当前损失 if epoch % 100 == 0: print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, n_epochs, loss.item())) 最后,我们可以使用训练好的模型预测新的数据。我们只需要将数据传递给模型,然后将输出映射到二元类别。 with torch.no_grad(): y_pred = model(new_data) prediction = (y_pred >= 0.5).float() print('Prediction:', prediction) 总的来说,使用PyTorch实现Logistic回归非常简单。我们只需要定义模型,损失函数和优化器,然后使用反向传播更新模型参数。当然,在实现Logistic回归模型时还有许多其他的考虑因素,例如数据预处理和超参数调整,但这些在这篇文章里并没有讨论。 ### 回答3: pytorch是一个开源的机器学习框架,它可以帮助我们快速实现各种机器学习算法。其中,logistic回归是一个经典的二分类算法,我们可以使用pytorch实现它。 首先,我们需要准备好数据集。通常情况下,我们会将数据集划分为训练集和测试集,用训练集来训练模型,用测试集来测试模型的性能。 然后,我们需要定义模型。对于logistic回归来说,模型通常只有一层线性层和一个sigmoid激活函数。这可以通过pytorch中的nn.Linear和nn.Sigmoid来实现。 接下来,我们需要定义损失函数和优化器。对于logistic回归来说,常用的损失函数是二元交叉熵损失函数。优化器可以选择随机梯度下降法。 然后,我们可以通过迭代训练集中的样本来训练模型。具体来说,对于每一个样本,我们需要调用模型来预测其所属类别,计算预测值和真实值之间的误差,并根据误差更新模型的参数。这可以通过pytorch中的backward和step方法来实现。 最后,我们可以使用测试集来测试模型的性能。具体来说,对于每一个样本,我们需要调用模型来预测其所属类别,并将预测结果和真实值进行比较,计算分类准确率。 以上就是用pytorch实现logistic回归的基本步骤。当然,实际应用中还有很多需要注意和优化的地方,比如数据预处理、超参数调整等等。但是掌握了基本的实现方法,我们就可以应用pytorch实现各种机器学习算法了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值