Как построить модель глубокого обучения для прогнозирования удержания сотрудников с помощью Keras и TensorFlow

_ Автор выбрал Girls Who Code, чтобы получить пожертвование в рамках программы Write for DOnations ._

Вступление

Keras - это API нейронной сети, написанный на Python. Он выполняется поверх TensorFlow, CNTK или http://deeplearning.net/ программное обеспечение / Theano / [Theano]. Это высокоуровневая абстракция этих структур глубокого обучения, и поэтому делает экспериментирование быстрее и проще. Keras является модульным, что означает, что реализация является бесшовной, так как разработчики могут быстро расширять модели, добавляя модули.

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

В этом руководстве вы создадите модель глубокого обучения, которая будет предсказывать вероятность ухода сотрудника из компании. Сохранение лучших сотрудников является важным фактором для большинства организаций. Для построения вашей модели вы будете использовать thatatat, доступный в Kaggle, который имеет функции, которые измеряют удовлетворенность сотрудников в компании. Чтобы создать эту модель, вы будете использовать слой Keras sequential для создания различных слоев для модели.

Предпосылки

Перед началом этого урока вам понадобится следующее:

  • Https://www.digitalocean.com/community/tutorials/how-to-install-anaconda-on-ubuntu-18-04-quickstart[Anaconda среда разработки] на вашем компьютере.

  • Установка Jupyter Notebook. Anaconda установит Jupyter Notebook для вас во время его установки. Вы также можете следовать этому руководству для руководства по навигации и использованию Jupyter Notebook.

  • Знакомство с Machine learning.

Шаг 1 - Предварительная обработка данных

Предварительная обработка данных необходима для подготовки ваших данных способом, который может принять модель глубокого обучения. Если в ваших данных есть категоричные переменные, вам нужно преобразовать их в числа, потому что алгоритм принимает только числовые значения. Категориальная переменная представляет количественные данные, представленные именами. На этом шаге вы загрузите свой набор данных с помощью + pandas +, который является библиотекой Python для работы с данными.

Прежде чем начать предварительную обработку данных, вы активируете свою среду и убедитесь, что на вашем компьютере установлены все необходимые пакеты. Выгодно использовать + conda + для установки + keras + и + tenorflow +, так как он будет обрабатывать установку любых необходимых зависимостей для этих пакетов и гарантировать, что они совместимы с + keras + и + tensorflow +. Таким образом, использование дистрибутива Anaconda Python является хорошим выбором для проектов, связанных с наукой о данных.

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

conda activate

Запустите следующую команду для установки + keras + и + tenorflow +:

conda install tensorflow keras

Теперь откройте Jupyter Notebook, чтобы начать. Jupyter Notebook открывается с помощью следующей команды на вашем терминале:

jupyter notebook

Получив доступ к блокноту Jupyter, щелкните файл * anaconda3 *, затем нажмите * New * в верхней части экрана и выберите * Python 3 *, чтобы загрузить новый блокнот.

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

Вставьте следующий код в ячейку блокнота и нажмите * Выполнить *:

import pandas as pd
import numpy as np
df = pd.read_csv("https://raw.githubusercontent.com/mwitiderrick/kerasDO/master/HR_comma_sep.csv")

Вы импортировали + numpy и` + pandas`. Затем вы использовали + pandas + для загрузки набора данных для модели.

Вы можете получить представление о наборе данных, с которым работаете, используя + head () +. Это полезная функция из + pandas +, которая позволяет просматривать первые пять записей вашего фрейма данных. Добавьте следующий код в ячейку блокнота и запустите его:

df.head()

изображение: https: //assets.digitalocean.com/articles/deeplearningkeras/step1a.png [Alt Проверка головы для набора данных]

Теперь вы перейдете к преобразованию категориальных столбцов в числа. Вы делаете это путем преобразования их в dummy variable. Фиктивные переменные - это, как правило, единицы и нули, которые указывают на наличие или отсутствие категориального признака. В такой ситуации вы также избегаете переменную dummy trap, отбрасывая первую пустышку.

