Автор оригинала: 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.
Пока мы не встретимся в следующий раз. Счастливое обучение!