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

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

Пост содержит только основную часть кода. Полную версию с множеством комментариев см. Здесь.

Рабочий процесс машинного обучения состоит из 8 шагов, первые 3 из которых имеют более теоретическую направленность:

  1. Сформулируйте проблему
  2. Опишите набор данных
  3. Выберите подходящие методы обработки, алгоритм и модель
  4. Построить модель
  5. Обучите модель
  6. Протестируйте модель
  7. Компромисс между смещением и дисперсией
  8. Разверните модель для решения реальной проблемы

1. Сформулируйте проблему:

«Обработка и преобразование набора данных о цветах ириса для создания модели прогноза. Эта модель должна предсказать, к какому из трех конкретных видов цветов может принадлежать каждый цветок, с точностью 95% или выше ».

Точность определяется как отсутствие ошибок

2. Описание данных:

Ирис - это род цветковых растений. Он получил свое название от богини радуги в греческой мифологии.

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

Дискриминантная функция h (x): мы используем обучающие данные для изучения функции h (x), которая отображает входные данные x непосредственно на метку класса y

В наборе данных Iris есть три класса, один из которых линейно отделим от двух других; последние два не отделимы друг от друга линейно. Каждый класс относится к типу ириса и содержит 50 экземпляров.

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

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

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

Этот вывод важен для части выбора алгоритма, потому что он говорит нам, что простая модель, такая как SVM, случайный лес или даже логистическая регрессия, может достичь тех же результатов с нейронной сетью. Кроме того, размер данных настолько мал, что указывает на отсутствие необходимости в использовании сложной модели, такой как нейронная сеть. Нейронные сети, как правило, хорошо работают с нелинейными функциями с большим количеством точек данных и неструктурированными данными.

3. Выбор подходящих методов предварительной обработки, алгоритма и модели

Предварительная обработка:

Прежде чем погрузиться в предварительную обработку, мы должны разделить наши данные на обучающие (80%) и тестовые (20%). Мы будем использовать обучающие данные (содержащие классы для наших видов ирисов), чтобы изучить модель; и тестовые данные (содержат только функции, без классов) для измерения точности нашей модели прогнозирования.

Мы будем кодировать категориальные переменные с помощью LabelEncoder (), поскольку модель прогнозирования не может работать с категориальными переменными.

LabelEncoder представил новую проблему (шум) в нашем наборе данных: добавлены числовые отношения в функциях, которые теперь стали порядковыми переменными. Это означает, что модель считает, что Iris-versicolor (1) выше, чем Iris-setosa (0), а Iris-setosa (0) меньше, чем Iris-virginica (2). Чтобы решить эту проблему, мы возьмем трехмерный вектор, а не одномерный вектор с тремя значениями ([0,1,2]). Таким образом, setosa будет [1,0,0], versicolor будет [0,1,0] и virginica woul dbe [0,0,1].

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

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

Модель и алгоритм

Что такое многослойный персептрон?

Краткий ответ: линейный контролируемый классификатор или регрессор. Идея состоит в том, чтобы найти хороший набор весов и смещений.

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

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

Feedforward pass = сумма вычислений, которые выполняются, когда входные данные проходят через нейронную сеть.

Подкрепление: перцептрон - это пример алгоритма обучения с подкреплением (который отличается от подхода к обучению с подкреплением, при котором нет никаких выходных данных для обучения модели). После каждого представления примера ввода-вывода мы узнаем только, производит ли сеть ожидаемый результат или нет. Альтернативой было бы обучение с исправлением ошибок; обновления весов зависят не только от ввода, но и от величины ошибки.

Многослойный персептрон (MLP): используйте правило перцептрона и используйте дельта-правило, также известное как обратное распространение, которое является более надежным и способным изучать веса по слоям. Правило дельты будет использоваться в функции, известной как ошибка или стоимость или потеря, чтобы увидеть, правильно ли классифицирована точка данных.

Многослойность - подход к моделированию -: сеть состоит из более чем одного слоя выходных узлов; это означает, что существует по крайней мере один скрытый слой с более чем одним нейронами, который передает входные данные на выходной слой (простейшая модель). Чем больше слоев вы добавляете, тем сложнее становится модель, а это означает, что она может стать более точной. Но есть цена, которую вы должны заплатить: вам нужно больше точек данных и осознавать высокую вероятность переобучения.

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

Альтернатива MLP: вероятностная нейронная сеть на основе байесовского подхода. Он поддерживает статистический вывод (обнаружение распределений / свойств, чтобы делать выводы) помимо оценки параметров (поиск оценки неизвестного значения).

Традиционная НС действует детерминированно: единый набор фиксированных весов; тогда как байесовская сеть действует вероятностно: распределение вероятностей по весам

4. Сборка: MLP в предсказании нашего вида

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

Количество узлов во входном и выходном слоях определяется уровнем размерности задачи. В нашем примере у нас есть 4 функции в качестве единиц ввода и 3 единицы вывода, а также 600 точек данных. Добавляем 10 узлов в скрытый слой hidden_layer_sizes(10). Однако определение количества скрытых узлов - непростое решение. Использование одинакового размера для всех скрытых слоев или использование первого скрытого слоя большего размера, чем входной, как правило, работают лучше. Есть несколько практических правил, но они выходят за рамки этой публикации.

Оптимизатор / решатель стохастического градиентного спуска (SGD): обновляет значения веса, чтобы минимизировать функцию потерь в пакетах (стохастический). Как следует из названия, SGD использует градиент функции потерь (градиент - это производная функции с более чем двумя переменными f (x, y)). Используйте параметр solver = sgd. Решатель Adam имеет тенденцию работать лучше, когда доступны большие наборы данных.

learning_rate_init=0.01: контролирует степень обновления весов в правильном направлении с учетом остаточной ошибки (истинный результат, предсказанный на выходе). Идея состоит в том, чтобы поддерживать его близкое к пропорциональному значению 1 / n, где n - количество функций. Его значение не должно быть ни слишком большим (быстрое, но не сходимость к оптимальным значениям), ни слишком маленьким (точное, но медленное обучение / сходимость).

max_iter=500: максимальное количество эпох (= сколько раз каждая точка данных будет использоваться до сходимости решателя). Используйте большее число, чтобы проверить, работает ли модель лучше (учитывая, что у вас большой набор данных)

5. Обучите модель

Обучение = минимизация функции потерь (категориальная перекрестная энтропия здесь из-за характера вывода)

Решающая программа = Градиентный спуск = Найдите значения весов, которые минимизируют функцию потерь (обратное распространение - объяснено в части 3.).

** Некоторые полезные термины для понимания параметров

Мультиклассовый классификатор: классифицируйте экземпляры на один из трех или более классов.

Полиномиальный категориальный: распределение вывода, целевые данные.

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

Нейроны: записи в матрице и, как таковые, их количество необходимо для задания матриц.

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

1 эпоха = 1 проход по всему набору данных

Размер пакета = количество обучающих примеров за один проход вперед / назад. Чем больше размер пакета, тем больше места в памяти вам понадобится.

Регуляризация L2 / Ridge: помогает избежать переобучения (обобщение на невидимые примеры данных - набор тестовых данных), то есть уменьшение значений весов (также известное как уменьшение веса или штраф). Значение альфа - это то значение, при котором наша модель достигает минимума ошибки перекрестной проверки. L2 - это сумма квадратов весов.

Моя интуиция в MLP:

  1. Первые синапсы: Учитывая случайный набор весов, передайте входные данные вперед: 10 взвешенных сумм (z1 = w1 * x1 + w2 * x2 + w3 * x3 + w4 * x4 + b1) 10 комбинаций входных данных. переменные.
  2. Узлы скрытого слоя: Z передаются в Relu, который создает нелинейное отображение (это помогает в решении исчезающего градиента) между z и переменной ответа. Продвигайте результат вперед.
  3. Вторые синапсы *: нелинейный z будет проходить через классификатор, такой как softmax, который даст нам класс.
  4. Узел выходного уровня. Мы знаем только, производит ли сеть ожидаемый результат или нет. Обучение происходит на основе обратного распространения: сравните результат с присвоенными весами с фактическим значением.
  5. Вторые синапсы: распространяют разницу (ошибку) в обратном направлении. SGD использует ошибку для обновления весов.
  6. Узлы скрытого слоя: вычислите ошибку относительно входной слой.
  7. Первые синапсы: SGD использует ошибку для обновления весов.
  8. Повторный запуск. После нескольких эпох обучения, когда ошибка между фактическим и вычисленным выходом меньше, чем ранее указанное значение, NN считается обученным. Затем мы заменяем случайные веса обученными.

* Каждый синапс (соединение нейрона) имеет связанный вес t, который представляет влияние одного нейрона на другой.

Псевдокод MLP см. Здесь.

6: Протестируйте модель

Используйте соответствующие метрики для оценки вашей модели и предотвращения парадокса точности

Пришло время увидеть точность нашей модели, которая составляет 0,966666666667. Хорошо, правда? Следующий шаг - борьба с переобучением с помощью перекрестной проверки.

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

А пока Hap-py-кодирование ⇧⏎

Другие статьи, которые могут вам понравиться:

  1. Стоимость обучения в машинах и людях
  2. Обучение = Представление + Оценка + Оптимизация
  3. Описательный анализ

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