Вставьте этот код в следующую ячейку блокнота и выполните его:

feats = ['department','salary']
df_final = pd.get_dummies(df,columns=feats,drop_first=True)

+ feats = ['Department', 'Salary'] + определяет два столбца, для которых вы хотите создать фиктивные переменные. + pd.get_dummies (df, columns = feats, drop_first = True) + сгенерирует числовые переменные, которые требуются вашей модели удержания сотрудников. Это делается путем преобразования + feats +, который вы определяете, из категориальных в числовые переменные.

изображение: https: //assets.digitalocean.com/articles/deeplearningkeras/step1b.png [Шаг 1]

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

Шаг 2 - Разделение наборов данных для обучения и тестирования

Вы будете использовать https://scikit-learn.org/ [+ scikit-learn +], чтобы разбить ваш набор данных на набор для обучения и тестирования. Это необходимо, чтобы вы могли использовать часть данных о сотрудниках для обучения модели, а часть - для проверки ее производительности. Такое разбиение набора данных является обычной практикой при построении моделей глубокого обучения.

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

Вы начнете с импорта модуля + train_test_split + из пакета + scikit-learn +. Это модуль, который обеспечит функциональность разделения. Вставьте этот код в следующую ячейку блокнота и запустите:

from sklearn.model_selection import train_test_split

С импортированным модулем + train_test_split + вы будете использовать столбец + left + в своем наборе данных, чтобы предсказать, покинет ли сотрудник компанию. Поэтому важно, чтобы ваша модель глубокого обучения не вступала в контакт с этим столбцом. Вставьте следующее в ячейку, чтобы удалить столбец + left +:

X = df_final.drop(['left'],axis=1).values
y = df_final['left'].values

Ваша модель глубокого обучения предполагает получение данных в виде массивов. Поэтому вы используете http://www.numpy.org/ [+ numpy +] для преобразования данных в массивы + numpy + с атрибутом + .values ​​+.

Теперь вы готовы преобразовать набор данных в набор для тестирования и обучения. Вы будете использовать 70% данных для обучения и 30% для тестирования. Коэффициент обучения больше, чем коэффициент тестирования, потому что вам нужно будет использовать большую часть данных для процесса обучения. При желании вы также можете поэкспериментировать с соотношением 80% для тренировочного набора и 20% для испытательного набора.

Теперь добавьте этот код в следующую ячейку и запустите, чтобы разделить данные обучения и тестирования на указанное соотношение:

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

изображение: https: //assets.digitalocean.com/articles/deeplearningkeras/step2.png [Шаг 2]

Теперь вы преобразовали данные в тип, в котором Keras ожидает их (массивы + numpy +), и ваши данные разделены на набор для обучения и тестирования. Вы передадите эти данные модели + keras + позже в этом уроке. Предварительно вам необходимо преобразовать данные, которые вы заполните на следующем шаге.

Шаг 3 - Преобразование данных

При построении моделей глубокого обучения обычно целесообразно масштабировать ваш набор данных, чтобы сделать вычисления более эффективными. На этом шаге вы масштабируете данные с помощью + StandardScaler +; это обеспечит, чтобы значения вашего набора данных имели среднее значение, равное нулю, и единичную переменную. Это преобразует набор данных для нормального распределения. Вы будете использовать + scikit-learn + + StandardScaler +, чтобы масштабировать функции в пределах того же диапазона. Это преобразует значения в среднее значение 0 и стандартное отклонение 1. Этот шаг важен, потому что вы сравниваете функции, которые имеют разные измерения; таким образом, это обычно требуется в машинном обучении.

Чтобы масштабировать обучающий набор и набор тестов, добавьте этот код в ячейку ноутбука и запустите его:

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

Здесь вы начинаете с импорта + StandardScaler + и вызова его экземпляра. Затем вы используете его метод + fit_transform + для масштабирования тренировочного и тестового набора.

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

Шаг 4 - Построение искусственной нейронной сети

