6 逻辑斯蒂回归

文章目录

    • 回归问题和分类问题
    • 问题提出
    • 逻辑回归
      • 二分类问题
      • 逻辑函数
    • 与线性回归方程的不同
      • 模型变化
      • loss函数不同
      • BCEloss函数的介绍
    • 课程代码

课程来源: 链接
课程文本来源借鉴: 链接
以及(强烈推荐) Birandaの

回归问题和分类问题

有监督学习:

  1. 回归问题
  2. 分类问题
    二分类
    多分类

回归问题:如果我们预测的结果是以连续数字进行表示,即我们将在连续函数中对多个输入变量建立映射关系时,则这样的问题称之为回归问题。
分类问题:如果我们预测的结果是以离散形式表示的,即我们将多个输入变量与多个不同的类别建立映射关系时,则这样的问题称之为分类问题。

6 逻辑斯蒂回归_第1张图片

问题提出

在之前提到的耗时效益的问题,是回归问题,也就是输入和输出间又数值上的关系。

x y
1 2
2 4
3 6
4

但如果,将 y y y的值记为是否合格,此问题变变换成一个(二)分类问题。

x y
1 fail(0)
2 fail(0)
3 pass(1)
4 pass

实际上是计算在4工时下是否合格的概率,即对概率的计算与比较,而非类别之间的数值比较。

分类问题中,实际上是对概率的计算与比较,而非类别之间的数值比较.(也即离散问题时)

逻辑回归

二分类问题

二分类问题是非0即1的问题,由于隐藏条件的限制
P ( y ^ = 1 ) + P ( y ^ = 0 ) = 1 P(\widehat y=1)+P(\widehat y=0) = 1 P(y =1)+P(y =0)=1
对于二分类问题结果的预测,仅需要计算在0或1的条件下即可得到答案。
通常计算 P ( y ^ = 1 ) P(\widehat y=1) P(y =1)

逻辑函数

在原先的回归问题中,所利用的模型为
y ^ = ω x + b \widehat y = \omega x+b y =ωx+b
此时的 y ^ ∈ R \widehat y \in R y R,但当问题为分类问题时,所求结果的值域应当发生改变,变为一个概率即 y ^ ∈ [ 0 , 1 ] \widehat y \in [0,1] y [0,1]
因此,需要引入逻辑函数(sigmod)来实现。
σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1+e^{-x}} σ(x)=1+ex1
本函数原名为logistics函数,属于sigmod类函数,由于其特性优异,代码中的sigmod函数就指的是本函数。其函数图像为

6 逻辑斯蒂回归_第2张图片

以及其他的sigmod函数:(但现在指向sigmod函数常指上面的那个函数)
6 逻辑斯蒂回归_第3张图片
sigmod函数的特点:

  1. 函数值在0到1之间变化明显(导数大)
  2. 在趋近于0和1处函数逐渐平滑(导数小)
  3. 函数为饱和函数
  4. 单调增函数

与线性回归方程的不同

模型变化

线性函数后加上了sigmod函数

6 逻辑斯蒂回归_第4张图片

loss函数不同

损失函数由线性回归的MSE到BCE LossFunction
在这里插入图片描述

BCEloss函数的介绍

原先是计算两个标量数值间的差距,也就是数轴上的距离。

现在为了计算两个概率之间的差异,需要利用到交叉熵的理论。

6 逻辑斯蒂回归_第5张图片
交叉熵具体理解

简单的理解上,我们仅仅需要了解这个结论:

如下图所示, y ^ \widehat y y y y y越接近,BCE Loss越小
6 逻辑斯蒂回归_第6张图片

课程代码

import torch.nn.functional as F
import torch

x_data = torch.Tensor([[1.0],[2.0],[3.0]])
y_data = torch.Tensor([[0.0],[0.0],[1.0]])

#改用LogisticRegressionModel 同样继承于Module
class LogisticRegressionModel(torch.nn.Module):
    def __init__(self):
        super(LogisticRegressionModel, self).__init__()
        self.linear = torch.nn.Linear(1,1)

    def forward(self, x):
        #对原先的linear结果进行sigmod激活
        y_pred = F.sigmoid(self.linear(x))
        return y_pred
model = LogisticRegressionModel()

#构造的criterion对象所接受的参数为(y',y) 改用BCE
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)
    loss = criterion(y_pred,y_data)
    print(epoch,loss)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

print('w = ', model.linear.weight.item())
print('b = ', model.linear.bias.item())

x_test = torch.Tensor([[4.0]])
y_test = model(x_test)

print('y_pred = ',y_test.data)

需要关注的是,此处的Tensor无法写成tensor,具体的区别:链接

你可能感兴趣的:(pytorch,回归,逻辑回归)