一、逻辑回归
逻辑回归(Logistic Regression)是一种用于解决二分类(0 or 1)问题的机器学习方法,用于估计某种事物的可能性。比如某用户购买某商品的可能性,某病人患有某种疾病的可能性,以及某广告被用户点击的可能性等。 注意,这里用的是“可能性”,而非数学上的“概率”,logisitc回归的结果并非数学定义中的概率值,不可以直接当做概率值来用。该结果往往用于和其他特征值加权求和,而非直接相乘。
逻辑回归是一种常用的分类算法,用于预测二分类问题。它基于线性回归模型,通过将线性回归的结果映射到一个概率值来进行分类。
逻辑回归的基本原理是使用sigmoid函数(也称为逻辑函数)将线性回归的结果转换为概率值。sigmoid函数的公式为:f(x) = 1 / (1 + e^(-x)),其中x为线性回归的结果。sigmoid函数的取值范围在0到1之间,可以表示为样本属于某个类别的概率。
逻辑回归的训练过程是通过最大似然估计来确定模型的参数。通常使用梯度下降算法或者牛顿法来最小化损失函数,使得模型的预测结果与实际标签尽可能接近。
逻辑回归有以下几个特点:
- 简单而高效:逻辑回归是一种线性模型,计算速度快,适用于大规模数据集。
- 可解释性强:逻辑回归可以通过系数来解释特征对分类结果的影响程度。
- 预测概率:逻辑回归可以输出样本属于某个类别的概率,而不仅仅是分类结果。
逻辑回归实现同样是四个步骤:
- 准备数据集
- 设计模型
- 定义损失函数和优化器
- 模型训练
代码:
import numpy as np
import torch
import torch.nn.functional as F
import matplotlib.pyplot as plt
x_data = torch.Tensor([[1.0], [2.0], [3.0]])
y_data = torch.Tensor([[0], [0], [1]])
class LinearModel(torch.nn.Module):
def __init__(self):
super(LinearModel, self).__init__()
self.linear = torch.nn.Linear(1, 1)
def forward(self, x):
y_pred = F.sigmoid(self.linear(x)) # sigmid函数
return y_pred
model = LinearModel()
criterion = torch.nn.MSELoss(reduction='sum')
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:', epoch, 'loss:', loss.item())
optimizer.zero_grad()
loss.backward()
optimizer.step() # 通过step()函数进行参数更新
x = np.linspace(0, 10, 200)
x_t = torch.Tensor(x).view((200, 1))
y_t = model(x_t)
y = y_t.data.numpy()#tensor转化为numpy形式
plt.plot(x, y)
plt.plot([0, 10], [0.5, 0.5], c='r')
plt.xlabel('Hours')
plt.ylabel('Probability of passing')
plt.title('Logistic_Regression')
plt.grid() #添加网格线
plt.show()
生成图:
Sigmoid函数是一种常见的S型函数,通常用于将变量映射到0和1之间。
- sigmoid函数也叫Logistic函数,用于隐层神经元输出,取值范围为(0,1),它可以将一个实数映射 …
该饱和函数的上、下界为(0,1)。 - 具有以下优缺点:
优点:平滑、易于求导。
二、线性回归
线性回归输出是一个连续值,因此适用于回归问题。回归问题在实际中很常见,如预测房屋价格、气温、销售额等连续值的问题。 与回归问题不同,分类问题中模型的最终输出是一个离散值。我们所说的图像分类、垃圾邮件识别、疾病检测等输出为离散值的问题都属于分类问题的范畴。softmax回归则适用于分类问题。
步骤
- 准备数据集
- 设计模型(计算预测值y_hat):从nn.Module模块继承
- 构造损失函数和优化器:使用PytorchAPI
- 训练过程:Forward、Backward、update
代码:
import torch
import matplotlib.pyplot as plt
x_data = torch.Tensor([[1.0], [2.0], [3.0]])
y_data = torch.Tensor([[2.0], [4.0], [6.0]])
class LinearModel(torch.nn.Module):
def __init__(self):
super(LinearModel, self).__init__() # 调用父类构造函数
self.linear = torch.nn.Linear(1, 1)
def forward(self, x):
y_pred = self.linear(x) # 调用linear对象,输入x进行预测
return y_pred
model = LinearModel() #实例化LinearModel()
criterion = torch.nn.MSELoss(reduction='sum') # 定义损失函数,这里使用均方误差作为损失函数
optimizer = torch.optim.SGD(model.parameters(), lr=0.01) # 定义优化器,这里使用随机梯度下降法作为优化器
losses=[]
for epoch in range(100):
y_pred = model(x_data) # 前向传播,计算预测值
loss = criterion(y_pred, y_data) # 计算损失值
print('epoch:', epoch, 'loss:', loss.item())
optimizer.zero_grad() # 梯度清零
loss.backward() # 反向传播,计算梯度
optimizer.step() # 通过step()函数进行参数更新
losses.append(loss.item()) #将每个批次的损失值添加到名为losses的列表中。
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)
plt.plot(losses)
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('SGD')
plt.show()