Мухамедиев Равиль Ильгизович - Введение в машинное обучение стр 6.

Шрифт
Фон

Как и в случае с линейной регрессией, для увеличения обобщающей способности алгоритма применяют регуляризацию (последнее слагаемое в нижеследующей формуле), которая позволяет уменьшить влияние величин высокого порядка:



Интересно, что производная функции стоимости логистической регрессии ровно такая же, как и производная функции стоимости линейной регрессии (вывод см., например, в [[38]]). Следовательно, алгоритм градиентного спуска будет работать так же, как и для линейной регрессии (формула 1.5), с тем отличием, что значение функции гипотезы будет вычисляться по формуле 2.8.

Пример. Построим линейный классификатор на основе логистической регрессии. Вначале сгенерируем набор данных и разделим его на тренировочное и тестовое множества:


from sklearn.datasets import make_moons, make_circles, make_classification

from sklearn.model_selection import train_test_split

dataset = make_circles(noise=0.2, factor=0.5, random_state=1)

X_D2, y_D2 = dataset

plt.figure(figsize=(9,9))

plt.scatter(X_D2[:,0],X_D2[:,1],c=y_D2,marker='o',

      s=50,cmap=ListedColormap(['#FF0000','#00FF00']))

X_train, X_test, y_train, y_test = train_test_split(X_D2, y_D2, test_size=.4, random_state=42)


В результате получим распределение данных, показанное на рисунке 1.3.

Вызовем необходимые библиотеки и методы:


import matplotlib.pyplot as plt

import numpy as np

from sklearn.metrics import confusion_matrix, classification_report

from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score


Последние две строки необходимы для оценки точности работы классификатора (см. раздел «Оценка качества методов ML»).

Разработаем логистическую функцию logisticFunction(X,theta) и функцию, обеспечивающую оценку объекта на основе предсказанного значения гипотезы,  logRegPredictMatrix(h,threshold). Как показано выше, функция гипотезы принимает значение от 0 до 1. Для того чтобы получить оценку принадлежности объекта к классу (1 «положительный», 0 «отрицательный»), необходимо для каждого значения гипотезы вычислить номер класса («предсказать») по правилу predicted = 0 If h = threshold. Обычное значение порога threshold=0.5.

Функция, вычисляющая значения коэффициентов логистической регрессии первого порядка:


def logisticRegressionByNumpy(X,y):

   m=y.size

   X=np.concatenate((np.ones([m,1]),X), axis=1)

   theta=np.array(np.random.rand(X.shape[1]))

   h=logisticFunction(X,theta)

   alpha=0.05

   iterations=1500

   lambda_reg=0.01

   for i in range(iterations):

   theta=theta alpha*(1/m) *np.dot(X.T,(h-y))-(lambda_reg/m)*theta

      h=logisticFunction(X,theta)

   return theta,h


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


theta,h=logisticRegressionByNumpy(X_train,y_train)

predicted_train=logRegPredictMatrix(h,threshold=0.50)

matrix_train = confusion_matrix(y_train, predicted_train)#,labels)

print('Logistic regression')

print('Results on train set')

print('Accuracy on train set: {:.2f}'.format(accuracy_score(y_train, predicted_train)))

print('Conf. matrix on the train \n', matrix_train)

print('Classification report at train set\n',

    classification_report(y_train, predicted_train, target_names = ['not 1', '1']))


В результате получим на тренировочном множестве значение accuracy = 0.57, а на тестовом 0.4. Другими словами, точность предсказания нашей функции хуже, чем при случайном выборе классов! Подобный результат вполне предсказуем, поскольку мы попытались использовать прямую там, где требуется как минимум окружность.

Исправить положение можно, используя регрессию второго порядка в соответствии с выражением (2.10). В предыдущей функции достаточно изменить одного оператора:

X=np.concatenate((np.ones([m,1]),X,X**2), axis=1)

После этого мы получим значение accuracy на тренировочном и тестовом множествах, равное 0.9, что вполне приемлемо для нашей задачи.

Необходимость подбора значимых параметров и формирования новых параметров является одним из недостатков логистической регрессии.

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

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

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

Примечание. Программный код примера MLF_logReg_Python_numpy_002.ipynb, описанного в этом разделе, можно получить по ссылке

https://www.dropbox.com/s/vlp91rtezr5cj5z/MLF_logReg_Python_numpy_002.ipynb?dl=0

2.5. Контрольные вопросы

Что такое объект в задачах машинного обучения?

Как в общем виде записать функцию стоимости в задаче классификации?

Как в общем виде записать функцию стоимости в задаче регрессии?

Приведите выражение для функции гипотезы линейной регрессии одной переменной.

Как вычислить значения коэффициентов линейной регрессии? Укажите оба способа вычисления.

Приведите выражение функции стоимости логистической регрессии. Каково будет значение функции стоимости, если y = 0, h = 0, m = 2?

Каково назначение регуляризации?

Каковы недостатки логистической регрессии?

Какие алгоритмы применяются для минимизации значения функции стоимости логистической регрессии?

Чем отличается сигмоидальная функция от логистической?

Какие значения принимает логистическая функция?

2.6. Искусственные нейронные сети

2.6.1. Вводные замечания

Искусственные нейронные сети (Artificial Neural Networks ANN ИНС) аппарат, который активно исследуется начиная с 40-х годов прошлого столетия. ИНС как часть теории коннективизма прошли значительный путь от эпохи завышенных ожиданий, через период разочарований (в 70-х годах) до широко применяемой технологии в настоящее время. Связь между биологическими нейронами и возможностями их моделирования с помощью логических вычислений установлена в работе Warren S. McCulloch, Walter Pitts [[39]], в работе Розенблатта [[40]] описана модель персептрона. Недостатки однослойного персептрона отражены в книге М. Минского и С. Пейперта [[41], [42]]. В этой книге подробно рассмотрены ограничения однослойной нейронной сети и доказано, что она не способна решать некоторые классические логические задачи, в частности, обозначена знаменитая проблема неразрешимости функции XOR для однослойной нейронной сети. Преодолеть этот недостаток можно было путем использования многослойных нейронных сетей. Однако в конце 60-х годов было еще неясно, как обучать многослойные нейронные сети.

В 1974 году был предложен алгоритм, который впоследствии получил название «алгоритм обратного распространения» (backpropagation) [[43], [44]], или «алгоритм обратного распространения ошибки», пригодный для автоматического подбора весов (обучения) многослойного персептрона или многослойной нейронной сети прямого распространения. Этот алгоритм стал базой для бурного развития нейросетевых методов вычислений.

Примечание. Первенство в разработке алгоритма окончательно не установлено. Считается, что он был впервые описан А. И. Галушкиным и независимо Полом Вербосом в 1974 году. Далее алгоритм развивался усилиями как отечественных ученых, так и зарубежных групп, которые, собственно, и ввели термин backpropagation в 1986 году. Метод несколько раз переоткрывался разными исследователями.

Ваша оценка очень важна

0
Шрифт
Фон

Помогите Вашим друзьям узнать о библиотеке

Скачать книгу

Если нет возможности читать онлайн, скачайте книгу файлом для электронной книжки и читайте офлайн.

fb2.zip txt txt.zip rtf.zip a4.pdf a6.pdf mobi.prc epub ios.epub fb3