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

набор данных, который я собираюсь использовать, — это набор данных цветка ириса, который вы можете найти здесь.

Набор данных о цветке ириса представляет собой многомерный набор данных, представленный британским статистиком и биологом Рональдом Фишером в его статье 1936 года «Использование множественных измерений в таксономических задачах». Его иногда называют набором данных об ирисах Андерсона, потому что Эдгар Андерсон собрал данные для количественной оценки морфологических вариаций цветков ирисов трех родственных видов. Набор данных состоит из 50 образцов каждого из трех видов ириса (Iris Setosa, Iris virginica и Iris versicolor). У каждого образца измеряли четыре характеристики: длину и ширину чашелистиков и лепестков в сантиметрах.

предварительная обработка наших данных

import numpy as np
import scipy.optimize as opt
import pandas as pd
# the get the same random order of row
np.random.seed(4)
#the location of your IRIS.csv
data = pd.read_csv('data/IRIS.csv')
#replace flowers name by numbers 1,2,3
species={'Iris-setosa':0,'Iris-versicolor':1,'Iris-virginica':2}
# reorder the row of the dataset
data  = data.sample(frac=1)
data = data.replace({'species':species})
X = data.iloc[:,:-1].values
y = data.iloc[:,-1].values
y = y[:,np.newaxis]
# split our data 
train_X ,test_X = X[:100,:],X[100:,:]
train_y ,test_y = y[:100,:],y[100:,:]

сигмовидная функция

поскольку мы находимся в задаче классификации, результат нашей гипотезы h(x)функции должен быть только между 1 и 0. поэтому нам нужно использовать сигмовидную функцию g(z):

#sigmoid function code 
def sigmoid(z) : 
    h = 1 / (1 + np.exp(-z))
    return h

функция стоимости

функция стоимости логистической регрессии представлена ​​​​как показано ниже:

#cost function 
def costFunction(theta, X, y):
    m = X.shape[0]
    h = sigmoid(X @ theta)
    temp1 = np.multiply(y,np.log(h))
    temp2 =np.multiply( (1 - y), np.log(1 - h))
    cost = -(1/m)* np.sum(temp1 + temp2) 
    return cost

градиентный спуск

Градиентный спуск продолжает изменять параметры, чтобы постепенно уменьшать функцию стоимости. С каждой итерацией мы будем приближаться к глобальному минимуму. При каждой итерации параметры должны быть адаптированы одновременно! Размер «шага»/итерации определяется параметром альфа (скорость обучения). нам нужно тщательно выбирать альфу, если мы выберем маленькую альфу, функция стоимости замедлится, а если мы выберем большую альфу, наша функция стоимости не сойдется

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

#gradient descent code
def gradient(theta,X,y):
    m = X.shape[0]
    temp = sigmoid(np.dot(X, theta)) - y
    grad = np.dot(temp.T, X).T / m
    
    return grad

оптимизация функции затрат

перед запуском нашей функции оптимизации нам нужно инициализировать наш параметр theta

m = train_X.shape[0] # number of train set row 
m_test = test_X.shape[0] # number of test set row
#add a coulmn of ones the data set (the bias)
train_X = np.hstack(( np.ones((m,1)) ,train_X)) 
test_X = np.hstack(( np.ones((m_test,1)) ,test_X))
# number of classes
k = 3
n =train_X.shape[1]
# initialize theta
theta = np.zeros((n,k))

теперь мы можем запустить нашу функцию оптимизации, и я собираюсь использовать функцию scipy fmin_cg

for i in range(k) :
    theta[:,i] = opt.fmin_cg(
        f=costFunction,
        x0=theta[:,i],
        fprime=gradient,
        args=(train_X,(train_y == i).flatten()),
        maxiter=50
    )

оптимизированное значение параметра тета должно быть примерно таким

print(theta)

теперь давайте проверим точность нашей модели, для этого мы должны использовать данные тестового набора:

prediction = np.argmax(test_X @ theta,axis=1) 
accuracy = np.mean(prediction == test_y.flatten()) * 100
accuracy

вы должны получить 100% точность, так что наша модель работает очень хорошо

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

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