Существует множество пакетов и фреймворков для машинного обучения, которые помогают вам обучать вашу модель, но они не показывают, что происходит за сценой, что происходит с вашими данными на каждом этапе и какие математические расчеты используются, поэтому для этой цели в этой статье я собираюсь реализовать алгоритм логистической регрессии с нуля без какой-либо основы.
набор данных, который я собираюсь использовать, — это набор данных цветка ириса, который вы можете найти здесь.
Набор данных о цветке ириса представляет собой многомерный набор данных, представленный британским статистиком и биологом Рональдом Фишером в его статье 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 скрыто.