Рубрики
Без рубрики

Логистическая регрессия с нуля в Python [Algorithm объяснил]

Цель этого руководства является реализация нашей собственной логистической регрессии с нуля. Это будет отличаться от нашего предыдущего учебника на то же самое

Автор оригинала: Pankaj Kumar.

Логистическая регрессия с нуля в Python [Algorithm объяснил]

Цель этого руководства является реализация нашей собственной логистической регрессии с нуля. Это будет отличаться от нашего предыдущего учебника на той же теме, где мы использовали встроенные методы для создания функции.

Логистическая регрессия – это классический метод, в основном используется для проблем с двоичными классификациями. Несмотря на то, что его можно использовать для проблем классификации многоклассных классификаций с некоторой модификацией, в этой статье мы выполним бинарную классификацию.

Реализация логистической регрессии с нуля

Шаг за шагом мы распустим алгоритм, чтобы понять его внутреннюю работу и, наконец, создаст наш собственный класс.

Шаг-1: Понимание функции сигмовидной

Сигмовидная функция В логистической регрессии возвращает значение вероятности, которое затем может быть сопоставлено на два или более дискретных классов. Учитывая набор входных переменных, наша цель – назначить точку данных в категорию (либо 1 или 0). Сигмовидная функция выводит вероятность входных точек, принадлежащих одному из классов.

#Defining a sigmoid function
def sigmoid(z):
    op = 1/(1 + np.exp(-z)) 
    return op

Шаг 2: функция потери

Функция потери состоит из параметров/весов, когда мы говорим, что мы хотим оптимизировать функцию потери, мы просто называем поиск лучших значений параметров/весов.

Функция потери для логистической регрессии определяется как:

Функция потери
#Loss Function

def loss(h, y):
    return (-y * np.log(h) - (1 - y) * np.log(1 - h)).mean()

Шаг-3: градиентный спуск

Градиентный спуск является только производным функции потери в отношении его весов.

Мы получаем это после нахождения найти производную функции потери:

Градиент функции потерь
#Gradient_descent

def gradient_descent(X, h, y):
    return np.dot(X.T, (h - y)) / y.shape[0]

Вес обновляются путем вычитания производного (градиентного происхождения) времена курса обучения. Обновление весов:

Обновление весов

Здесь – Альфа это норма обучения.

Положить все это вместе

Давайте создадим класс для компиляции, упомянутых выше. Вот полный код для реализации логистической регрессии с нуля. Мы работали с модулем Python Numpy для этой реализации.

#import required modules
import numpy as np

class LogisticRegression:
    def __init__(self,x,y):      
        self.intercept = np.ones((x.shape[0], 1))  
        self.x = np.concatenate((self.intercept, x), axis=1)
        self.weight = np.zeros(self.x.shape[1])
        self.y = y
        
    #Sigmoid method
    def sigmoid(self, x, weight):
        z = np.dot(x, weight)
        return 1 / (1 + np.exp(-z))
    
    #method to calculate the Loss
    def loss(self, h, y):
        return (-y * np.log(h) - (1 - y) * np.log(1 - h)).mean()
    
    #Method for calculating the gradients
    def gradient_descent(self, X, h, y):
        return np.dot(X.T, (h - y)) / y.shape[0]

    
    def fit(self, lr , iterations):
        for i in range(iterations):
            sigma = self.sigmoid(self.x, self.weight)
            
            loss = self.loss(sigma,self.y)

            dW = self.gradient_descent(self.x , sigma, self.y)
            
            #Updating the weights
            self.weight -= lr * dW

        return print('fitted successfully to data')
    
    #Method to predict the class label.
    def predict(self, x_new , treshold):
        x_new = np.concatenate((self.intercept, x_new), axis=1)
        result = self.sigmoid(x_new, self.weight)
        result = result >= treshold
        y_pred = np.zeros(result.shape[0])
        for i in range(len(y_pred)):
            if result[i] == True: 
                y_pred[i] = 1
            else:
                continue
                
        return y_pred
            

Для реализации алгоритма мы определили подходит Метод, который требует скорости обучения и количества итераций в качестве входных аргументов.

Вышеуказанный класс может быть инициализирован путем предоставления входных данных и целевых значений.

Теперь пришло время проверить нашу реализацию.

from sklearn.datasets import load_breast_cancer

#Loading the data
data = load_breast_cancer()

#Preparing the data
x = data.data
y = data.target

#creating the class Object
regressor = LogisticRegression(x,y)

#
regressor.fit(0.1 , 5000)


y_pred = regressor.predict(x,0.5)

print('accuracy -> {}'.format(sum(y_pred == y) / y.shape[0]))

Выход:

fitted successfully to data
accuracy -> 0.9209138840070299

Наша внедренная модель достигла точности 92%, неплохо.

Вы можете найти ноутбук для этого учебника здесь на моем репозитории Github.

Заключение

Эта статья была все о внедрении модели логистической регрессии с нуля, чтобы выполнить задачу двоичного классификации. Мы также разворачиваем внутреннюю работу алгоритма регрессии путем кодирования его от 0.

Пока мы не встретимся в следующий раз. Счастливое обучение!