В моей последней статье я объяснил линейную регрессию, которая используется для прогнозирования непрерывной стоимости, такой как цена акции или дома. Значение может быть любым действительным числом. Но есть еще одна важная проблема в машинном обучении - проблема классификации. В этой статье будет рассказано, как работает логистическая регрессия и как ее можно использовать для решения проблемы классификации. Если вы не читали мою последнюю статью (https://ahaanpandya.medium.com/linear-regression-explained-868914443188), настоятельно рекомендую прочитать ее перед этим.

Бинарная классификация

Сначала мы рассмотрим двоичную классификацию, которая включает в себя разделение входных данных только на два класса. Например, определение того, есть ли у человека опухоль или нет, электронное письмо является спамом или не спамом, покупатель купит продукт или нет и т. Д. Давайте рассмотрим пример, в котором мы попытаемся определить, купит ли покупатель продукт. или не используя пол, возраст и зарплату человека. Компьютеры хорошо работают с числами, поэтому мы будем использовать 0 и 1 для двух классов, где 0 означает, что покупатель не покупал продукт, а 1 означает, что покупатель действительно купил продукт. В линейной регрессии у нас была функция гипотез с тета в качестве параметра, который мы могли использовать для прогнозирования значений.

Функция гипотезы для логистической регрессии аналогична, но с некоторыми изменениями.

Функция, которую мы использовали в этой гипотезе, называется сигмоидной / логистической функцией. Эта функция очень полезна, потому что это нелинейная функция, которая выводит от 0 до 1. Результатом нашей функции гипотез является вероятность того, что наша модель считает, что значение x принадлежит классу 1. Итак, если у нас есть новое значение x для которого мы хотим спрогнозировать класс, мы вставляем новое значение x в нашу функцию гипотезы. Например, если функция гипотезы выдает 0,3, тогда модель считает, что значение x принадлежит классу 1 с вероятностью 30%, что должно означать, что вероятность, что она считает, что значение x принадлежит классу 0, составляет 70%, поэтому модель будет предсказывать класс 0. Если функция гипотезы выдает 0,5, что означает, что модель считает, что значение x принадлежит классу 1 с вероятностью 50%, что также означает, что она также считает, что она принадлежит классу 0 с вероятностью 50%, тогда мы можем предсказать любой из двух классов. Вопрос в том, как мы найдем параметры тета? Мы создадим функцию стоимости, которая будет измерять ошибку и минимизировать ее с помощью градиентного спуска.

Функция затрат / убытков

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

Теперь мы готовы увидеть функцию стоимости.

Прежде чем вы будете ошеломлены, позвольте мне объяснить эту функцию затрат и почему мы выбрали именно эту функцию затрат. Допустим, фактический результат для обучающего примера - это класс 1, но наша модель выводит что-то близкое к 0, например 0,1, что означает, что наша модель считает, что это более вероятный класс 0. Эта функция стоимости будет уходить в бесконечность, когда выход нашей модели приближается к 0 что означает, что модель будет сильно наказана функцией стоимости. Это также работает и в обратном направлении, где, допустим, фактический результат соответствует классу 0, но наша модель выдает ближе к 1, тогда функция стоимости снова уходит в бесконечность, что означает, что модель снова будет сильно наказана. Если модель предсказывает правильный ответ, тогда наша функция стоимости будет равна 0, поэтому модель будет вознаграждена функцией стоимости. Это то, что делает эту функцию стоимости такой подходящей для задачи классификации. Теперь мы можем минимизировать функцию стоимости, используя градиентный спуск. Если вы читали мою статью о линейной регрессии, градиентный спуск не должен быть для вас новым, но я все же быстро резюмирую ее.

Реализация Python

Теперь, когда мы знаем, как работает этот алгоритм, теперь мы можем использовать реализацию в Python для решения задачи классификации. Логистическая регрессия - гораздо более сложный алгоритм, чем линейная регрессия, поэтому мы не будем реализовывать его с нуля. Вместо этого мы будем использовать модель логистической регрессии из библиотеки sklearn. Мы спрогнозируем, купит ли клиент товар, исходя из его пола, заработной платы и возраста. Мы будем использовать набор данных, найденный здесь: https://www.kaggle.com/dragonheir/logistic-regression

Примечание. Я буду использовать Pandas и Numpy, которые являются библиотеками науки о данных Python, и если вам неудобно работать с Numpy и Pandas, вы можете найти учебник по этим библиотекам.

import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
data_frame = pd.read_csv('/Social_Network_Ads.csv')
data_frame.Gender = pd.Categorical(data_frame.Gender).codes
X = data_frame[['Gender', 'Age', 'EstimatedSalary']]
y = data_frame['Purchased']
X = X.to_numpy()
y = y.to_numpy()
scaler = MinMaxScaler()
scaler.fit(X)
X = scaler.transform(X)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

В этом фрагменте кода мы сначала начинаем с чтения данных из файла csv и присваиваем значения x и y. В столбце «Пол» есть слова «женский» и «мужской», поэтому мы заменяем их на 0 и 1 с помощью pd.Categorical (). Затем мы масштабируем все значения x между 0 и 1, а затем разделяем данные на данные обучения и данные тестирования.

model = LogisticRegression()
model.fit(X_train, y_train)
def pred(x_value):
    x_value = scaler.transform([x_value])
    print(model.predict(x_value))

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

print(model.score(X_train, y_train))

Мы можем использовать эту функцию, чтобы распечатать точность модели. Я получил точность около 90%, что просто фантастика. Это для реализации логистической регрессии в Python.

Мультиклассовая классификация (алгоритм «один против всех»)

Это будет короткий раздел, объясняющий мультиклассовую классификацию, потому что мультиклассовая классификация - это, по сути, двоичная классификация с некоторыми изменениями. В этом типе классификации у вас есть несколько функций гипотез. Например, если у вас 4 класса, скажем, синий, желтый, зеленый и красный, вы разделите их на 4 задачи двоичной классификации. Вы создадите одну функцию гипотезы для того, если наше значение x синее или не синее, затем вы создадите функцию гипотезы для того, желтое или нет ваше значение x, и аналогично для всех классов. Когда вы хотите предсказать классы для нового значения x, вы используете все функции гипотез, и какая бы из них ни имела наивысшее значение, вы возвращаете этот класс. Реализация мультиклассовой классификации в Python идентична бинарной классификации, поэтому я не буду показывать это здесь.

Вывод

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

Спасибо за чтение!