Мотивация

Практикуйте контролируемую множественную классификацию с использованием нейронной сети.

Сценарий

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

Стратегия

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

Интуиция

Я обсуждал основы нейронной сети в предыдущей статье здесь. Поскольку это проблема множественной классификации, необходимо предсказать 3 отдельных вида: «setosa», «versicolor» или «virginica».

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

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

— Из функции активации Softmax с Python, Джейсон Браунли из Machine Learning Mastery

Блокнот

Загрузить данные из пакета sklearn

# Load DataFrame
import sklearn
df = load_iris(return_X_y = True, as_frame = True)
df = pd.concat((df[0], df[1]), axis = 1)
df = pd.concat((df, pd.get_dummies(df['target'], prefix = 'target')), axis = 1)

Выполните корреляционный анализ

sns.heatmap(df.corr(), annot = True)

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

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

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

sns.pairplot(df.iloc[:,:-3], hue="target")

Примечание: 0 = «сетоза», 1 = «разноцветный», 2 = «виргиника».

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

Подготовить стандартизацию функций

# One hot encoding
enc = OneHotEncoder(sparse_output = False)
y_train = enc.fit_transform(np.array(y_train).reshape(-1,1))
y_test = enc.transform(np.array(y_test).reshape(-1,1)) # Need to one-hot encode output for the neuralnetwork output layer

normalizer = tf.keras.layers.Normalization(axis=-1)
normalizer.adapt(X_train)

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

Создайте архитектуру глубокого обучения

# Building the Neural Network

network = models.Sequential()
#network.add(layers.Dense(16, activation = "relu", input_dim= feature_dim))
network.add(normalizer)
network.add(layers.Dropout(.2))
network.add(layers.Dense(16, activation = "relu"))
network.add(layers.Dropout(.2))
network.add(layers.Dense(units = 3, activation = 'softmax'))

# Compile Neural Network
network.compile(loss = "categorical_crossentropy",
                optimizer = "adam",
                metrics = ["accuracy"]
                )

network.summary()

Обучите нейронную сеть

# Train Model
history = network.fit(X_train,#X_train_transformed,
                    y_train,
                    epochs = 50,
                    batch_size = 32,
                    validation_split = .33
                    #validation_data = (X_test_transformed, y_test)
)

Оцените потери

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

Оцените кривую ROC

from sklearn.metrics import roc_curve, auc
fpr, tpr, threshold = roc_curve(y_test.ravel(), predictions.ravel())

plt.plot(fpr, tpr, label='AUC = {:.3f}'.format(auc(fpr, tpr)))
plt.xlabel('False positive rate')
plt.ylabel('True positive rate')
plt.title('ROC curve')
plt.legend();

Используя ravel, нам не нужно рассчитывать отдельные кривые AUC и усреднять их. При AUC 0,984 модель хорошо прогнозирует виды ирисов.

Оцените матрицу путаницы

На первый взгляд есть:

  • идеальный прогноз для сетоса.
  • ложноотрицательные результаты при прогнозировании лишая
  • ложные срабатывания в прогнозировании виргиники

Оцените показатели

Общая точность составляет 87%. Из 30 тестовых записей только 4 были предсказаны неправильно. Модель предсказала, что они виргинские, хотя должны были быть разноцветными.

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

Краткое содержание

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

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

Ссылки/Ресурсы/Благодарности

  1. Поваренная книга по машинному обучению Python от Криса Албона
  2. https://www.kaggle.com/rushabhwadkar/deep-learning-with-keras-on-iris-dataset
  3. https://machinelearningmastery.com/how-to-make-classification-and-regression-predictions-for-deep-learning-models-in-keras/
  4. https://janakiev.com/blog/keras-iris/
  5. https://stackoverflow.com/questions/43589842/test-score-vs-test-accuracy-when-evaluating-model-using-keras
  6. https://medium.com/@dtuk81/confusion-matrix-visualization-fc31e3f30fea
  7. https://dev.to/thalesbruno/subplotting-with-matplotlib-and-seaborn-5ei8
  8. https://towardsdatascience.com/interpreting-roc-curve-and-roc-auc-for-classification-evaluation-28ec3983f077
  9. https://developers.google.com/machine-learning/crash-course/multi-class-neural-networks/softmax

Похожие статьи от меня

  • Прогнозирование возраста опоссума с использованием искусственной нейронной сети Keras