по сравнению с деревьями решений и классификаторами ближайших соседей
Классификаторы нейронных сетей — это тип алгоритма машинного обучения, который использует искусственные нейронные сети для классификации входных данных по различным категориям. Эти классификаторы обычно состоят из нескольких слоев взаимосвязанных нейронов, которые обрабатывают входные данные и производят выходную классификацию.
Нейронные сети для классификации работают так же, как нейронные сети для прогнозирования, хотя критерий подбора модели изменен с наименьших квадратов (как это было для прогнозирования). Реализация 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, вы можете использовать мою реферальную ссылку, чтобы поддержать меня. Спасибо.