Logistics Regression
写在前面的话
前段时间分别和两个研究方向类似的前辈交谈,虽然他们都计划不深造ldp领域,但都会成为优秀的程序员。
有两句话我印象深刻,一句是:“··需要意志坚定。”这句话我就不解释了,自己领会。
一句是,我和前辈说你就可以实现你的程序员梦了,前辈说,这不是梦,它只是一个职业。这两句话,与此时此刻正在看我博客的同学分享。
Logistics Regression理解
虽然叫逻辑斯蒂回归,但是是是二分类问题。本来我们的目标是训练数据,预测学习4小时后的分数是多大;现在的目标转换成为,训练数据,预测学习x个小时后通过考试的概率是多大。
两种回归比较
第一种是Linear Regression,第二种是Logistics Regression。
第一种是训练样本后,预测值。
第一种和第二种的比较,第一个是回归(左边),第二个是分类(右边)。线性模型和逻辑斯蒂回归的明显区别是在线性模型的后面,添加了激活函数(非线性变换)
在分类中,P(y^=1) + P(y^=0) = 1。在分类中,模型的输出是输入属于确切类别的概率。
第二种,Logistics回归,是将值y映射到[0,1]中。我们经常叫Logistics回归叫做Sigmoid函数。
代码实现
步骤:
1.准备训练的数据集
2.使用类设计模型,继承nn.Module模型
3.构造损失和优化器,使用pytorch API
criterion:标准 ; optimizer:优化器
4.训练循环,forward,backward,update
5.绘图。提供新的数据集,x∈[0,10],取200个点,预测每个点通过的概率是多大。绘制p为0.5的直线,观察交点,发现,当x=2.5h的时候刚好概率为0.5,此时不能确定是否通过考试。 我们也可以看到,在直线上方的对应的时间就是能通过考试的,在直线下方的对应的时间就是不能通过考试的。
import numpy as np
import matplotlib.pyplot as plt
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]])
# 使用类设计模型,继承nn.Module模型
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)) #这里需要把原来的输出y传给sigmoid,即实现的区间的映射
return y_pred
model = LogisticRegressionModel()
# 构造损失和优化器,使用pytorch API criterion:标准 ; optimizer:优化器
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)
print(epoch,loss.item)
optimizer.zero_grad()
loss.backward()
optimizer.step()
x = np.linspace(0,10,200) # 每周学习0~10小时,采200个点
x_t = torch.Tensor(x).view((200,1)) # 类似reshape()的作用,变成200行一列
y_t = model(x_t)
y = y_t.data.numpy() # numpy的意思是转换成n维数组
plt.plot(x,y)
plt.plot([0,10],[0.5,0.5],c='r')
plt.xlabel('Hours')
plt.ylabel('Probability of Pass')
plt.grid()
plt.show()
补充知识
torch.sigmoid()、torch.nn.Sigmoid()和torch.nn.functional.sigmoid()三者之间的区别
import torch
import torch.nn as nn
import torch.nn.functional as F
x = torch.tensor([0.5, -0.5, 1.0])
# 使用torch.sigmoid()
output = torch.sigmoid(x)
print(output) # 输出: tensor([0.6225, 0.3775, 0.7311])
# 使用torch.nn.Sigmoid()
sigmoid = nn.Sigmoid()
output = sigmoid(x)
print(output) # 输出: tensor([0.6225, 0.3775, 0.7311])
# 使用torch.nn.functional.sigmoid()
output = F.sigmoid(x)
print(output) # 输出: tensor([0.6225, 0.3775, 0.7311])