"Машинное обучение"

Линейные модели для классификации, логистической регрессии, с библиотекой sklearn и без нее

В этой статье дедуктивно раскрывается тема логистической регрессии, которая представляет собой линейные модели для классификации. В нем объясняется, как алгоритм логистической регрессии работает математически, как он реализован с библиотекой sklearn и, наконец, как он реализован в python с математическими уравнениями без библиотеки sklearn. Кроме того, объясняется мультиклассовая классификация линейных моделей.

Table of Contents (TOC)
---- Introduction
---- Linear Models for Classification without Sklearn
---- Linear Models for Classification with Sklearn
-----Linear Models for Multiclass Classification

Вступление

Линейные модели используются как для классификации, так и для регрессии. Один из них, Логистическая регрессия, используется для двоичной классификации, а не для его названия. Бинарная классификация означает, что набор данных включает 2 выхода (класса). Кроме того, логистическая регрессия является фундаментальной частью нейронных сетей. Он работает над минимизацией ошибки (стоимости) на каждой итерации, обновляя начальные значения, установленные пользователем. На рисунке 1 показана блок-схема того, как набор данных с 4 объектами и 2 классами классифицируется с помощью логистической регрессии.

  1. В обучающей части логистической регрессии каждому признаку присваивается 1 вес, а системе добавляется 1 значение смещения.
  2. Эти значения весов и смещения инициализируются значениями, выбранными пользователем.
  3. Каждый вес умножается на собственные значения характеристик и добавляется путем добавления значения смещения.
  4. К сумме применяется функция активации (рис. 2), которую выбирает пользователь.
  5. Когда мы предполагаем, что это была сигмовидная функция, функция активации (сумма) принимает значение от 0 до 1, и по этому значению рассчитывается ошибка.
  6. Согласно рассчитанному значению ошибки, значения весов и смещения обновляются с градиентным спуском (нажмите здесь) со скоростью обучения.
  7. Этот процесс повторяется столько раз, сколько итераций. Теперь давайте реализуем вышеупомянутые процессы в наборе данных о раке груди с кодами.

Линейные модели для классификации без библиотеки Sklearn

Набор данных импортируется, значения функций нормализуются с помощью MinMaxScaler, а данные разделяются с помощью train_test_split.

IN[1]
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_breast_cancer
data = load_breast_cancer()
x=data.data
y=data.target
print("shape of data:",x.shape)
from sklearn.preprocessing import MinMaxScaler
scaler=MinMaxScaler()
x_new=scaler.fit_transform(x)
OUT[1]
shape of data: (569, 30)
IN[2]
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x_new,y,test_size = 0.15,random_state=2021)
x_train = x_train.T
x_test = x_test.T
y_train = y_train.T
y_test = y_test.T

Начальные значения установлены, так как вес равен 0,1, а начальное смещение равно 1. Применяется уравнение сигмоидной функции.

IN[3]
def weights_bias(shape):
    weights = np.full((shape,1),0.1)
    bias = 1
    return weights,bias
IN[4]
def sigmoid(z):  
    y_predict = 1/(1+ np.exp(-z))
    return y_predict

Прямое и обратное распространение рассчитаны следующим образом.

IN[5]
def forward_backward(w,b,x_train,y_train):
    z = np.dot(w.T,x_train) + b
    y_predict = sigmoid(z)
    derivative_weight = (np.dot(x_train,((y_predict-y_train).T)))/x_train.shape[1]
    derivative_bias = np.sum(y_predict-y_train)/x_train.shape[1]                 
    gradients = {"derivative_weight": derivative_weight, "derivative_bias": derivative_bias}
    return gradients

Исходные значения обновили скорость обучения и количество итераций.

IN[6]
def update_parameters(w, b, x_train, y_train, learning_rate,iterations):
    index = []
    for i in range(iterations):
        gradients = forward_backward(w,b,x_train,y_train)
        w = w - learning_rate * gradients["derivative_weight"]
        b = b - learning_rate * gradients["derivative_bias"]
    parameters = {"weight": w,"bias": b}
    return parameters, gradients

