逻辑回归

  • pytorch实现逻辑回归
  • pytorch实现多特征回归


pytorch实现逻辑回归

逻辑回归是什么从的分变成是否通过的二分类问题:

python逻辑回归模型怎么预测 逻辑回归 pytorch_深度学习

在线性数据上加上了非线性的数据处理sigmoid

python逻辑回归模型怎么预测 逻辑回归 pytorch_深度学习_02

除了sigmoid还有很多激活函数像:

python逻辑回归模型怎么预测 逻辑回归 pytorch_python逻辑回归模型怎么预测_03

在神经网络层到变化:

python逻辑回归模型怎么预测 逻辑回归 pytorch_神经网络_04

单个样本点的loss损失变化情况:

python逻辑回归模型怎么预测 逻辑回归 pytorch_神经网络_05


样本总体loss的变化情况

python逻辑回归模型怎么预测 逻辑回归 pytorch_数据_06

import torch

class LogisticRegressionModel(torch.nn.Module):
    def __init__(self):
        super(LogisticRegressionModel, self).__init__()
        # bias=True一定是真,因为存在截距
        self.linear = torch.nn.Linear(1 , 1 , bias=True )

    def forward(self, x):
        # 添加饱和函数处理
        y_pred = torch.sigmoid(self.linear(x))
        return y_pred


# 创建分类数据
x_data = torch.Tensor([[1.0], [2.0], [3.0],])
y_data = torch.Tensor([[0],[0],[1],])

# 创建对象
model = LogisticRegressionModel()
# 创建评估模型
criterion = torch.nn.BCELoss(size_average=True)
# 创建迭代模型
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

for epoch in range(1000):
    # 获取预测值
    y_pred = model.forward(x_data)
    print(y_pred.data)
    # 获取损失函数
    loss = criterion(y_pred, y_data)
    print(epoch,loss.item())
    
    # 将迭代权值的各个参数和计算图进行清零,防止loss.backward()反向传播的计算图重叠效应
    optimizer.zero_grad()
    # 返回计算图
    loss.backward()
    # 按照实例化时的数据和loss.backward()返回的计算图运行迭代权值
    optimizer.step()

pytorch实现多特征回归

# 乳腺癌数据集
from sklearn.datasets import load_breast_cancer
import pandas as pd
cancer = load_breast_cancer()
data=pd.DataFrame(cancer.data)
t=pd.Series(cancer.target)
a=pd.concat([data,t],axis=1)

关于数据集:

从0到29列均为特征,最后为结果

python逻辑回归模型怎么预测 逻辑回归 pytorch_数据_07

对于网络层一次直接从数据多维到数据结果即一维度,就是乘上相应的矩阵,使原始矩阵变成一维。

python逻辑回归模型怎么预测 逻辑回归 pytorch_python逻辑回归模型怎么预测_08


在网络层构建的时候我们为了将网络层复杂化,使之学习特征的能力更加强,通常会增加网络层的数量,同时对于每一层的数据进行升维或者降维,并且为了更好的模拟数据非线性的关系,通常会增加相应的激活函数σ,使原来的线性关系变为非线性关系,同时具有线性和非线性的特征关系。虽然模型有了很好的学习效果,但是对于大部分数据集有很多噪声,我们很可能在学习过程中对于很多噪声拟合程度相当高,导致模型在训练集效果很好,但是在测试集效果就不是特别理想。

python逻辑回归模型怎么预测 逻辑回归 pytorch_深度学习_09


常见的激活函数

python逻辑回归模型怎么预测 逻辑回归 pytorch_深度学习_10

即使有了这种非线性关系和多维数据特征,但是我们的结果还是二分类的,所以损失函数和梯度下降没有变化。

python逻辑回归模型怎么预测 逻辑回归 pytorch_深度学习_11

import torch
import matplotlib.pyplot as plt
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split


class LogisticRegressionModel(torch.nn.Module):
    def __init__(self):
        super(LogisticRegressionModel, self).__init__()
        # 构建三种线性函数作为神经网络的层
        self.linear1 = torch.nn.Linear(x_data.shape[1], 20, bias=True)
        self.linear2 = torch.nn.Linear(20, 10, bias=True)
        self.linear3 = torch.nn.Linear(10, 1, bias=True)
        # 用ReLU作为激活函数,在线性回归的基础之上增加模型复杂度
        self.active = torch.nn.ReLU()

    def forward(self, x):
        # 通过ReLU函数使数据具有非线性的性质
        y_pred = self.active(self.linear1(x))
        y_pred = self.active(self.linear2(y_pred))
        # 防止ReLU生成零数据,最后用sigmoid激活
        y_pred = torch.sigmoid(self.linear3(y_pred))
        return y_pred


# 数据加载
cancer = load_breast_cancer()
x_train, x_test, y_train, y_test = train_test_split(cancer.data, cancer.target, test_size=0.3, random_state=0)

# 创建被训练的数据
x_data = torch.Tensor(x_train)
y_data = torch.Tensor(y_train.reshape(-1, 1))

# 创建对象
model = LogisticRegressionModel()
# 创建评估模型
criterion = torch.nn.BCELoss(size_average=True)
# 创建迭代模型
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)

loss_list = []  # 记录训练集loss
test_loss_list = []  # 记录测试集loss
for epoch in range(50):
    # 获取预测值
    y_pred = model.forward(x_data)

    # 获取训练集损失值
    loss = criterion(y_pred, y_data)
    loss_list.append(loss.item())

    # 获取测试集损失值
    test_loss = criterion(model.forward(torch.Tensor(x_test)), torch.Tensor(y_test.reshape(-1, 1)))
    test_loss_list.append(test_loss.item())

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    
plt.plot(range(50), loss_list, label="train")
plt.plot(range(50), test_loss_list, label="test")
plt.xlabel("epoch")
plt.ylabel("loss")
plt.legend()
plt.show()

python逻辑回归模型怎么预测 逻辑回归 pytorch_神经网络_12