В Моделях классификации машинного обучения (часть I), охватывающих модели классификации машинного обучения, которые производят предсказание дискретной метки или категории, я рассмотрел два алгоритма: логистическая регрессия и K-ближайший сосед. Теперь я расскажу об остальных моделях, описываю их преимущества и варианты использования. Функциональность этих моделей, как правило, сложнее, чем у двух предыдущих моделей, но благодаря функциям в R мы можем просто использовать тот же формат кода из Части I.

Общий формат (Шаблон)

  1. Импорт и предварительная обработка данных
‘
=== === ===
Data Preprocessing
=== === ===
‘
#Import Data
dataset = read_csv(‘medexpense_data.csv’)
attach(‘medexpense_data.csv’)
#Change Smoke and Gender into binary values
SMOKER<-ifelse(dataset$smoker==”yes”, 1, 0)
GENDER<-ifelse(dataset$gender==”male”, 1, 0)
MODIFIED_DATASET <- data.frame(dataset$medical_expenses, dataset$bmi, dataset$age, GENDER, SMOKER)

2. Разделение данных в тренировочном/тестовом наборе и масштабирование

‘
=== === ===
Splitting Data and Feature Scaling
=== === ===
‘
#Splitting Data into training and test data (25/75)
install.packages(‘caTools’)
library(caTools)
set.seed(123)
split= sample.split(MODIFIED_DATASET$GENDER, SplitRatio = 0.75)
training_set = subset(MODIFIED_DATASET, split==TRUE)
test_set = subset(MODIFIED_DATASET, split==FALSE)
# Feature Scaling
training_set[, 1:3] = scale(training_set[, 1:3])
test_set[, 1:3] = scale(test_set[, 1:3])

3. Обучение

‘
=== === ===
Training
=== === ===
‘
#Varies based on model

4. Визуализация

'
=== === ===
Data Visualization
=== === ===
‘
#Create Confusion Matrix (Real VS Predicted)
conf_matrix = table(test_set[,5], dependent_pred)
conf_matrix
fourfoldplot(conf_matrix)

Пример данных, над которыми я буду работать, представлен в следующей таблице:

Метод опорных векторов (SVM)

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

Метод

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

Пример

Используя тот же шаблон для задачи из части I, я просто изменю раздел обучения для функции R, необходимой для обучения SVM, а затем просмотрю матрицу путаницы. Для этой модели потребуется пакет e(1071), а также для Kernel SVM и Naive Bayes.

‘
=== === ===
Training
=== === ===
‘
#SVM
#Fitting classifier to Training Set
install.packages(‘e1071’)
library(e1071)
classifier = svm(formula = SMOKER ~ ., data = training_set, type = ‘C-classification’, kernel = ‘linear’)
#Predict test set results
dependent_pred = predict(classifier, newdata = test_set[-5])

Из матрицы путаницы мы видим, что точность модели имела десять неверных прогнозов, которые, начиная с части I, примерно так же точны, как логистическая регрессия и K-NN. Однако это в какой-то степени ожидаемо, поскольку данные соответствуют линейному шаблону как есть, и поэтому не будет заметно улучшений от использования другой линейной модели, такой как SVM, показанной на графике. Следующая модель, которая является нелинейной, может предсказывать немного лучше, но следует отметить, что она работает намного лучше для нелинейных данных, как мы покажем в следующем разделе.

Ядро SVM

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

Метод

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

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

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

  • Гауссовский РФП
  • сигмовидная
  • Полиномиальный

Пример

Код R для Kernel SVM будет выглядеть почти так же, как SVM, с небольшой корректировкой изменения параметра ядра. В этом примере я буду использовать функцию Гаусса, поэтому для этого случая она установлена ​​​​радиальной.

‘
=== === ===
Training
=== === ===
‘
#Kernel SVM
#Fitting Kernel SVM to Training Set
library(e1071)
classifier= svm(formula = SMOKER ~ ., data = training_set, type = ‘C-classification’, kernel = ‘radial’)
#Predict test set results
dependent_pred = predict(classifier, newdata = test_set[-5])

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

