五、逻辑斯蒂回归(Logistic Regression)
课程链接:Pytorch 深度学习实践——逻辑斯蒂回归
1、分类问题与回归问题的区别
分类与回归最主要的区别是输出变量的类型:连续变量的预测叫回归,离散变量的预测是分类。
回归的主要作用是了解两个或多个变量之间是否相关,相关的方向,相关的强度,并利用数学模型以便观察特定变量来预测研究者感兴趣的变量。分类模型是将回归模型输出离散化,分类和回归模型之间存在重要差异。
根本上来说:分类是关于预测标签——输出属于某个标签的概率值,而回归是关于预测数量。
2、如何映射到[0,1]区间——sigmoid函数: σ = 1 1 + e − x \sigma = \frac{1}{1+e^{-x}} σ=1+e−x1
Logistic Function:
σ = 1 1 + e − x \sigma = \frac{1}{1+e^{-x}} σ=1+e−x1
Logistic Regression Model:
y ^ = σ ( w ∗ x + b ) \hat{y}=\sigma(w*x+b) y^=σ(w∗x+b)
3、Binary Classification 的 Loss 函数——二分类问题的损失函数BCE Loss
l o s s = − ( y l o g y ^ + ( 1 − y ) l o g ( 1 − y ^ ) ) loss=-(ylog\hat{y}+(1-y)log(1-\hat{y})) loss=−(ylogy^+(1−y)log(1−y^))
Mini-Batch : l o s s = − 1 N ∑ n = 1 N ( y n l o g y n ^ + ( 1 − y n ) l o g ( 1 − y n ^ ) ) loss=-\frac{1}{N}\sum_{n=1}^{N} (y_nlog\hat{y_n}+(1-y_n)log(1-\hat{y_n})) loss=−N1∑n=1N(ynlogyn^+(1−yn)log(1−yn^))
4、用Pytorch实现Logistic Regression Model:注意与Linear Model 的区别
①准备数据集
x_data = torch.Tensor([[1.0], [2.0], [3.0]])
y_data = torch.Tensor([[0], [0], [1]])
②设计模型
#design model
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()#创建一个LogisticRegressioMoel类的实例
③使用 Pytorch API 构造损失函数和优化器(optimizer)
#BCELoss类参数:size_average=True/False是否求均值、reduction=True/False是否降维
criterion = torch.nn.BCELoss(size_average=False)
#优化器
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
④编写训练的周期:forward、backward、update
for epoch in range(1000):
y_pred = model(x_data)
loss = criterion(y_pred, y_data)
optimizer.zero_grad() # 在反向传播之前一定要释放梯度
loss.backward() # 反向传播Autograd
optimizer.step() # update
if (epoch % 100 == 0): #output epoch and loss
print('Epoch =' + '\t' + str(epoch) + '\t' + 'Loss =' + '\t' + str(format(loss.item(), '.4f')))
print('')
print('------------------------')
⑤绘制 Result of Logistic Regression
x = np.linspace(0, 10, 200) #0-10之间平均取200个点
x_test = torch.Tensor(x).view((200, 1))
y_test = model(x_test)
y = y_test.data.numpy()
plt.plot(x, y)
plt.plot([0, 10], [0.5, 0.5], c='r')
plt.xlabel('Hours')
plt.ylabel('Probability of Pass')
plt.grid(True)
plt.show()
⑥结果展示
Epoch = 0 Loss = 2.2075
Epoch = 100 Loss = 1.9841
Epoch = 200 Loss = 1.8071
Epoch = 300 Loss = 1.6585
Epoch = 400 Loss = 1.5332
Epoch = 500 Loss = 1.4265
Epoch = 600 Loss = 1.3351
Epoch = 700 Loss = 1.2560
Epoch = 800 Loss = 1.1871
Epoch = 900 Loss = 1.1265