Теперь вы будете использовать + keras + для построения модели глубокого обучения. Для этого вы импортируете + keras +, который по умолчанию будет использовать + tenorflow + в качестве бэкэнда. Из + keras + вы затем импортируете модуль + Sequential +, чтобы инициализировать artificial neural network. Искусственная нейронная сеть - это вычислительная модель, построенная с использованием идей человеческого мозга. Вы также импортируете модуль + Dense +, который добавит слои в вашу модель глубокого обучения.

При построении модели глубокого обучения вы обычно указываете три типа слоев:

  • Input layer - это слой, на который вы передадите функции своего набора данных. В этом слое нет вычислений. Служит для передачи функций скрытым слоям.

  • Скрытые слои обычно представляют собой слои между входным слоем и выходным слоем, и их может быть несколько. Эти слои выполняют вычисления и передают информацию на выходной слой.

  • Output layer представляет уровень вашей нейронной сети, который даст вам результаты после обучения вашей модели. Он отвечает за создание выходных переменных.

Чтобы импортировать модули + Keras +, + Sequential + и + Dense +, запустите следующий код в ячейке вашего ноутбука:

import keras
from keras.models import Sequential
from keras.layers import Dense

Вы будете использовать + Sequential + для инициализации линейного стека слоев. Поскольку это проблема classification, вы создадите переменную классификатора. Проблема классификации - это задача, в которой вы пометили данные и хотели бы сделать некоторые прогнозы на основе помеченных данных. Добавьте этот код в свой блокнот, чтобы создать переменную классификатора:

classifier = Sequential()

Вы использовали + Sequential + для инициализации классификатора.

Теперь вы можете начать добавлять слои в вашу сеть. Запустите этот код в вашей следующей ячейке:

classifier.add(Dense(9, kernel_initializer = "uniform",activation = "relu", input_dim=18))

Вы добавляете слои с помощью функции + .add () + в своем классификаторе и указываете некоторые параметры:

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

  • Вторым параметром является + kernel_initializer. + Когда вы подходите к своей модели глубокого обучения, веса будут инициализированы числами, близкими к нулю, но не к нулю. Для этого вы используете инициализатор равномерного распределения. + kernel_initializer + - это функция, которая инициализирует веса.

  • Третий параметр - это функция + активации . Ваша модель глубокого обучения будет учиться через эту функцию. Обычно существуют линейные и нелинейные функции активации. Вы используете функцию активации https://keras.io/activations/ [` relu +`], потому что она хорошо обобщает ваши данные. Линейные функции не подходят для подобных задач, потому что они образуют прямую линию.

  • Последний параметр - + input_dim +, который представляет количество объектов в вашем наборе данных.

Теперь вы добавите выходной слой, который даст вам прогнозы:

classifier.add(Dense(1, kernel_initializer = "uniform",activation = "sigmoid"))

Выходной слой принимает следующие параметры:

  • Количество выходных узлов. Вы ожидаете получить один выход: если сотрудник уходит из компании. Поэтому вы указываете один выходной узел.

  • Для + kernel_initializer + вы используете функцию активации https://keras.io/activations/ [+ sigmoid +], чтобы вы могли получить вероятность того, что сотрудник уйдет. Если вы имеете дело с более чем двумя категориями, вы должны использовать функцию активации https://keras.io/activations/ [+ softmax +], которая является вариантом функции активации + sigmoid +.

Затем вы примените gradient descent к нейронной сети. Это стратегия optimization, которая работает, чтобы уменьшить количество ошибок в процессе обучения. Градиентный спуск - это то, как случайно назначенные веса в нейронной сети корректируются путем уменьшения функции cost, которая является мерой того, насколько хорошо нейронная сеть работает на основе ожидаемого от нее результата.

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

Добавьте этот код в ячейку вашего блокнота и запустите:

classifier.compile(optimizer= "adam",loss = "binary_crossentropy",metrics = ["accuracy"])

