Как вы, возможно, уже знаете, машинное обучение предоставляет мощные инструменты для создания моделей классификации — моделей, которые используются для классификации или распределения данных по различным классам или категориям на основе их характеристик или атрибутов.
В этом посте представлен вероятностный подход к решению задач классификации с использованием программирования на R и STAN, мощного языка статистического моделирования, основанного на гамильтоновых алгоритмах Монте-Карло.
НАБОР ДАННЫХ
Чтобы продемонстрировать, как это сделать, мы воспользуемся набором данных Salmons, в котором записаны 5 характеристик от 1000 клиентов, и используем его для построения модели классификации, которая может предсказать, будет ли клиент ответить на рекламную кампанию на основе расходов клиента за последний год и того, есть ли у клиента кредитная карта Salmon или нет.
Скриншот файла Excel показан ниже:
СЦЕНАРИЙ R
Мы используем R для чтения и обработки данного набора данных, готового для построения модели классификации. Вот скрипт R, который нам нужен для нашей задачи.
library(readxl) library(rstan) library(cvms) library(tibble) # tibble() source('utilities.R') salmons <- read_excel('Salmons.xlsx') salmons$Spending <- scale(salmons$Spending) head(salmons) #Split data to train and validtion sets set.seed(1) #use 70% of dataset as training set and 30% as validation set sample <- sample(c(TRUE, FALSE), nrow(salmons), replace=TRUE, prob=c(0.7,0.3)) train <- salmons[sample ,] valid <- salmons[!sample, ] predictor <- model.matrix(~Spending+Card,data=train) response <- train$Coupon test_set <- model.matrix(~Spending+Card,data=valid) N=length(response) K=ncol(predictor) N_test <- nrow(test_set) stan_data <- list(N=N,K=K,N_test=N_test,predictor=predictor,response=response,test_set=test_set) fit <- stan('salmons.stan',data = stan_data,cores=4) print(fit,pars = c('theta')) theta <- extract(fit)$theta test_predictions <- extract(fit)$test_predictions #calculating point estimates for probabilities: prediction_estimates = apply(test_predictions,2,median) final_predictions = sapply(prediction_estimates,getPredictions) #Plot the confusion matrix res <- tibble("target" = valid$Coupon,"prediction" = final_predictions) res_table <- table(res) cfm <- as_tibble(res_table) plot_confusion_matrix(cfm, target_col = "target", prediction_col = "prediction", counts_col = "n")
Сценарий начинает с импорта необходимых библиотек, а затем считывает файл Excel, содержащий данные.
Затем данные разбиваются на наборы для обучения и проверки в соотношении от 0,7 до 0,3 соответственно. Мы будем использовать обучающий набор для построения модели классификации и проверочный набор для проверки производительности модели.
ПРЕДМОДЕЛИРОВАНИЕ
Перед фактическим моделированием мы решаем и извлекаем переменные/функции, которые хотим включить в нашу модель. Обычно это повторяющийся процесс, для нашего случая мы решили смоделировать переменную отклика. быть столбцом купона, а столбцы Расходы и карты – предикторами для нашей модели. т. е. Зная только расходы клиента за прошлый год и наличие у клиента карты Salmon Card, мы хотим иметь возможность предсказать, отреагируют ли они на рекламную акцию (столбец «Стоимость купона»).
МОДЕЛИРОВАНИЕ — СТЭН
В этой части происходит волшебство. Мы используем STAN, мощный инструмент статистического моделирования, для построения нашей модели. Подробнее о документации STAN можно прочитать здесь. Для нашей сегодняшней цели мы сосредоточимся на общей структуре кода STAN и покажем, как с ее помощью построить модель логистической регрессии.
Вот код STAN для построения модели логистической регрессии, подходящей для нашей задачи.
data { int<lower=0> N; int<lower=0> N_test; int<lower=0> K; int response [N]; matrix[N,K] predictor; matrix[N_test,K] test_set; } parameters { vector [K] theta; } model { response ~ bernoulli_logit(predictor*theta); } generated quantities{ real test_predictions [N_test]; for (i in 1:N_test) test_predictions[i] = inv_logit(test_set[i]*theta); }
Этот код STAN состоит из 4 основных блоков. Первый блок — это блок данных, который используется для получения данных, необходимых для построения модели.
Второй блок — это блок параметров, определяющий все параметры, которые мы хотим, чтобы наша модель могла восстановить. В нашем случае мы хотим восстановить 3 коэффициента — перехват, коэффициент за Расходы и коэффициент за Карту.
В-третьих, мы определяем блок модели, этот блок определяет модель, которую мы хотим построить. Поскольку это проблема классификации, мы решили построить модель bernouli_logit, подтверждающую наше предположение о том, что моделируемая нами переменная отклика является бинарной переменной, полученной в результате процесса Бернулли.
Наконец, сгенерированный блок количественных показателей помогает нам моделировать прогнозы для нашего проверочного набора, который можно использовать для измерения производительности нашей модели.
ПОЛУЧЕННЫЕ РЕЗУЛЬТАТЫ
Подгонка этой модели к нашим данным приводит к следующим параметрам модели.
Как видно, модель смогла восстановить все параметры, ответственные за прогнозы модели, и их соответствующие 95% доверительные интервалы.
Выполняя точечные оценки по распределению восстановленных параметров, можно показать, что эта модель имеет точность 93,6%. Как видно из приведенной ниже матрицы путаницы, модель имеет только 1% ложноположительных результатов и 5,3% ложноотрицательных результатов.
ЗАКЛЮЧЕНИЕ
R и STAN могут быть очень мощной комбинацией для построения статистических/вероятностных моделей для решения большинства задач регрессии и классификации.
В этом посте мы рассмотрели пошаговый процесс построения модели классификации, используя эти два мощных инструмента, чтобы предсказать, будет ли клиент реагировать на рекламную кампанию, основываясь на прошлогодних расходах клиента и наличии у него Лосось кредитная карта или нет.
Исходный код и данные, использованные в этом посте, можно найти по ссылке GitHub ниже: