Если все это не имеет для вас смысла, то вы находитесь в идеальном месте для начала! Мы собираемся пройти этот процесс шаг за шагом, и менее чем за полчаса вы создадите свой первый алгоритм глубокого обучения!

Интуиция

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

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

Набор данных

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

5 шагов к созданию нейронной сети

Если вы прочитали последнюю статью, которую я сказал вам прочитать, то вы помните 5 шагов, которые я сказал вам для программирования ИНС, а именно:

  1. Импортируйте обучающий набор, который служит входным слоем.
  2. Прямое распространение данных из входного слоя через t скрытый слой в выходной слой, где мы получаем прогнозируемое значение y. Прямое распространение - это процесс, при котором мы умножаем входной узел на случайный вес и применяем функцию активации.
  3. Измерьте ошибку между прогнозируемым и действительным значениями.
  4. Выполните обратное распространение ошибки и используйте градиентный спуск, чтобы изменить веса соединений.
  5. Повторяйте эти шаги до тех пор, пока ошибка не будет в достаточной степени сведена к минимуму.

Однако, когда дело доходит до кодирования искусственной нейронной сети, поскольку мы используем библиотеки, которые нам помогают, в частности, библиотеку Keras, наши строки кода будут значительно сокращены, но нам нужно будет включить несколько дополнительные шаги. Этот новый процесс будет разбит на 5–6 шагов.

Шаг 1. Обработайте данные и разделите их на обучающий и тестовый набор
Шаг 2. Создайте структуру искусственной нейронной сети
Шаг 3. Обучите искусственную нейронную сеть
Шаг 4. Используйте модель для прогнозирования!
Шаг 5 (необязательно): настройте модель для большей точности

Примечание. Шаги, которые я привел в статье об интуиции, подойдут для шагов 2–4 кодирования. Чтобы запустить этот код, используйте любую IDE, которую хотите. Рекомендую PyCharm или Spyder.

Шаг 1. Обработайте данные и разделите их на набор для обучения и тестирования

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

Строки 1–4: Импортируйте данные. Для этого мы используем pandas в строке 4, где мы импортируем файл .csv и указываем его местоположение. Найдите минутку, чтобы посмотреть, как структурирован набор данных.

Строки 5–6: Разделите на X (входные значения) и Y (выходные значения, т. е. значение, которое мы хотим спрогнозировать), преобразуя исходный фрейм данных в массивы. Обратите внимание, что мы берем только значения в столбцах с 3 по 13, так как это значения, которые будут влиять на вывод. «Номер», «customerID» и «Фамилия» не влияют на вывод, поэтому мы не учитываем их при вводе.

Строки 9–19: Обеспечение понимания кода машиной путем преобразования его в числа (кодирование категориальных данных в числовые данные). Если вы внимательно посмотрите на набор данных, вы увидите, что есть два категориальных типа данных. Пол и География. Каждый из этих типов значений возвращает строки, которые компьютер не может обработать. Следовательно, нам нужно сначала закодировать его в числа. Для этого мы используем функции LabelEncoder и OneHotEncoder. Для Пол есть 2 категории: Мужской и Женский, поэтому мы можем преобразовать это в целые числа 0 и 1. Для Географии существует 3 типа: Германия, Франция и Испания , которые преобразуются в 0,1 и 2. Однако есть еще такая вещь, которая называется фиктивная переменная , которую нужно удалить.

Строки 22–23: Разделение имеющихся данных на обучающий набор и тестовый набор. Это чрезвычайно важно, потому что нам нужно проверить точность модели после того, как мы закончим ее обучение, и посмотреть, насколько хорошо она будет работать с данными, на которых она не обучалась. Вот здесь-то и пригодится набор тестов. Для этого мы используем библиотеку sci-kit learn. Test_size = 0,2 означает, что 20% набора данных будет использоваться для тестирования, а остальные 80% будут использоваться для обучения. Random_state = 0 - это параметр, который в основном делает каждую рандомизацию константой, поэтому независимо от того, сколько раз вы разделяете набор данных, он будет разделяться одинаково.

Строки 26–29: Последний шаг предварительной обработки данных - применить масштабирование функций (также известное как нормализация данных) к набору данных. Это означает, что мы преобразуем значения, чтобы они соответствовали диапазону от -1 до 1. Если мы снова посмотрим на X_train или X_test, мы увидим, как это работает.