Применение градиентного спуска выполняется с помощью функции + compile +, которая принимает следующие параметры:

  • + optimizer + - градиентный спуск.

  • + loss + - это функция, которую вы будете использовать в градиентном спуске. Поскольку это проблема двоичной классификации, вы используете функцию + binary_crossentropy` + loss`.

  • Последний параметр - это + metric +, который вы будете использовать для оценки вашей модели. В этом случае вы хотите оценить его на основе его точности при прогнозировании.

Вы готовы разместить свой классификатор в своем наборе данных. Keras делает это возможным с помощью метода + .fit () +. Для этого вставьте следующий код в свой блокнот и запустите его, чтобы подогнать модель к вашему набору данных:

classifier.fit(X_train, y_train, batch_size = 10, epochs = 1)

изображение: https: //assets.digitalocean.com/articles/deeplearningkeras/step4a.png [Подгонка набора данных]

Метод + .fit () + принимает несколько параметров:

  • Первый параметр - это тренировочный набор с функциями.

  • Второй параметр - это столбец, для которого вы делаете прогнозы.

  • + Batch_size + представляет количество выборок, которые будут проходить через нейронную сеть в каждом тренировочном раунде.

  • + epochs + представляет количество раз, которое набор данных будет передан через нейронную сеть. Чем больше эпох, тем дольше будет работать ваша модель, что также даст вам лучшие результаты.

изображение: https: //assets.digitalocean.com/articles/deeplearningkeras/step4b.png [Шаг 4]

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

Шаг 5 - Запуск прогнозов на тестовом наборе

Чтобы начать делать прогнозы, вы будете использовать набор данных тестирования в созданной вами модели. Keras позволяет делать прогнозы с помощью функции + .predict () +.

Вставьте следующий код в следующую ячейку блокнота, чтобы начать делать прогнозы:

y_pred = classifier.predict(X_test)

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

Введите следующую строку кода в ячейку вашего ноутбука, чтобы установить этот порог:

y_pred = (y_pred > 0.5)

Вы создали прогнозы с использованием метода прогнозирования и установили порог для определения вероятности увольнения сотрудника. Чтобы оценить, насколько хорошо модель выполнила прогнозы, вы затем будете использовать confusion matrix.

Шаг 6 - Проверка матрицы путаницы

На этом шаге вы будете использовать confusion matrix для проверки количества правильных и неправильных предсказаний. Матрица путаницы, также известная как матрица ошибок, представляет собой квадратную матрицу, которая сообщает количество истинных положительных результатов (tp), ложных положительных результатов (fp), истинных отрицательных значений (tn) и ложных отрицательных значений (fn) классификатора.

  • * Истинно положительный * - это результат, в котором модель правильно предсказывает положительный класс (также известный как чувствительность или отзыв).

  • * Истинно отрицательный * - это результат, в котором модель правильно предсказывает отрицательный класс.

  • * Ложный положительный результат * - это результат, в котором модель неверно предсказывает положительный класс.

  • * Ложноотрицательный * - это результат, в котором модель неверно предсказывает отрицательный класс.

Чтобы достичь этого, вы будете использовать путаницу, которую предоставляет + scikit-learn +.

Вставьте этот код в следующую ячейку блокнота, чтобы импортировать запутанную матрицу + scikit-learn +:

from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
cm

Вывод матрицы путаницы означает, что ваша модель глубокого обучения сделала +3305 + 375 + правильных предсказаний и +106 + 714 + неправильных предсказаний. Вы можете рассчитать точность с помощью: + (3305 + 375) / 4500 +. Общее количество наблюдений в вашем наборе данных составляет 4500. Это дает вам точность 81,7%. Это очень хороший показатель точности, поскольку вы можете достичь не менее 81% правильных прогнозов на основе вашей модели.

Outputarray([,  ],
      [ ,  ]])

Вы оценили свою модель с помощью матрицы путаницы. Затем вы будете работать над созданием единого прогноза, используя разработанную вами модель.

Шаг 7 - Создание одного прогноза

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

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

new_pred = classifier.predict(sc.transform(np.array([[0.26,0.7 ,3., 238., 6., 0.,0.,0.,0., 0.,0.,0.,0.,0.,1.,0., 0.,1.]])))

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

Добавьте порог в 50% с помощью следующего кода:

new_pred = (new_pred > 0.5)
new_pred

Это пороговое значение указывает на то, что при вероятности выше 50% сотрудник покидает компанию.

Вы можете увидеть в своем выводе, что сотрудник не покинет компанию:

Outputarray([[False]])

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

new_pred = (new_pred > 0.6)
new_pred

Этот новый порог все еще показывает, что сотрудник не покинет компанию:

Outputarray([[False]])

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

Шаг 8 - Повышение точности модели

Если вы тренируете свою модель много раз, вы будете получать разные результаты. Точность для каждой тренировки имеет высокую дисперсию. Чтобы решить эту проблему, вы будете использовать перекрестную проверку K-fold. Обычно K устанавливается на 10. В этом методе модель тренируется на первых 9 сгибах и тестируется на последнем сгибе. Эта итерация продолжается до тех пор, пока не будут использованы все сгибы. Каждая из итераций дает свою точность. Точность модели становится средней из всех этих погрешностей.

+ keras + позволяет вам реализовать перекрестную проверку K-fold с помощью оболочки + KerasClassifier . Эта обертка из перекрестной проверки ` scikit-learn `. Вы начнете с импорта функции перекрестной проверки ` cross_val_score ` и ` KerasClassifier +`. Для этого вставьте и запустите следующий код в ячейке вашего блокнота:

from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.model_selection import cross_val_score

Чтобы создать функцию, которую вы передадите в + KerasClassifier +, добавьте этот код в следующую ячейку:

def make_classifier():
   classifier = Sequential()
   classifier.add(Dense(9, kernel_initializer = "uniform", activation = "relu", input_dim=18))
   classifier.add(Dense(1, kernel_initializer = "uniform", activation = "sigmoid"))
   classifier.compile(optimizer= "adam",loss = "binary_crossentropy",metrics = ["accuracy"])
   return classifier

Здесь вы создаете функцию, которую вы передаете в + KerasClassifier + - функция является одним из аргументов, ожидаемых классификатором. Эта функция является оболочкой дизайна нейронной сети, который вы использовали ранее. Переданные параметры также аналогичны тем, которые использовались ранее в руководстве. В функции вы сначала инициализируете классификатор, используя + Sequential () +, затем вы используете + Dense +, чтобы добавить входной и выходной слой. Наконец, вы компилируете классификатор и возвращаете его.

Чтобы передать созданную вами функцию + KerasClassifier +, добавьте следующую строку кода в свой блокнот:

classifier = KerasClassifier(build_fn = make_classifier, batch_size=10, nb_epoch=1)

+ KerasClassifier + принимает три аргумента:

  • + build_fn +: функция с дизайном нейронной сети

  • + batch_size +: количество выборок, передаваемых по сети в каждой итерации

  • + nb_epoch +: количество эпох, которые будет работать сеть

Затем вы применяете перекрестную проверку, используя Scikit-learn + cross_val_score. Добавьте следующий код в ячейку вашего блокнота и запустите его:

accuracies = cross_val_score(estimator = classifier,X = X_train,y = y_train,cv = 10,n_jobs = -1)

Эта функция даст вам десять точности, так как вы указали количество сгибов как 10. Поэтому вы присваиваете его переменной точности и позже используете его для вычисления средней точности. Требуются следующие аргументы:

  • + оценщик +: классификатор, который вы только что определили

  • + X +: особенности тренировочного набора

  • + y +: значение, которое будет предсказано в тренировочном наборе

  • + cv +: количество сгибов

  • + n_jobs +: количество используемых процессоров (при значении -1 будут использоваться все доступные процессоры)

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

mean = accuracies.mean()
mean

В своем выводе вы увидите, что среднее значение составляет 83%:

Output

Чтобы вычислить дисперсию точности, добавьте этот код в следующую ячейку блокнота:

variance = accuracies.var()
variance

Вы видите, что дисперсия составляет 0,00109. Поскольку дисперсия очень низкая, это означает, что ваша модель работает очень хорошо.

