«Данные — это новая валюта и средство обмена между потребителями и маркетологами», — Лиза Уцшнайдер.
Это третья публикация из серии Прогнозное моделирование с помощью машинного обучения (ML) в R. Более ранние публикации см. ниже.
Прогнозное моделирование с помощью машинного обучения в R — Часть 1 (Введение)
Прогнозное моделирование с машинным обучением в R — часть 2 (метрики оценки для классификации)
В этом посте мы узнаем о следующих вещах.
- Что такое классификация?
- Практический опыт работы с набором данных
- Что такое классификация?
Классификация — это форма распознавания образов, при которой алгоритм будет использовать данные поезда для выявления закономерностей в данных, которые приводят к результату. Как только он узнает с достаточной уверенностью (или точностью), он попытается предсказать результаты для будущих наборов данных.
Одним из наиболее распространенных примеров классификации, которые мы видим в нашей повседневной жизни, является классификация электронной почты на «спам» или «входящие». На рисунке вверху модель классификации классифицирует набор предметов на овощи или бакалейные товары.
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).