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

Основното приложение на логистичната регресия е да се определи граница на решение за проблем с двоична класификация. Въпреки че базовата линия е да се идентифицира граница на двоично решение, подходът може да се приложи много добре за сценарии с множество класове за класификация или класификация с множество класове.

Каква е границата на решението?

В горната диаграма пунктираната линия може да бъде идентифицирана като граница на решение, тъй като ще наблюдаваме екземпляри от различен клас от всяка страна на границата. Нашето намерение в логистичната регресия би било да вземем решение за правилното прилягане към границата на решението, така че да можем да предвидим на кой клас може да съответства нов набор от функции. Интересният факт за логистичната регресия е използването на сигмоидната функция като оценител на целевия клас. Нека да разгледаме интуицията зад това решение.

Сигмоидната функция

Сигмоидната функция за параметър zможе да бъде представена по следния начин. Обърнете внимание, че функцията винаги е в диапазона от 0 до 1, като границите са асимптотични. Това също ни дава перфектно изходно представяне на вероятностите.

Моделиране на двоична класификация като вероятностна функция

След като знаем, че нашата сигмоидна функция е между 0 и 1, можем да представим вероятностите на класа по следния начин.

Тук θозначава оценения вектор на параметъра, а Xе векторът на разглежданите променливи.

X = X0, X1 ... Xn    <- n Features and X0=1
θ = θ0, θ1 ... θn    <- Parameters to be estimated

Оценка на параметри и функция на разходите

Сега, след като сме запознати с функционална оценка за нашите вероятности, ще измислим начин да оценим параметрите, представени от θ вектор. За това упражнение нека разгледаме следния пример.

Имаме набор от данни с две функции и два класа. Нашата цел е да открием правилните стойности на θза двете характеристики. Това може да се моделира по следния начин.

h(θ)е оценката на вероятността или функцията на хипотезата.

Функция загуба/разходи

За момент нека приемем, че можем да използваме средноквадратична грешка (RMS), подобно на линейната регресия. Можете да се обърнете към следната статия за повече информация.



За простота ще начертая вариацията на функцията на разходите спрямо θ[0], което е предубедено спрямо нашия оценител. Това се основава на представянето на нашата целева променлива yда бъде както следва;

Виждаме, че има два локални оптимума. Това е неочаквано и се причинява от поведението на нашата сигмоидна функция. Следователно функцията на разходите е представена по следния начин, което напълно отговаря на нашите очаквания.

Това е частична функция, която има различни дефиниции при различни стойности на y. Идеята е грешната класификация да се санкционира експоненциално. Например, за етикет y=1, ако моделът предвижда h(x)=0, ще имаме първото уравнение, достигащо безкрайност и обратно.

Сега, след като разполагаме с по-добра функция на загубите, нека видим как можем да оценим вектора на параметъра θза този набор от данни.

Градиентно спускане за логистична регресия

Тъй като знаем функцията на загубите, трябва да изчислим производната на функцията на загубите, за да актуализираме нашите градиенти. Може да се направи по следния начин. Цялата тази операция става изключително проста предвид природата на производната на сигмоидната функция. Това ще ни остави със следната функция на загуба.

Обърнете внимание, че това е точната функция загуба/цена на линейна регресия, която обсъдихме в горната статия, която цитирах. Тъй като вече внедрих алгоритъма, в тази статия нека използваме логистичния регресор на пакета python sklearn.

Използване на sklearn Logistic Regression Module

Използването е доста лесно. Важно е обаче да разберем очакваните параметри. Монтирането на модела може да се извърши по следния начин. Тук X е двумерен вектор, а y е двоичен вектор.

from sklearn.linear_model import LogisticRegression
clf = LogisticRegression(random_state=0).fit(X, y)

Прогнозните параметри могат да бъдат определени по следния начин.

print(clf.coef_)
print(clf.intercept_)
>>> [[-3.36656909  0.12308678]]
>>> [-0.13931403]

Коефициентите са множителите на характеристиките. Ние ги представихме в нашия θвектор в индекси 1 и 2. Отсечката е стойността на отклонението на модела.

Използването на логистичната регресия след монтажа може да се извърши по следния начин.

clf.predict_proba([[ 0.8780991 ,  0.89551051]])
>>> array([[0.95190421, 0.04809579]])

Това е прогнозата за всеки клас. Имайте предвид, че общата вероятност е равна на единица. Същото може да се постигне чрез следното изпълнение. h(theta, xi) е функцията за хипотеза, използваща научени theta параметри.

def h(theta, xi):
    return 1/(1 + np.exp(-1*np.dot(xi, theta)))

Обърнете внимание, че съм използвал np.dot() за получаване на матрица или векторно умножение, което е много по-ефективно от използването на forloop. Това също се нарича векторизация. Можем да получим нашата оценка на p(y=1), като използваме следното извикване на функция.

h([-0.13931403, -3.36656909,  0.12308678], [1, 0.8780991 ,  0.89551051])

Обърнете внимание, че използвах нашата стойност за прихващане като първи елемент на параметъра theta и останалите по ред. Добавих допълнително 1 за вектора на характеристиките, който съответства на наученото отклонение.

И накрая, можем да начертаем нашата граница, както следва.

Разширение на логистичната регресия

Логистичната регресия може лесно да бъде разширена, за да предвиди повече от 2 класа. Ще трябва обаче да изградите kкласификатори, за да предвидите всеки от k много класове и да ги обучите, като използвате iсрещу други k- 1часове за всеки клас.

Важни факти

  1. Логистичната регресия е техника за бързо машинно обучение
  2. Повечето от имплементациите използват по-бързи оптимизатори, освен простото градиентно спускане, което обсъждахме
  3. Винаги е разумно да проверявате за съществуването на граница на решение. Може да ви е необходима техника като PCA или t-SNE.

Надявам се да ви е харесало да прочетете тази статия за логистичната регресия. Можете да намерите бележника Jupyer тук.

Малко интересно четиво за любознателните;



наздраве!