PyTorch深度学习实践——Logistic Regression

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

logistic回归是什么?

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

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

为什么要采用logistics回归?

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

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

                                   

      对于给出的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回归模型?

      举出一个最简单的分类任务问题:二分类任务

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

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

  

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

函数图像:

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

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

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

其他sigmoid函数:

 

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

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

           

   假定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

   注: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()

绘图展示:

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

   

      

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 实现竖直逻辑回归可以使用Python编程。 1. 导入必要的库,如NumPy,pandas,scikit-learn等。 2. 加载训练数据,并将数据清理和预处理为合适的格式。 3. 选择适当的逻辑回归模型并训练模型,使用训练数据。 4. 评估模型的性能,例如使用准确率,精确率,召回率等。 5. 使用模型对新数据进行预测。 这是一个简单的竖直逻辑回归的实现流程。您可以在网上找到许多代码示例来帮助您开始。 ### 回答2: 在Python编程中实现垂直逻辑回归有多种方法。以下是一种简单的实现: 首先,我们需要导入所需的库: ```python import numpy as np import pandas as pd from sklearn.linear_model import LogisticRegression ``` 接下来,我们需要准备数据。我们可以使用Pandas库来读取和准备数据,确保数据集中的特征已被正确编码和缩放。 ```python # 读取数据 data = pd.read_csv('data.csv') # 提取特征和标签 X = data.drop('target', axis=1) y = data['target'] ``` 然后,我们可以使用Sklearn库中的逻辑回归模型来创建模型实例,并使用我们的数据进行训练。 ```python # 创建逻辑回归模型实例 model = LogisticRegression() # 拟合模型 model.fit(X, y) ``` 训练完成后,我们可以使用模型对新的数据进行预测。 ```python # 对新数据进行预测 new_data = pd.read_csv('new_data.csv') predictions = model.predict(new_data) ``` 以上就是简单实现垂直逻辑回归的Python代码。请注意,数据准备部分可能需要根据实际情况进行修改,以确保数据和特征的正确性。此外,还可以通过调整模型超参数和进行交叉验证等方法来优化模型的性能。 ### 回答3: 垂直逻辑回归是一种用于处理二分类问题的机器学习算法。Python中的Scikit-learn库提供了一个方便的方式来实现垂直逻辑回归。 首先,我们需要导入所需的库和模块。下面的代码演示了如何导入Scikit-learn库中的垂直逻辑回归模块: ```python from sklearn.linear_model import LogisticRegression ``` 然后,我们需要准备训练数据和目标变量。训练数据是用来训练垂直逻辑回归模型的输入特征,而目标变量是与每个训练数据对应的类别标签。例如,如果我们想根据花朵的特征来预测它是否属于某种花的分类,那么训练数据将包括花朵的特征,目标变量将包含花朵的分类标签。 接下来,我们可以创建垂直逻辑回归模型的实例,并将训练数据和目标变量传递给模型的fit()方法进行训练。训练过程将根据给定的数据,学习模型的参数。 ```python # 创建垂直逻辑回归模型的实例 model = LogisticRegression() # 使用训练数据和目标变量来训练模型 model.fit(X_train, y_train) ``` 在训练完成后,我们可以使用模型进行预测。我们可以将测试数据传递给模型的predict()方法,该方法将返回预测的类别标签。 ```python # 使用测试数据进行预测 y_pred = model.predict(X_test) ``` 最后,我们可以使用一些性能指标来评估模型的性能,例如准确率、精确率、召回率等。 ```python from sklearn.metrics import accuracy_score, precision_score, recall_score # 计算准确率 accuracy = accuracy_score(y_test, y_pred) # 计算精确率 precision = precision_score(y_test, y_pred) # 计算召回率 recall = recall_score(y_test, y_pred) ``` 这些就是在Python编程中实现垂直逻辑回归的基本步骤。请注意,实际应用中,还可以对数据进行预处理、特征选择,以及调整模型的超参数来优化模型性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值