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

В этом посте представлен вероятностный подход к решению задач классификации с использованием программирования на 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 ниже: