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

Но задумывались ли вы когда-нибудь о том, полезен ли для вас гриб, который вы едите? Из более чем 14 000 видов грибов в мире, как вы классифицируете этот гриб как съедобный или ядовитый? Ядовитые грибы трудно обнаружить в дикой природе!

Введение

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

Набор данных

Набор данных, используемый в этом проекте, - Mushrooms.csv, который содержит 8124 экземпляра грибов с 23 характеристиками, такими как форма шляпки, поверхность шляпки, цвет шляпки, синяки, запах и т. Д.

Мы будем использовать такие характеристики, как форма шляпки, цвет шляпки, цвет жабр и т. Д., Чтобы классифицировать грибы на съедобные и ядовитые.

Давайте начнем !!

Импорт необходимых библиотек

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

Чтение CSV-файла набора данных

Функция Pandas read_csv () импортирует файл CSV (в нашем случае «грибов.csv») в формат DataFrame.

Изучение данных

После импорта данных, чтобы узнать больше о наборе данных, мы будем использовать .head () .info () и .describe (). методы.

Метод .head () предоставит вам первые 5 строк набора данных. Вот результат:

Метод .info () предоставит вам краткое резюме DataFrame. Этот метод распечатает информацию о DataFrame, включая dtype индекса и dtypes столбца, ненулевые значения и использование памяти. Вот результат:

Метод .describe () предоставит вам статистику столбцов.

  • count показывает количество ответов.
  • уникальный показывает количество уникальных категориальных значений.
  • вверху показывает наиболее часто встречающееся значение категории.
  • freq показывает частоту / количество наиболее часто встречающихся категориальных значений.

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

Форма набора данных

Dataset shape: (8124, 23)

Это показывает, что наш набор данных содержит 8124 строки, т. Е. Экземпляры грибов, и 23 столбца, т. Е. Такие характеристики, как форма шляпки, поверхность шляпки, цвет шляпки, синяки, запах, жабры. -размер и др.

Уникальные вхождения столбца "класс"

Метод .unique () предоставит вам уникальные вхождения в столбце «класс» набора данных. Вот результат:

array(['p', 'e'], dtype=object)

Как мы видим, в столбце «класс» набора данных есть два уникальных значения:

‘P’ - ›ядовитый и‘ e ’-› съедобный

Подсчет уникальных вхождений столбца "класс"

Метод .value_counts () подсчитает количество уникальных вхождений. Вот результат:

e    4208
p    3916
Name: class, dtype: int64

Как мы видим, в наборе данных имеется 4208 случаев съедобных грибов и 3916 случаев появления ядовитых грибов.

Теперь давайте визуализируем количество съедобных и ядовитых грибов с помощью Сиборна:

Здесь «count.index» представляет уникальные значения, например, «e» и «p», а «count.values» представляет собой количество этих уникальных значений, то есть 4208 и 3916 соответственно. Вот результат гистограммы:

На гистограмме мы видим, что набор данных сбалансирован.

Манипуляция данными

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

Подготовка данных

Мы будем использовать 80% нашего набора данных для обучения и 20% для тестирования. Мы не можем вручную разделить наш набор данных, также нам нужно разбить набор данных случайным образом. Чтобы помочь нам с этой задачей, мы будем использовать библиотеку SciKit с именем train_test_split. Мы будем использовать 80% нашего набора данных для обучения и 20% для тестирования.

(1625, 117)

А теперь давайте продолжим и создадим нашу модель глубокого обучения.

Sequential() функция - это самый простой способ построить модель в Keras. Он позволяет строить модель слой за слоем. Каждый слой имеет веса, соответствующие следующему за ним слою. Мы используем функцию add() для добавления слоев к нашей модели.

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

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

ReLU - наиболее часто используемая функция активации в моделях глубокого обучения. Функция возвращает 0, если получает любой отрицательный ввод, но для любого положительного значения x она возвращает это значение обратно. Таким образом, это можно записать как f (x) = max (0, x)

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

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

Давайте построим:

Составление модели

Теперь, когда модель определена, мы можем ее скомпилировать.

Компиляция модели использует эффективные числовые библиотеки под оболочкой (так называемый бэкэнд), такие как Theano или TensorFlow. Бэкэнд автоматически выбирает лучший способ представления сети для обучения и создания прогнозов для работы на вашем оборудовании, таком как CPU или GPU, или даже распределенном.

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

В этом случае мы будем использовать перекрестную энтропию в качестве аргумента потери. Эта потеря связана с проблемами двоичной классификации и определяется в Керасе как «binary_crossentropy». Мы определим оптимизатор как эффективный алгоритм стохастического градиентного спуска «sgd«.

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

Резюме модели

Давайте посмотрим на краткое изложение нашей модели:

Теперь давайте подберем модель:

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

...
Epoch 10/15
204/204 [==============================] - 0s 2ms/step - loss: 0.0548 - accuracy: 0.9835 - val_loss: 0.0163 - val_accuracy: 0.9963
Epoch 11/15
204/204 [==============================] - 0s 2ms/step - loss: 0.0526 - accuracy: 0.9849 - val_loss: 0.0140 - val_accuracy: 0.9988
Epoch 12/15
204/204 [==============================] - 0s 2ms/step - loss: 0.0417 - accuracy: 0.9888 - val_loss: 0.0116 - val_accuracy: 0.9994
Epoch 13/15
204/204 [==============================] - 0s 2ms/step - loss: 0.0402 - accuracy: 0.9905 - val_loss: 0.0100 - val_accuracy: 0.9994
Epoch 14/15
204/204 [==============================] - 0s 2ms/step - loss: 0.0370 - accuracy: 0.9908 - val_loss: 0.0083 - val_accuracy: 0.9994
Epoch 15/15
204/204 [==============================] - 0s 2ms/step - loss: 0.0304 - accuracy: 0.9928 - val_loss: 0.0069 - val_accuracy: 0.9994

Оценка модели

Функция Assessment () вернет список с двумя значениями. Первым будет потеря модели в наборе данных, а вторым - точность модели в наборе данных.

51/51 [==============================] - 0s 951us/step - loss: 0.0069 - accuracy: 0.9994
Accuracy: 99.94
Loss: 0.69

Теперь давайте визуализируем обучение модели:

Давайте определим функцию для построения графиков.

Построение кривых с использованием функции, определенной выше:

Объект истории содержит всю информацию, собранную во время обучения.

Графики:

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

Делаем прогнозы по некоторым значениям:

array([[1, 0],
       [1, 0],
       [0, 1],
       [0, 1],
       [1, 0],
       [1, 0],
       [0, 1],
       [0, 1],
       [1, 0],
       [0, 1]])

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

Реализация проекта на цоколе здесь.

Предоставлено: Джит Чавла