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