Последним шагом архитектуры является прогнозирование текущего ввода, и если сигмоидальная функция (сумма) ≤0,5, она принадлежит классу 0, а если сигмоидальная функция (сумма) ›0,5, она принадлежит классу 1.

IN[7]
def predict(w,b,x_test):
    z = sigmoid(np.dot(w.T,x_test)+b)
    y_prediction = np.zeros((1,x_test.shape[1]))
    for i in range(z.shape[1]):
        if z[0,i]<= 0.5:
            y_prediction[0,i] = 0
        else:
            y_prediction[0,i] = 1
    return y_prediction

Теперь давайте объединим их все и протестируем с Learning_rate = 0.1 и количеством итераций = 100:

IN[8]
def logistic_regression(x_train, y_train, x_test, y_test, learning_rate ,  iterations):
    shape =  x_train.shape[0]
    w,b = weights_bias(shape)
    parameters, gradients = update_parameters(w, b, x_train, y_train, learning_rate,iterations)
    y_prediction_test = predict(parameters["weight"],parameters["bias"],x_test)
    print("test accuracy: {}% ".format(100 - np.mean(np.abs(y_prediction_test - y_test)) * 100))
    
logistic_regression(x_train, y_train, x_test, y_test,learning_rate = 0.1, iterations = 100)
OUT[8]
test accuracy: 91.86046511627907%

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

Линейные модели для классификации с библиотекой Sklearn

Теперь давайте поработаем с тем же набором данных, используя библиотеку sklearn. Когда мы меняем значение гиперпараметра C, видно его влияние на точность модели.

IN[9]
from sklearn.linear_model import LogisticRegression
c_list=[0.001,0.01,0.1,1,10]
for i in c_list:
    lrc = LogisticRegression(C=i).fit(x_train.T,y_train.T)
    lrc_test=lrc.score(x_test.T,y_test.T)
    lrc_test=round(lrc_test*100,2)
    print("C=",i,"test acc: ", lrc_test,"%")
OUT[9]
C= 0.001 test acc:  63.95 %
C= 0.01 test acc:  77.91 %
C= 0.1 test acc:  93.02 %
C= 1 test acc:  95.35 %
C= 10 test acc:  98.84 %

Как видно, когда значение Control C увеличивается, точность теста также увеличивается. В Sklearn есть множество гиперпараметров для логистической регрессии, и все они доступны по этой ссылке.

Мультиклассовая классификация

Было упомянуто, что для бинарной классификации используется логистическая регрессия. Итак, как мы можем использовать логистическую регрессию, если классов больше 2? Здесь мы встречаем мультиклассовую классификацию, основанную на принципе «один против остальных». Для каждого класса коэффициенты и систематическая ошибка производятся путем сравнения с ним всех остальных классов. На этапе прогнозирования он помещается в наиболее подходящий класс. С помощью библиотеки Sklearn мы можем легко реализовать это, как показано ниже.

IN[10]
from sklearn.datasets import load_digits
digits = load_digits()
x_digit=digits.data
y_digit=digits.target
print("shape of data:",x_digit.shape)
from sklearn.preprocessing import MinMaxScaler
scaler=MinMaxScaler()
x_digit_new=scaler.fit_transform(x_digit)
from sklearn.model_selection import train_test_split
x_digit_train, x_digit_test, y_digit_train, y_digit_test = train_test_split(x_digit_new,y_digit,test_size = 0.20,random_state=2021)
OUT[10]
shape of data: (1797, 64)
IN[11]
from sklearn.linear_model import LogisticRegression
multiclass = LogisticRegression(multi_class='multinomial')
multiclass.fit(x_digit_train,y_digit_train)
multiclass_test=multiclass.score(x_digit_test,y_digit_test)
multiclass_test=round(multiclass_test*100,2)
print("test acc: ", multiclass_test,"%")
OUT[11]
test acc:  95.28 %

Вернуться к руководству нажмите здесь.