по сравнению с деревьями решений и классификаторами ближайших соседей

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

Нейронные сети для классификации работают так же, как нейронные сети для прогнозирования, хотя критерий подбора модели изменен с наименьших квадратов (как это было для прогнозирования). Реализация R nnet обрабатывает ситуации с двумя классами немного иначе, чем случаи с тремя или более классами. В случае прогноза требуется только один выходной узел, а подгонка модели выполняется по энтропийному критерию . Когда целевая переменная имеет три или более классов, количество выходных узлов равно количеству классов, и подгонка выполняется с использованием условной оценки максимального правдоподобия. В любом случае выходом является вероятность классификации.

Что я расскажу здесь

Я собираюсь создать классификаторы нейронной сети с пастернаком, используя эти данные.

Я создам нейросетевой классификатор, а также классификаторы с knn и деревом решений.

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

Я сравниваю нейронную сеть с knn и деревом решений, поэтому есть точка отсчета, по которой можно выполнить настройку.

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

моя установка: RStudio 2023.03.1 и версия R 4.2.2

library(tidyverse)
library(rsample)
library(parsnip)
library(yardstick)
library(kknn)
library(data.table)
library(nnet)
symptoms <- fread("https://raw.githubusercontent.com/NicJC/Symptoms/main/Symptoms.csv")

symptoms %>% head(n=5)

Я использую fread из пакета data.table для чтения данных, затем передаю данные по каналу, чтобы создать представление первых 5 строк.

Мне нравится использовать skimr::skim("dataset"), чтобы получить представление о том, как выглядят данные:

skimr::skim(symptoms)

Данные выглядят хорошо, нет пропущенных значений, и вы также можете видеть тип переменных.

Нам нужно преобразовать Status в коэффициент:

symptoms$Status <- as.factor(symptoms$Status)

Давайте посмотрим на матричный график данных:

library(GGally)
ggpairs(symptoms[,c(15:19)],mapping = ggplot2::aes(color = Sex),
     upper = list(continuous = wrap("density", alpha = 0.5), 
combo = "box_no_facet"))+ggplot2::labs(title = "Symptoms")  + 
theme(axis.text.x = element_text(color="steelblue",  size=12, angle=90),
      axis.text.y = element_text( color="steelblue",  size=12))

Теперь мы можем разделить и распределить данные по тестовому и обучающему наборам. Примечание. Вам понадобится library(rsample) для разделения данных.

set.seed(16814) # random seed for repeatability

split <- initial_split(symptoms, prop=0.80)
train <- training(split)
test  <- testing(split)

Модели

Я создам все модели сразу:

knn <- nearest_neighbor(mode='classification', neighbors = 5) %>%
 fit(Status ~ ., data=train)

dt <- decision_tree(mode='classification') %>%
  fit(Status ~ ., data=train)


nn <- mlp(mode='classification', hidden_units=7) %>%
  fit(Status ~ ., data=train)

Матрицы предсказания и путаницы

predict_list <- list(knn = knn %>% augment(test),
               tree  = dt %>% augment(test),
               nn  = nn %>% augment(test))


model_list <- list(knn = knn,  tree = dt, nn = nn)

pred_list <- model_list %>% map(augment, new_data=test)


pred_list %>%
  map(conf_mat, truth=Status, estimate=.pred_class)

  • Давайте посмотрим на показатели точности… (для этого мы используем критерий)
pred_list %>%
  bind_rows(.id='model') %>%
  group_by(model) %>%
  accuracy(truth=Status, estimate=.pred_class)

Здесь дерево решений работает лучше всего. Давайте немного настроим, чтобы посмотреть, сможем ли мы улучшить knn и нейронную сеть.

nearest_neighbor(mode='classification', neighbors = 10) %>%
  fit(Status ~ ., data=train) %>%
  augment(test) %>%
  accuracy(truth=Status, estimate=.pred_class)

Это лучше для классификатора knn!

Нейронная сеть:

set.seed(1234)
mlp(mode='classification', hidden_units=5, penalty = 0.001, epochs=1000) %>%
  fit(Status ~ ., data=train) %>%
  augment(test) %>%
  accuracy(truth=Status, estimate=.pred_class)

Примечание. Я использую mlp из библиотеки пастернака для классификатора нейронной сети. nnet обычно используется для предсказания.

Это даже лучше! Этот классификатор нейронной сети является лучшим.

Заключение

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

Надеюсь, статья вам понравилась и оказалась полезной.

Подписывайтесь на меня, чтобы не пропустить другие статьи о R, Julia, Python и прикладной статистике!

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