Наивный Байес

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

Метод

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

Пример

Для реализации алгоритма Naive Bayes в R я использую функцию naiveBayes() в библиотеке e1071 и задаю необходимые параметры. Функция naiveBayes() требует, чтобы зависимая переменная SMOKER была закодирована как классификатор на этапе предварительной обработки данных перед разделением данных. Затем выводится матрица путаницы.

‘
=== === ===
Data Preprocessing
=== === ===
‘
#Follow template …
#Encoding the Target Feature as factor
MODIFIED_DATASET$SMOKER = factor(MODIFIED_DATASET$SMOKER, levels = c(0,1))
‘
=== === ===
Training
=== === ===
‘
#Naive Bayes
#Fitting Kernel SVM to Training Set
library(e1071)
classifier= naiveBayes(x = training_set[-5], y = training_set$SMOKER)
#Predict test set results
dependent_pred = predict(classifier, newdata = test_set[-5])

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

Классификация дерева решений

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

Метод

На самом базовом уровне модель дерева решений разделяет данные на несколько срезов. Каждое разделение производится, чтобы максимизировать количество очков в категории в зоне или листе. Чтобы увидеть математику выбора каждого разделения, см. Дерево решений — классификация.

Пример

При использовании шаблона требуется только одно изменение в разделе обучения и использование новой библиотеки rpart для создания классификатора. Затем я могу вывести матрицу путаницы.

‘
=== === ===
Training
=== === ===
‘
#Decision Tree
#Fitting Decision Tree to Training Set
install.packages(‘rpart’)
library(rpart)
classifier = rpart(formula = SMOKER ~ ., data = training_set)
#Predict test set results
dependent_pred = predict(classifier, newdata = test_set[-5], type = ‘class’)

Модель по-прежнему предсказывает примерно с той же ошибкой, что и предыдущие модели с 10 неверными предсказаниями. Наша следующая модель может улучшить это, используя много деревьев, а не только одно.

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

#Plot Tree
plot(classifier)
text(classifier)

Случайная классификация леса

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

Метод

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

  1. Случайным образом выберите k точек данных из набора тестов
  2. Построить дерево, связанное с этими точками
  3. Выберите количество N деревьев для постройки, а затем повторите шаги 1 и 2.
  4. Для новой точки данных заставьте каждое дерево сделать прогноз по категории и назначьте точку категории, которая набирает большинство голосов.

Пример

В R библиотека randomForest используется для создания классификатора случайного леса. Опять же, единственное изменение, помимо импорта этой библиотеки, находится в разделе обучения с использованием randomForest() для создания классификатора. Количество выбранных деревьев равно 25. Это можно изменить, но следует помнить о переоснащении данных. Затем можно вывести матрицу путаницы.

‘
=== === ===
Training
=== === ===
‘
#Random Forest
#Fitting Decision Tree to Training Set
install.packages(‘randomForest’)
library(randomForest)
classifier = randomForest(x = training_set[-5], y = training_set$SMOKER, ntree = 25)
#Predict test set results
dependent_pred = predict(classifier, newdata = test_set[-5])

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

Заключительные замечания

Хотя все модели давали примерно одинаковое небольшое количество неверных прогнозов с точностью около 96%, это не относится ко всем наборам данных, которые будут иметь различное количество независимых переменных и могут лучше соответствовать разным кривым. Вот почему важно использовать модель, которая лучше всего моделирует используемый вами набор данных и проверяется перекрестной проверкой в ​​k-кратном порядке. Затем улучшите настройку параметров.

Совокупный профиль точности

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

Ресурсы

Алгоритмы классификации: алгоритмы классификации и кластеризации

Алгоритмы ядра: кулинарная книга ядра

Алгоритмы ядра: функции ядра для приложений машинного обучения

Наивный Байес: Наивный Байес для машинного обучения

Деревья решений: Дерево решений — Классификация.

Расчет точности с помощью матрицы путаницы: точность классификации

CAP: кумулятивный профиль точности