PyTorch深度学习实践——Logistic Regression

      在本次学习中,学习到了logistic回归,虽然说是一种回归模型,但是这个模型实际上是做分类问题,对于这种回归模型我们同样从三个方面来进行介绍,logistic回归是什么?为什么要采用logistics回归?如何实现losgistic回归模型?下面是对于logistic回归的总结:

logistic回归是什么?

     给出定义:逻辑斯谛回归(logistic regression)是统计学习中的经典分类方法,属于对数线性模型,所以也被称为对数几率回归。这里要注意,虽然带有回归的字眼,但是该模型是一种分类算法,逻辑斯谛回归是一种线性分类器,针对的是线性可分问题

    提到logistics回归就会提到logistics函数,简单的来说,logistics函数就是一种函数用于之前的线性模型处理,使得线性模型能转换为能完成分类任务的模型,那么这种模型就是logistic回归模型,之后会对细节部分进行进一步阐释

为什么要采用logistics回归?

      在解释为什么需要采用logistics回归之前,我们先对分类与回归任务进行比较

      在之前实现的线性回归模型中,为什么房价预测这种模型就是线性回归模型呢?因为我们的数据集输入以及需要实现的y_hat 输出都是一个连续的空间,而这输入到输出关系是一个类似于线性的函数,因此我们将他看作线性回归(预测)模型。但是我们知道在机器学习让任务中,我们常常也常常需要做分类任务,列入手写数字识别等任务

                  PyTorch深度学习实践——Logistic Regression_第1张图片                 

      对于给出的0-9数据集,我们希望模型能实现自动的分类,也就是说这个时候的y_hat是一个具体的结果(数字是多少),那么在这种情况下使用线性回归模型来进行预测来进行预测就会出现以下问题

      对于构造类别编号时y={0,1,2,3,4,5,6,7,8,9},0和1编号更为接近,0和9编号差别大,但实际上我们发现,7,8,9三个数中,从相似性来看7和9更为接近,而7和8差距更大,但是按照道理,输入特征空间近似,输出结果也应该近似,而实际输入的7,9特征空间接近,但是输出7,9输出值之间隔一个数字8,因此无法用线性回归的方式简单的让模型输出0,1,2,3,4....,因为这些类别之间并没有数值大小含义,也就是在抽象概念中的9无法说它比0大,因为我们是在做分类问题,判别数字属于哪一个类别,而并不是单单比较数值大小。

      因此我们实际上对于y_hat输出,是输出一个对于一个数字,它对于各个类别的概率为多大,各个概率和为1,在比较各个概率后,将输出概率最大的结果输出得到结果,因此我们需要对模型进行改造。而这种改造后的模型编为logsitc回归模型。

如何实现losgistic回归模型?

      举出一个最简单的分类任务问题:二分类任务PyTorch深度学习实践——Logistic Regression_第2张图片

    我们将例子理解为学习时间与分数的关系变为判定学习相应时间能否通过考试的概率任务,也就是说P(y_hat=1) + P(y_hat=0) = 1,选择概率值大的结果输出。

     我们需要将之前的 y = wx + b变为输出结果是一个概率,那么我们采用一种函数,将输出的实数值映射到 [ 0 ,1]概率区间,而这种函数便是logistic函数

  

PyTorch深度学习实践——Logistic Regression_第3张图片

 其中的ρ函数便是logistic函数:

PyTorch深度学习实践——Logistic Regression_第4张图片

函数图像:

PyTorch深度学习实践——Logistic Regression_第5张图片

   通过函数图像我们可以分析得出: 当x趋于无穷大,y趋向1,x趋于无穷小,y为0,当x=0时,y的值为0.5(可以理解为输出的概率值),它的导函数类似与一种正态分布的函数,实际上因为这种正太分布的导函数而产生出logistic函数的

   因此我们对于一个输入x,我们会将输出得到的y_hat代入 ρ(x)函数中复合得到一个[ 0 , 1]区间的概率值(也就是考试通过概率)

   大名鼎鼎的sigmod函数也就来源于这,因为logistics函数很牛,因此我们默认sigmod函数为logistics函数

其他sigmoid函数:

 PyTorch深度学习实践——Logistic Regression_第6张图片

 对于相应的损失函数也会进行相应改变:

PyTorch深度学习实践——Logistic Regression_第7张图片

          原来的线性模型的loss计算的是y_hat与真实y的偏移度(距离),不断更新参数使得距离最小化,但现在的loss计算的是一个概率分布的差异,而这又要提到交叉熵来计算分布的差异,

           PyTorch深度学习实践——Logistic Regression_第8张图片

   假定Pd为y的真实输出概率,Pt为y_hat输出概率,则我们希望通过交叉熵的得到的两者概率分布差异越小越好,在本次列子中,采用二分类的交叉熵来计算概率分布差异

     当y=1时,y_hat越大损失越小,而当y_hat越接近1时,loss最小,当y = 0时候,y_hat越小越好,当y_hat接近0时候,得到的loss最小,我们根据这种目标函数,我们求loss最小值时,能够使得分布项y_hat尽可能的逼近真实y分类值,这种损失函数也叫BCEloss

PyTorch深度学习实践——Logistic Regression_第9张图片

   注:Mini-Batchs将损失进行平均来进行训练模型

代码展示: 

import torch
import torch.nn.functional as F

#数据准备
x_data = torch.Tensor([[1.0],[2.0],[3.0]])
y_data = torch.Tensor([[0],[0],[1]])

#模型搭建
class LogisticRegressionModel(torch.nn.Module):
    def __init__(self):
        super(LogisticRegressionModel,self).__init__()
        self.linear = torch.nn.Linear(1,1)

    def forward(self,x):
        y_pred = F.sigmoid(self.linear(x))
        return y_pred
model = LogisticRegressionModel()

#优构造损失函数和优化器
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.item())

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
'''print("w=",model.linear.weight.item())
print("b=",model.linear.bias.data)
x_test = torch.tensor([[5.0]])
y_test = model(x_test)
print('y_pred',y_test.item())'''



#使用matplotlib进行绘图
import numpy as np
import matplotlib.pyplot as plt
import os
os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE"

x = np.linspace(0,40,400)#对x进行采样采取200个点
x_t = torch.Tensor(x).view((400,1))#将采样点构建成200*1的矩阵
y_t = model(x_t)
y = y_t.data.numpy()#拿到n维的输出数组
plt.plot(x,y)
plt.plot([0,40],[0.5,0.5],c='r')
plt.xlabel('Hours')
plt.ylabel('Probability of Pass')
plt.grid()
plt.show()

绘图展示:

PyTorch深度学习实践——Logistic Regression_第10张图片

   本人小白一枚,刚入深度学习坑,纯粹自我总结,看待问题的高度肯定也不如大佬们,有问题请大佬指出!不胜感激!

   

      

你可能感兴趣的:(pytorch深度学习,pytorch,深度学习,机器学习)