На этом примере я делаю введение в Deep Learning Кераса.

Keras был создан, чтобы быть удобным для пользователя, модульным, легко расширяемым и работать с Python. API был «разработан для людей, а не для машин» и «следует передовым методам снижения когнитивной нагрузки».

Нейронные слои, функции стоимости, оптимизаторы, схемы инициализации, функции активации и схемы регуляризации — все это отдельные модули, которые можно комбинировать для создания новых моделей. Новые модули легко добавить, как и новые классы и функции. Модели определяются в коде Python, а не в отдельных файлах конфигурации моделей.

Что такое Керас?

Keras — это библиотека Python для глубокого обучения, включающая в себя эффективные числовые библиотеки Theano и TensorFlow.

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

После прохождения этого пошагового руководства вы будете знать:

Как загрузить данные из CSV и сделать их доступными для Keras. Как подготовить данные мультиклассовой классификации для моделирования с помощью нейронных сетей. Как оценить модели нейронной сети Keras с помощью scikit-learn.

Импорт библиотек

Для этого простого примера мы будем использовать только пару библиотек:

  • Pandas: для загрузки и обработки данных
  • Scikit-learn: для разделения поезд-тест
  • Matplotlib: для визуализации данных
  • Keras: для обучения моделей

Вот импорт, если вы просто хотите скопировать/вставить:

import pandas as pd
from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasClassifier
from keras.utils import np_utils
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold
from sklearn.preprocessing import LabelEncoder
from sklearn.pipeline import Pipeline

Импорт набора данных

Что касается набора данных Beer, его можно найти по этому URL-адресу.



Подготовьте папку, файлы и загрузите набор данных из Kaggle:

Это набор данных из 75 000 сортов домашнего пива более 176 различных стилей. Пивные записи сообщаются пользователями и классифицируются в соответствии с одним из 176 различных стилей. Эти рецепты содержат столько же или меньше деталей, сколько указал пользователь, но есть как минимум 5 полезных столбцов, в которых данные были введены для каждого: Исходная плотность, Конечная плотность, ABV, IBU и Цвет.

We'll use the linux terminal:

#### Remove directorys and files
! rm -r input/
! mkdir input/
! cd input/
#### Show directory
! ls
#### Download Dataset
! kaggle datasets download -d jtrofe/beer-recipes
#### Unzip Dataset
! unzip beer-recipes.zip
#### Move zip file
!mv beer-recipes.zip input/beer.zip
#### Move csv file
!mv recipeData.csv input/recipeDate.csv
!mv styleData.csv input/styleDate.csv
#### Show folder
! ls input/

Пост-ETL

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

Вот как импортировать его в Pandas напрямую:

# load dataset
dataframe = pd.read_csv("MyData.csv")
dataframe.head()

dataset = dataframe.values

Набор данных может быть загружен напрямую. Поскольку выходная переменная содержит строки, проще всего загрузить данные с помощью pandas. Затем мы можем разделить атрибуты (столбцы) на входные переменные (X) и выходные переменные (Y).

X = dataset[:,1:5].astype(float)
Y = dataset[:,0]
X
array([[ 6.71, 37.  , 52.38,  6.69],
       [ 6.48, 20.  , 31.6 ,  4.82],
       [ 4.28, 28.  , 40.87,  5.13],
       ...,
       [ 6.02, 33.  , 68.3 ,  7.74],
       [17.04, 37.  , 77.81,  4.54],
       [37.46, 39.  , 58.14,  6.76]])
Y
array(
['IPA', 'PALE', 'PALE', 'PALE', 'STOUT', 'PALE', 'PORTER', 'STOUT',
 'PALE', 'PALE', 'IPA', 'STOUT', 'IPA', 'PALE', 'IPA', 'IPA', 'IPA',
 'IPA', 'PALE', 'IPA', 'PALE', 'IPA', 'PALE', 'STOUT', 'PALE',
 ...,
'PALE', 'PALE', 'IPA', 'IPA', 'IPA', 'PORTER', 'PALE', 'IPA',
'PORTER', 'PALE', 'ALE', 'IPA', 'PALE', 'IPA', 'IPA', 'IPA', 'IPA','IPA', 'PORTER'], 
dtype=object)

Кодировать выходную переменную

Выходная переменная содержит пять различных строковых значений.

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

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



Например, в этой задаче три значения класса: IPA, ALE, PALE, STOUT, PORTER.

Если бы у нас были наблюдения:

IPA
ALE
PALE
STOUT
PORTER

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

Мы можем сделать это, сначала последовательно закодировав строки в целые числа, используя класс LabelEncoder scikit-learn. Затем преобразуйте вектор целых чисел в одно горячее кодирование, используя функцию Keras to_categorical().

# encode class values as integers
encoder = LabelEncoder()
encoder.fit(Y)
encoded_Y = encoder.transform(Y)
# convert integers to dummy variables (i.e. one hot encoded)
dummy_y = np_utils.to_categorical(encoded_Y)

Вот результат:

dummy_y
array([[0., 1., 0., 0., 0.],
       [0., 0., 1., 0., 0.],
       [0., 0., 1., 0., 0.],
       ...,
       [0., 1., 0., 0., 0.],
       [0., 1., 0., 0., 0.],
       [0., 0., 0., 1., 0.]], dtype=float32)

Определите модель нейронной сети

Если вы новичок в Keras или глубоком обучении, см. этот полезный учебник по Keras.

Библиотека Keras предоставляет классы-оболочки, позволяющие использовать модели нейронных сетей, разработанные с помощью Keras, в scikit-learn.

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

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

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

Сетевую топологию этой простой однослойной нейронной сети можно резюмировать следующим образом:

4 входа -> [8 скрытых узлов] -> 5 выходов

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

Наконец, в сети используется эффективный алгоритм оптимизации градиентного спуска Адама с логарифмической функцией потерь, который в Keras называется «categorical_crossentropy».

# define baseline model
def baseline_model():
    # create model
    model = Sequential()
    model.add(Dense(8, input_dim=4, activation='relu'))
    model.add(Dense(5, activation='softmax'))
    # Compile model
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model

Теперь мы можем создать наш KerasClassifier для использования в scikit-learn.

Мы также можем передавать аргументы в конструкцию класса KerasClassifier, которые будут переданы функции fit(), используемой внутри для обучения нейронной сети. Здесь мы передаем количество эпох как 200 и размер партии как 5, чтобы использовать их при обучении модели. Отладка также отключается при обучении путем установки verbose на 0.

estimator = KerasClassifier(build_fn=baseline_model, epochs=200, batch_size=5, verbose=0)


Оцените модель с k-кратной перекрестной проверкой

Теперь мы можем оценить модель нейронной сети на наших обучающих данных.

scikit-learn имеет отличные возможности для оценки моделей с использованием набора методов. Золотым стандартом для оценки моделей машинного обучения является k-кратная перекрестная проверка.

Сначала мы можем определить процедуру оценки модели. Здесь мы устанавливаем количество сгибов равным 10 (отличное значение по умолчанию) и перемешиваем данные перед их разбиением.

kfold = KFold(n_splits=10, shuffle=True)

Теперь мы можем оценить нашу модель (оценку) в нашем наборе данных (X и dummy_y), используя 10-кратную процедуру перекрестной проверки (kfold).

Оценка модели занимает всего около 10 секунд и возвращает объект, описывающий оценку 10 построенных моделей для каждого из разделений набора данных.

results = cross_val_score(estimator, X, dummy_y, cv=kfold)
print("Baseline: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))
Baseline: 76.10% (4.41%)

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

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

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

Вывод

И вот, это было легко.

Я надеюсь, что это поможет вам улучшить ваше обучение.

Никогда не сдавайтесь!

До встречи в Линкедине!

Использованная литература: