From Linear Regression to Binary Classification
1. The Differences between Regression and Classification
Through the picture above we can tell the differences between regression and classification. In regression, the output of a model is the predicted value based on input. However, in classification, the output of is the
probability of input which belongs to an exact class.
2. The Analysis of a Binary Classification Problem
The analysis below is based on the picture displayed in the first section.
Since the range of a probability is from 0 to 1, we are supposed to use a function called logistic function to restrict the value.
The loss function of binary classification is different from the loss function of linear regression because of the appearance of the logistic function.
If y=0,
If y=1,
You can see that the closer between y and hat{y}, the smaller will be the loss.
3. The Code
First, import those modules we need later and prepare for the dataset.
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]])
Second, create a class inheriting from torch.nn module to 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()
You may be aware that the name of the class is LogisticRegressionModel.
However, it does be designed to solve a binary classification problem.
Third, construct loss and optimizer.
criterion = torch.nn.BCELoss(size_average=False)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
Last comes the training cycle.
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()
Here comes the result.
4. Using Numpy and Matplotlib to Display the Result
Here is the code.
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 10, 200)
x_t = torch.Tensor(x).view((200, 1))
y_t = model(x_t)
y = y_t.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()
plt.show()
And here comes the result.
That’s all. Thanks for your attention.