«Данные — это новая валюта и средство обмена между потребителями и маркетологами», — Лиза Уцшнайдер.

Это третья публикация из серии Прогнозное моделирование с помощью машинного обучения (ML) в R. Более ранние публикации см. ниже.

Прогнозное моделирование с помощью машинного обучения в R — Часть 1 (Введение)

Прогнозное моделирование с машинным обучением в R — часть 2 (метрики оценки для классификации)

В этом посте мы узнаем о следующих вещах.

  • Что такое классификация?
  • Практический опыт работы с набором данных
  1. Что такое классификация?

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

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

2. Практический опыт работы с набором данных

Давайте воспользуемся стандартным набором данных «радужная оболочка», доступным в R, для выполнения классификации. Для тех, кто не знает об этом наборе данных, позвольте мне дать краткий обзор. В этом известном наборе данных представлены такие переменные, как длина/ширина чашелистиков и длина/ширина лепестков, измеренные в сантиметрах, для 50 наблюдений за каждым из 3 разных видов цветов (сетоза, разноцветный и виргинский). Таким образом, входные данные — это измерения, а выходные данные (тот, который нам нужно предсказать) — виды.

В этом примере мы будем использовать пакет под названием caret, который охватывает большинство алгоритмов машинного обучения, таких как линейная модель, случайный лес (RF), машины опорных векторов (SVM) и т. д. Этот пакет также имеет удобные инструменты для разделить набор данных, а также оценить производительность модели.

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

Вот весь код — копирование и вставка этого кода в редакторе R должны работать.

Давайте пройдемся по одному разделу за раз и посмотрим, что происходит.

Раздел 0. Загрузка данных и библиотек

Caret и tidyverse — две важные библиотеки, необходимые для запуска этого скрипта. Если у вас нет этих пакетов, установите их с помощью команды install.packages.

data(iris) загружает данные радужной оболочки в среду R.

Чтобы просмотреть полный список встроенных наборов данных в R, выполните команду data() в консоли. Проверьте другие библиотеки, такие как mlbench, sonar и AppliedPredcitiveModeling, а также дополнительные наборы данных.

Раздел 1. Понимание данных

Понимание данных и опыта предметной области является ключом к созданию хорошей прогностической модели с использованием машинного обучения. Итак, давайте посмотрим сводку нашего набора данных, а также сколько классов выходных данных у нас есть в данных. Сводка показывает, что наш набор данных имеет 150 строк и 5 столбцов. Только столбец species является факторным, а остальные столбцы — числовыми. Использование команды table в нашем наборе данных iris показывает, что каждый из 3 выходных классов имеет одинаковое количество наблюдений. В реальной жизни это может быть не так, и для решения этой проблемы у нас есть такие методы, как избыточная и недостаточная выборка. Мы разберемся с этим в следующих постах.

# 1. Understanding the data
# a. Let's look at a summary of the data
str(iris)
'data.frame': 150 obs. of  5 variables:
 $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ..
# b. How many samples do we have in each class?
table(iris$Species)
   setosa versicolor  virginica 
        50         50         50

Давайте визуально посмотрим, как признаки (все столбцы, кроме выходного столбца — species) соотносятся между собой, а также с выходными данными. Для этого воспользуемся удобной командой featurePlot из пакета AppliedPredictiveModeling. Как видно из приведенного ниже фрагмента кода, эта команда строит точечную диаграмму между объектами (iris[,1:4]) и выходными данными (iris$Species). Аргумент plot указывает команду для построения эллипса вокруг точек данных. Другие параметры, которые вы можете использовать вместо эллипса: прямоугольник, разброс, плотность, пары и т. д. Вывод этой команды показан на рисунке под фрагментом кода.

# c. How are the inputs related among themselves & how are they related to the output?
transparentTheme(trans = .4)
featurePlot(iris[,1:4], iris$Species, plot = "ellipse",  auto.key = list(columns = 3))

Раздел 2. Разделение данных

На этом шаге сначала мы разделим данные на обучение и тестирование с помощью команды createDataPartition в пакете caret. Рассмотрим эту команду подробнее.

index = createDataPartition(iris$Species, p = 0.7, list = FALSE)
train_data = iris[index,]
test_data = iris[-index,]

Эта команда принимает два важных аргумента. Первый — это столбец, на основе которого мы хотим создать разделение. В нашем случае это аргумент вида. Второй аргумент — желаемое разделение: 0,7 для разделения 70–30, 0,85 для разделения 85–15 и так далее. Вывод этой команды — index — будет иметь случайные 70% строк набора данных радужной оболочки. Эта переменная index затем используется для создания обучающих и тестовых наборов данных.

Затем мы разделяем train_data и test_data на входные данные (X) и выходные данные (y). Как видно из приведенного ниже фрагмента кода, мы используем команду select в пакете dplyr для выбора только данных (без результата — Species). в X и только результат (Species) в y.

X_train = train_data %>% select(-Species)
y_train = train_data %>% select(Species)
X_test = test_data %>% select(-Species)
y_test = test_data %>% select(Species)

Раздел 3. Обучение моделей

Из приведенной выше матрицы диаграммы рассеяния мы получаем указание на то, что некоторые функции (частично) линейно разделимы в определенных измерениях. Это означает, что в целом мы получим хорошие результаты практически со всеми алгоритмами. Для иллюстрации и сравнения давайте создадим 5 моделей, что очень просто с пакетом caret. Я разделил эти модели на линейные и нелинейные. Давайте посмотрим на код и углубимся. Если вы внимательно посмотрите на фрагмент кода, синтаксис для всех моделей останется прежним, за исключением изменения аргумента method. Здесь я использовал 5 различных методов: линейный (LDA), дерево решений (rpart), knn, метод опорных векторов (svmRadial), случайный лес (rf). Полный список методов, доступных в каретке, см. здесь. Во фрагменте кода вы также заметите команду set.seed(7). Это делается для того, чтобы гарантировать, что начальное число случайных чисел сбрасывается каждый раз, и для всех моделей используются одни и те же разбиения тестов поезда. Это необходимо для обеспечения воспроизводимости и сопоставимости результатов.

# 3. Training the model(s) on the training data
metric <- "Accuracy"
# a) linear algorithm
set.seed(7)
fit.lda <- train(X_train, y_train$Species, method="lda", metric=metric)
# b) nonlinear algorithms
# CART
set.seed(7)
fit.cart <- train(X_train, y_train$Species, method="rpart", metric=metric)
# kNN
set.seed(7)
fit.knn <- train(X_train, y_train$Species, method="knn", metric=metric)
# c) advanced algorithms
# SVM
set.seed(7)
fit.svm <- train(X_train, y_train$Species, method="svmRadial", metric=metric)
# Random Forest
set.seed(7)
fit.rf <- train(X_train, y_train$Species, method="rf", metric=metric)

Раздел 4. Оценка эффективности различных моделей

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

# 4. Assessing the performance of various models
results <- resamples(list(lda=fit.lda, cart=fit.cart, knn=fit.knn, svm=fit.svm, rf=fit.rf))
summary(results)
Accuracy 
          Min.   1st Qu.    Median      Mean   3rd Qu.     Max. NA's
lda  0.9024390 0.9268293 0.9473684 0.9519305 0.9729730 1.000000    0
cart 0.8292683 0.9090909 0.9189189 0.9234116 0.9459459 0.975000    0
knn  0.8823529 0.9268293 0.9473684 0.9461249 0.9722222 1.000000    0
svm  0.8529412 0.9069767 0.9189189 0.9228863 0.9250000 0.972973    0
rf   0.8750000 0.9189189 0.9230769 0.9290644 0.9444444 1.000000    0

Раздел 5 и 6. Создание прогнозов с использованием наилучшей модели и оценка прогнозов

Мы запускаем модель LDA (fit.lda) на тестовом наборе данных, чтобы получить прогнозы, а затем оценить прогнозы. confusionMatrix – это удобная команда, которая быстро отображает результаты в виде матрицы классов x классов. В каждом столбце записываются истинные значения, а в каждой строке — прогнозы. В идеале мы хотим, чтобы эта матрица была диагональной матрицей, что означает все правильные прогнозы. Поскольку модель LDA смогла получить диагональную матрицу, точность составляет 100%.

# 5. Making predictions out of the test data using the best model - Linear
predictions <- predict(fit.lda, X_test)
# 6. Evaluating the prediction of Linear model
confusionMatrix(predictions, as.factor(y_test$Species))
Confusion Matrix and Statistics
Reference
Prediction   setosa versicolor virginica
  setosa         15          0         0
  versicolor      0         15         0
  virginica       0          0        15
Overall Statistics
                                     
               Accuracy : 1          
                 95% CI : (0.9213, 1)
    No Information Rate : 0.3333     
    P-Value [Acc > NIR] : < 2.2e-16

Выводы

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

В следующем посте давайте выберем один алгоритм (например, RF) и углубимся в нормализацию данных, перекрестную проверку, настройку параметров и извлечение признаков из другого набора данных. А пока попробуйте подход, который мы обсуждали здесь, на наборе данных iris только с двумя классами (исключая virginica).