Шаг 2. Постройте структуру искусственной нейронной сети

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

  1. Инициализируйте нейронную сеть, используя вызов Sequential () для «классификатора», который будет именем нашей модели, поскольку модель, которую мы собираемся построить, является классификатором, то есть результат, который он вернет, является целочисленным значением, 0 или 1.

2. Определите входной слой и первый скрытый слой. Добавьте регуляризацию Dropout, которая предотвращает переоснащение.

Давайте внимательно посмотрим на параметры, которые мы добавляем.

input_dim = 11: определяет размеры нашего ввода (т.е. сколько типов входов у нас есть)

Единицы = 6: это сколько единиц (нейронов) будет иметь наш связанный слой (прикрепленный скрытый слой).

kernel_initializer = «uniform»: термин kernel_initializer - это причудливый термин, обозначающий статистическое распределение или функцию, которые следует использовать для инициализации весов. Не стоит об этом особо беспокоиться.

Activation = ‘relu’: этот входной параметр определяет тип функции активации, которую мы собираемся использовать, в нашем случае это функция активации reLU (линейный блок выпрямителя). Хотя это две линейные части, доказано, что она хорошо работает в нейронных сетях. Эта статья на Medium очень хорошо это объясняет.

3. Определение второго скрытого слоя. Мы уже определили, сколько нейронов будет в этом скрытом слое (6), поэтому нам не нужно снова указывать его input_dim. У нас снова есть функция регуляризации отсева.

4. Определение нашего выходного слоя. Обратите внимание, что units = 1, потому что для нашего вывода мы хотим, чтобы он возвращал одно целое значение, 0 или 1.

5. Наконец, скомпилируйте нейронную сеть.

Объяснение входных параметров для функции компиляции
optimizer = ‘adam’: это оптимизатор, который мы собираемся использовать. Так машина будет делать градиентный спуск. Оптимизатор контролирует скорость обучения на протяжении всего обучения, т.е. насколько быстро вычисляются оптимальные веса для модели. Меньшая скорость обучения может привести к более точным весам (до определенного момента), но время, необходимое для вычисления весов, будет больше. Адам - ​​хороший оптимизатор для многих случаев.

потеря = «двоичная_кросцентропия»; это определяет, как мы приближаемся к нашей потере. В нашем случае, поскольку наш вывод является двоичным, мы используем «binary_crossentropy».

metrics = [‘precision’]: так мы измеряем, насколько точной будет наша нейронная сеть на этапе обучения. Поскольку наш вывод является двоичным, мы используем параметр «точность».

Шаг 3. Обучите искусственную нейронную сеть

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

Размер пакета определяет количество выборок, которые будут распространяться по сети.

Например, предположим, что у вас есть 1050 обучающих выборок, и вы хотите установить batch_size равным 100. Алгоритм берет первые 100 выборок (от 1-го до 100-го) из набора обучающих данных и обучает сеть.

  • одна эпоха = один проход вперед и один проход назад всех примеров обучения
  • размер пакета = количество обучающих примеров за один проход вперед / назад. Чем больше размер пакета, тем больше места в памяти вам понадобится.
  • количество итераций = количество проходов, каждый проход использует [размер пакета] количество примеров. Чтобы было ясно, один проход = один проход вперед + один проход назад (мы не считаем прямой проход и обратный проход как два разных прохода).

Пример: если у вас есть 1000 обучающих примеров, а размер вашего пакета составляет 500, то для завершения 1 эпохи потребуется 2 итерации.

Как только вы запустите этот код, вы можете расслабиться, вздремнуть, посмотреть Netflix и дождаться, пока ваш компьютер сотворит чудеса. После того, как вы закончите, вы должны получить точность около 85% !!

Шаг 4. Используйте модель для прогнозирования!

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

Шаг 5 (необязательно): настройте модель для большей точности

Это будет рассмотрено в другом руководстве!

Заключение

Поздравляем, вы только что закончили создание своего первого алгоритма глубокого обучения! Теперь у вас есть 2 варианта.

  1. Попробуйте найти способы сделать модель более точной. В настоящее время у вас точность около 85%. Попробуйте найти способ получить более высокую точность, не допуская при этом переобучения.
  2. Готовы применить свои навыки глубокого обучения к другим наборам данных? Я предлагаю использовать Kaggle, очень популярный веб-сайт, на котором есть множество наборов данных с открытым исходным кодом! Удачи и приятного времяпровождения!