Logistic Regression

1. Logistic Model

It is actually Sigmoid!

2. Define the Loss Function

A L2 Loss function such as Least Squared Error will do the job.

3. Utilize the Gradient Descent Algorithm

You might know that the partial derivative of a function at its minimum value is equal to 0. So gradient descent basically uses this concept to estimate the parameters or weights of our model by minimizing the loss function.

Python Implementation

# Importing libraries
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from math import exp

# Preparing the dataset
data = pd.DataFrame({'feature' : [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15], 'label' : [0,0,0,0,0,0,0,1,1,1,1,1,1,1,1]})
# Divide the data to training set and test set
X_train, X_test, y_train, y_test = train_test_split(data['feature'], data['label'], test_size=0.30)

## Logistic Regression Model
# Helper function to normalize data
def normalize(X):
    return X - X.mean()

# Method to make predictions
def predict(X, theta0, theta1):
    # Here the predict function is: 1/(1+e^(-x))
    return np.array([1 / (1 + exp(-(theta0 + theta1*x))) for x in X])

# Method to train the model
def logistic_regression(X, Y):
    # Normalizing the data
    X = normalize(X)

    # Initializing variables
    theta0 = 0
    theta1 = 0
    learning_rate = 0.001
    epochs = 300

    # Training iteration
    for epoch in range(epochs):
        y_pred = predict(X, theta0, theta1)

        ## Here the loss function is: sum(y-y_pred)^2 a.k.a least squared error (LSE)
        # Derivative of loss w.r.t. theta0
        theta0_d = -2 * sum((Y - y_pred) * y_pred * (1 - y_pred))
        # Derivative of loss w.r.t. theta1
        theta1_d = -2 * sum(X * (Y - y_pred) * y_pred * (1 - y_pred))

        theta0 = theta0 - learning_rate * theta0_d
        theta1 = theta1 - learning_rate * theta1_d
    
    return theta0, theta1

# Training the model
theta0, theta1 = logistic_regression(X_train, y_train)   

# Making predictions
X_test_norm = normalize(X_test)
y_pred = predict(X_test_norm, theta0, theta1)
y_pred = [1 if p >= 0.5 else 0 for p in y_pred]

# Evaluating the model
print(list(y_test))
print(y_pred)

Last updated