06Logistic Regression

本讲小结

  • 上节我们的任务是在一定的学习时间下预测分数。而这一讲的任务变成,根据已有的样本,判断需要多少学习时间可以通过考试。通过与不通过,变成一个二分类的任务。对于分类任务,其标签我们常采用one-hot编码格式。
    Alt
  • 由于线性层的输出是一个连续的实数空间,对于该例子的分类任务,我们需要知道的是在一定的学习时间下,通过与不通过的概率。如何将一个连续的实数空间映射成概率分布,这就需要 S i g m o i d Sigmoid Sigmoid函数。
    Alt

1,数据准备

import torch
import matplotlib.pyplot as plt

# 1,准备数据集
x_data = torch.Tensor([[1.0], [2.0], [3.0]])
# 类别标签one-hot编码
y_data = torch.Tensor([[0.0], [0.0], [1.0]])

2,设计模型

相比较于上一节的设计模型代码,在前向传播中,多了一个非线性映射。

# 2,设计模型
class LogisticRegression(torch.nn.Module):
    def __init__(self):
        super(LogisticRegression, self).__init__()
        self.linear = torch.nn.Linear(1,1)

    def forward(self,x):
        output = torch.nn.Sigmoid()(self.linear(x))
        return output
model = LogisticRegression()

3,构建损失函数和优化器

# 3,构建损失函数和优化器
critrion = torch.nn.BCELoss()
optimizer = torch.optim.SGD(params=model.parameters(),lr=0.01)

损失函数采用的是二值损失函数

  • 如图所示,当预测值越接近真实值1,损失越小。那么,对于一个mini-batch的损失,同样是求和在平均。pytorch当中,大部分损失函数都有这样的操作。
  • 实际上看上去这个损失函数有两项,但实际上只有一项产生作用。当我们预测的是真值时,前一项发挥作用。当我们预测非真值时,即在有些任务中,也许越接近0越好,是后一项发挥作用。
    Alt

4,训练循环

# 4,训练周期
l = []
for epoch in range(100):

    y_pred = model(x_data)
    loss = critrion(y_pred,y_data)
    l.append(loss.item())
    # 先梯度清零再反向传播,更新梯度
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

完整过程

import torch
import matplotlib.pyplot as plt

# 1,准备数据集
x_data = torch.Tensor([[1.0], [2.0], [3.0]])
# 类别标签one-hot编码
y_data = torch.Tensor([[0.0], [0.0], [1.0]])

# 2,设计模型
class LogisticRegression(torch.nn.Module):
    def __init__(self):
        super(LogisticRegression, self).__init__()
        self.linear = torch.nn.Linear(1,1)

    def forward(self,x):
        output = torch.nn.Sigmoid()(self.linear(x))
        return output

model = LogisticRegression()

# 3,构建损失函数和优化器
critrion = torch.nn.BCELoss()
optimizer = torch.optim.SGD(params=model.parameters(),lr=0.01)

# 4,训练周期
l = []
for epoch in range(100):

    y_pred = model(x_data)
    loss = critrion(y_pred,y_data)
    l.append(loss.item())
    # 先梯度清零再反向传播,更新梯度
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

plt.rc('legend', fontsize=14)
fig = plt.figure(figsize=(10,5.5),dpi=100)
plt.plot(l,marker='d',label='LoitsRegression')
plt.xlabel('epoch',fontsize=14)
plt.ylabel('loss',fontsize=14)
plt.legend()
plt.show()

实验结果

Alt

测试模型

使用上面训练得到的模型进行测试

import numpy as np
import matplotlib.pyplot as plt
 
 
x = np.linspace(0, 10, 200)
 
x_t = torch.Tensor(x).view((200, 1)) #类似于np的reshape
 
y_t = model(x_t) #进行测试
 
y = y_t.data.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小时,通过考试的概率越接近0.5,学习时间越长。通过考试的概率越大。
    Alt
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值