Output

Вы улучшили точность своей модели с помощью перекрестной проверки K-Fold. На следующем этапе вы будете работать над проблемой переоснащения.

Шаг 9 - Добавление регуляризации отсева для борьбы с перенастройкой

Прогнозирующие модели подвержены проблеме, известной как overfitting. Это сценарий, при котором модель запоминает результаты в обучающем наборе и не может обобщать данные, которые она не видела. Обычно вы наблюдаете переоснащение, когда у вас очень большая разница в точности. Чтобы помочь бороться с перетяжкой в ​​вашей модели, вы добавите слой к вашей модели.

В нейронных сетях dropout регуляризация - это метод, который борется с переоснащением, добавляя слой + Dropout + 'в вашу нейронную сеть. Он имеет параметр `+ rate +, который указывает количество нейронов, которые будут деактивироваться на каждой итерации. Процесс дезактивации нейронов обычно бывает случайным. В этом случае вы указываете 0,1 в качестве показателя, означающего, что 1% нейронов будет дезактивироваться в процессе обучения. Дизайн сети остается прежним.

Чтобы добавить слой + Dropout +, добавьте следующий код в следующую ячейку:

from keras.layers import Dropout

classifier = Sequential()
classifier.add(Dense(9, kernel_initializer = "uniform", activation = "relu", input_dim=18))
classifier.add(Dropout(rate = 0.1))
classifier.add(Dense(1, kernel_initializer = "uniform", activation = "sigmoid"))
classifier.compile(optimizer= "adam",loss = "binary_crossentropy",metrics = ["accuracy"])

Вы добавили слой + Dropout + между входным и выходным слоями. Установив коэффициент отсева 0,1 означает, что в процессе обучения 15 нейронов будут деактивированы, чтобы классификатор не перегружал тренировочный набор. После добавления + Dropout + и выходных слоев вы затем скомпилировали классификатор, как вы делали это ранее.

На этом этапе вы боролись за подгонку со слоем + Dropout +. Далее вы будете работать над дальнейшим улучшением модели, настраивая параметры, которые вы использовали при создании модели.

Шаг 10 - Настройка гиперпараметра

Grid search - это метод, который вы можете использовать для экспериментов с различными параметрами модели, чтобы получить те из них, которые дают вам наилучшую точность. Техника делает это, пробуя разные параметры и возвращая те, которые дают лучшие результаты. Вы будете использовать поиск по сетке для поиска лучших параметров для вашей модели глубокого обучения. Это поможет улучшить точность модели. + scikit-learn + предоставляет функцию + GridSearchCV + для включения этой функции. Теперь вы перейдете к изменению функции + make_classifier +, чтобы опробовать различные параметры.

Добавьте этот код в свой блокнот, чтобы изменить функцию + make_classifier +, чтобы вы могли протестировать различные функции оптимизатора:

from sklearn.model_selection import GridSearchCV
def make_classifier(optimizer):
   classifier = Sequential()
   classifier.add(Dense(9, kernel_initializer = "uniform", activation = "relu", input_dim=18))
   classifier.add(Dense(1, kernel_initializer = "uniform", activation = "sigmoid"))
   classifier.compile(optimizer= optimizer,loss = "binary_crossentropy",metrics = ["accuracy"])
   return classifier

Вы начали с импорта + GridSearchCV +. Затем вы внесли изменения в функцию + make_classifier +, чтобы вы могли попробовать разные оптимизаторы. Вы инициализировали классификатор, добавили слой ввода и вывода, а затем скомпилировали классификатор. Наконец, вы вернули классификатор, чтобы вы могли его использовать.

Как и в шаге 4, вставьте эту строку кода, чтобы определить классификатор:

classifier = KerasClassifier(build_fn = make_classifier)

Вы определили классификатор с помощью + KerasClassifier +, который ожидает функцию через параметр + build_fn +. Вы вызвали + KerasClassifier + и передали функцию + make_classifier +, которую вы создали ранее.

Теперь вы перейдете к настройке пары параметров, с которыми хотите поэкспериментировать. Введите этот код в ячейку и запустите:

params = {
   'batch_size':[20,35],
   'epochs':[2,3],
   'optimizer':['adam','rmsprop']
}

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

Для небольшого набора данных, такого как ваш, размер пакета от 20 до 35 - это хорошо. Для больших наборов данных важно экспериментировать с партиями больших размеров. Использование низких чисел для числа эпох гарантирует, что вы получите результаты в течение короткого периода времени. Однако вы можете поэкспериментировать с большими числами, которые могут занять некоторое время, в зависимости от скорости обработки вашего сервера. Оптимизаторы + adam + и + rmsprop + из + keras + являются хорошим выбором для этого типа нейронной сети.

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

grid_search = GridSearchCV(estimator=classifier,
                          param_grid=params,
                          scoring="accuracy",
                          cv=2)

Функция поиска по сетке ожидает следующие параметры:

  • + estimator +: классификатор, который вы используете.

  • + param_grid +: набор параметров, которые вы собираетесь тестировать.

  • + scoring +: метрика, которую вы используете.

  • + cv +: количество фолдов, на которых вы будете тестировать.

Затем вы подгоняете этот + grid_search + к своему набору обучающих данных:

grid_search = grid_search.fit(X_train,y_train)

Ваш вывод будет похож на следующий, подождите немного, чтобы он завершился:

OutputEpoch 1/2
5249/5249 [==============================] - 1s 228us/step - loss: 0.5958 - acc: 0.7645
Epoch 2/2
5249/5249 [==============================] - 0s 82us/step - loss: 0.3962 - acc: 0.8510
Epoch 1/2
5250/5250 [==============================] - 1s 222us/step - loss: 0.5935 - acc: 0.7596
Epoch 2/2
5250/5250 [==============================] - 0s 85us/step - loss: 0.4080 - acc: 0.8029
Epoch 1/2
5249/5249 [==============================] - 1s 214us/step - loss: 0.5929 - acc: 0.7676
Epoch 2/2
5249/5249 [==============================] - 0s 82us/step - loss: 0.4261 - acc: 0.7864

Добавьте следующий код в ячейку блокнота, чтобы получить лучшие параметры из этого поиска, используя атрибут + best_params_ +:

best_param = grid_search.best_params_
best_accuracy = grid_search.best_score_

Теперь вы можете проверить лучшие параметры для вашей модели с помощью следующего кода:

best_param

Ваш вывод показывает, что наилучший размер пакета + 20 +, лучшее количество эпох - + 2 +, а оптимизатор + adam + - лучший для вашей модели:

Output{'batch_size': 20, 'epochs': 2, 'optimizer': 'adam'}

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

best_accuracy

Ваш вывод будет похож на следующее:

Output

Вы использовали + GridSearch +, чтобы выяснить лучшие параметры для вашего классификатора. Вы видели, что лучший + batch_size + равен 20, лучший + optimizer + - это оптимизатор + adam +, а лучшее число эпох - 2. Вы также получили наилучшую точность для своего классификатора, которая составляет 85%. Вы создали модель удержания сотрудников, которая может предсказать, останется ли сотрудник или уйдет с точностью до 85%.

Заключение

В этом руководстве вы использовали https://keras.io [Keras] для создания искусственной нейронной сети, которая предсказывает вероятность ухода сотрудника из компании. Для этого вы объединили свои предыдущие знания в области машинного обучения, используя + scikit-learn +. Для дальнейшего улучшения вашей модели вы можете попробовать различные функции activation или optimizer из + keras +. Вы также можете поэкспериментировать с другим числом сгибов или даже построить модель с другим набором данных.

Для других учебных пособий в области машинного обучения или использования TensorFlow вы можете попробовать создать https://www.digitalocean.com/community/tutorials/how-to-build-a-neural-network-to-recognize-handwritten-digits. -with-tenorflow [нейронная сеть для распознавания рукописных цифр] или другие DigitalOcean machine обучающие руководства.

Related