- Вопрос или проблема
- Ваш обычный настройка классификации/регрессии
- Извлечение внутренней топологии, выявленной моделью
- Ответ или решение
- Понимание и визуализация снижения размерности в моделях классификации и регрессии
- Введение
- Общая структура задачи
- Извлечение внутренней топологии модели
- 1. Визуализация важности признаков
- 2. Использование LIME для локального интерпретирования
- 3. Снижение размерности с помощью t-SNE
- 4. Иерархическая кластеризация
- Выводы и рекомендации
- Заключение
Вопрос или проблема
Кратко: Вы можете предсказать что-то, но как объяснить предсказание?
Редактирование: Я создал веб-сайт, который пытается ответить на этот вопрос с помощью внедрения / визуальной кластеризации данных в соответствии с путями, которые принимают экземпляры в дереве решений: http://explicable.ai/. Пожалуйста, напишите мне на электронную почту, если это вам интересно!
Ваш обычный настройка классификации/регрессии
Предположим, что данные представляют собой классическую задачу регрессии/классификации: несколько числовых колонок, несколько номинальных колонок и событие, которое мы пытаемся предсказать:
user1, age:18, wealth:20000, likes:tomatoes, isInBigCity:yes, hasClicked:yes user2, age:25, wealth:24000, likes:carrots , isInBigCity:no , hasClicked:no ...
С помощью случайных лесов, SVM, логистической регрессии, глубоких нейронных сетей или какого-либо другого метода мы экспортируем модель, которая может выдавать вероятность события hasClicked:yes
для нового пользователя, стоящего перед выбором кликнуть.
Извлечение внутренней топологии, выявленной моделью
Теперь эти алгоритмы выполняют сокращение размерности, сводя эти входные данные к одной вероятности. Мой вопрос заключается в следующем: как вы бы извлекли то, что делают эти модели, и показали этапы сокращения размерности человеку? Как бы вы проиллюстрировали внутреннюю топологию набора данных относительно предсказанного класса?
Я ищу либо:
-
Визуализации того, что производит модель, созданная с помощью случайных лесов, SVM, логистической регрессии, глубоких нейронных сетей.
-
Кластеризаторы, извлекаемые из моделей регрессии/классификации (Естественно, одно дерево решений можно рассматривать как иерархический кластеризатор)
-
Специфичный для модели способ проецировать входные данные в пространство, где евклидово расстояние T-SNE имеет смысл.
-
Способ обучения совместимого с T-SNE расстояния из модели регрессии/классификации.
-
Методы кластеризации, которые оптимизируют разделение одной переменной, не используя её для кластеризации.
-
Кластеризаторы, созданные на основе моделей регрессии/классификации.
Цель состоит в том, чтобы извлечь некоторую сегментацию рынка на основе поведения пользователей. И дать высокоуровневую визуализацию этого. Что-то, что четко изложит причины, почему некоторые пользователи конвертируют лучше, чем другие.
Редактирование: Давайте сократим вопрос до одного оценщика: Случайные леса; каков будет ваш ответ?
(замечание: этот ответ на стадии редактирования)
Существует множество объяснителей и диагностик машинного обучения.
Отказ от ответственности: (это должно увеличиваться со временем)
- Я не делаю его точно воспроизводимым, потому что это заняло бы в 2 раза больше времени, и в любом случае он работает как книга.
- Это больше о том, чтобы продемонстрировать метод, чем углубляться в сумасшедшие детали. Если вы хотите глубже разобраться в нюансах, это другой вопрос.
Давайте создадим пример проблемы.
Mnist — это нормальный набор данных, поэтому сначала давайте используем случайный лес для его описания, а затем мы разобьём его на части, чтобы понять, что, почему и как он работает.
Вот мой предпочитаемый “старт” потому, что если у меня его нет, это гарантирует, что я его получу.
#список пакетов
listOfPackages <- c('dplyr', #обработка данных
'ggplot2', #красивые графики
'data.table', #быстрое чтение/запись
'matrixStats', #стандартные отклонения по колонкам
'h2o', #достойный ML инструмент
'keras') #имеет данные mnist
#if not installed, then install and import
for (i in 1:length(listOfPackages)){
if(!listOfPackages[i] %in% installed.packages(fields = "Package")){
install.packages(listOfPackages[i] , dependencies = TRUE)
}
require(package = listOfPackages[i], character.only = T, quietly = T)
}
rm(i, listOfPackages)
Вот код для чтения mnist с использованием keras:
library(keras)
mnist <- dataset_mnist()
x_train <- mnist$train$x
y_train <- mnist$train$y
x_test <- mnist$test$x
y_test <- mnist$test$y
Необходимо провести небольшую подготовительную работу:
# Переопределение размерности входных данных для обучения/тестирования
x_train <- array_reshape(x_train, c(nrow(x_train), img_rows*img_cols))
x_test <- array_reshape(x_test, c(nrow(x_test), img_rows*img_cols))
df_train <- data.frame(y=y_train, x_train)
df_test <- data.frame(y=y_test , x_test)
Вот как обработать это с помощью случайного леса, используя h2o.ai, предполагая, что он уже установлен:
# Входные размеры изображения
img_rows <- 28
img_cols <- 28
#запуск h2o
h2o.init(nthreads = -1)
#перенос данных в h2o
train.hex <- as.h2o(df_train, "train.hex")
test.hex <- as.h2o(df_test, "test.hex")
#подготовка для случайного леса
x <- 1:ncol(x_train)
y <- 1
x <- x[-y]
#запуск случайного леса
myrf <- h2o.randomForest(x, y,
training_frame = train.hex,
validation_frame = test.hex,
ntrees = 150, model_id = "myrf.hex")
Вот как он сработал.
Вот обучающие/валидационные метрики
И что? Так что дальше?
У нас есть приличная модель, и она грубо совместима с (этим) эталоном, который говорит, что есть вещи с меньшей ошибкой. Где она ошибается?
В тестовом наборе данных примерно 320 неверных классификаций, и выход за рамки этих данных будет непростительным. Похоже, что она хуже всего работает с 9, 8, 2 и 3. Давайте посмотрим на 8 и 3.
Появляется предупреждение от h2o.ai:
Предупреждение:
In .h2o.processResponseWarnings(res) :
Удаление плохих и постоянных колонок: [X701, X702, X309, X672, X61, X673, X60, X674, X63, X62, X65, X64, X66, X393, X778, X779, X781, X782, X420, X783, X421, X700, X78, X79, X141, X142, X780, X448, X449, X725, X726, X727, X728, X729, X81, X80, X83, X82, X85, X730, X84, X698, X731, X87, X699, X732, X86, X337, X88, X559, X561, X169, X10, X12, X11, X14, X13, X281, X16, X15, X18, X17, X560, X19, X504, X505, X111, X112, X113, X476, X477, X753, X21, X754, X20, X755, X23, X22, X25, X24, X27, X26, X29, X28, X197, X616, X617, X30, X225, X588, X32, X589, X31, X34, X33, X36, X35, X38, X37, X39, X646, X767, X768, X769, X253, X770, X771, X772, X773, X41, X532, X774, X40, X533, X775, X43, X776, X42, X777, X45, X1, X44, X2, X47, X3, X46, X4, X49, X5, X48, X6, X7, X8, X9, X756, X757, X758, X759, X760, X50, X365, X761, X366, X762, X52, X367, X763, X51, X764, X54, X644, X765, X53, X645, X766, X56, X55, X58, X57, X59].
Шерлок Холмс говорит (приблизительно):
Как только вы исключаете невозможное, все, что остается, независимо от того, насколько маловероятно, должно [содержать] истину.
Давайте уберем невозможное из наших пикселей.
bad_cols <- which(colSds(x_train)==0)
str(bad_cols)
Среди 784 пикселей (колонок) 161 или примерно 21% не имеет информации.
Давайте посмотрим, где случайный лес думает, что сосредоточена большая часть важности.
#популярность важности
myimp <- h2o.varimp(myrf)
#сортировка по относительной важности
myimp <- myimp %>% arrange(-relative_importance)
myimp$index <- 1:nrow(myimp)
#график важностей
ggplot(myimp,aes(x=log10(index), y=log10(scaled_importance))) +
geom_point()
Это дает такой график:
Это говорит нам, что, как ни странно, большинство важностей сосредоточено всего в нескольких значениях интенсивности пикселей. Я люблю думать о принципе Парето, правиле 80/20, законе Прица или законе Лотки. Также видно, что около $10^{2.5}$ шагов связь падает и перестает вести себя последовательно по одному правилу Лотки. Возможно, это “переход в ‘физике'”, но скорее всего, это “обрыв”, где данные перестают жить.
Далее я хочу взглянуть на “королей”. В частности, я хочу знать, сколько элементов требуется, чтобы получить то же самое. Я мог бы сделать это грубой силой, но не хочу. Когда я смотрю на график, я вижу кластеры с прыжками и использую их, чтобы определить размеры тестов, которые стоит рассмотреть. Я вижу переходы на индексных значениях 10 и 19.
Давайте сделаем подмножество и начнем с LIME.
(замечание: этот ответ на стадии редактирования)
Ответ или решение
Понимание и визуализация снижения размерности в моделях классификации и регрессии
Введение
Вопрос о том, как объяснить предсказания, получаемые с помощью моделей классификации или регрессии, приобретает все большую актуальность в современных исследованиях в области машинного обучения. Особенно это важно в контексте пользовательского поведения и его анализа. В данной статье мы обсудим, каким образом можно визуализировать и понимать внутреннюю топологию данных в процессе снижения размерности, используя пример модели случайного леса (Random Forest).
Общая структура задачи
Представим себе типичную задачу классификации или регрессии. У нас есть набор данных с несколькими числовыми и номинальными признаками и целевой переменной, которую мы стремимся предсказать:
пользователь1, возраст:18, богатство:20000, любит:помидоры, живетВБольшомГороде:да, кликнул:да
пользователь2, возраст:25, богатство:24000, любит:морковь, живетВБольшомГороде:нет, кликнул:нет
...
Используя такие алгоритмы, как случайный лес, мы можем построить модель, которая будет предсказывать вероятность события "кликнул: да" для нового пользователя. Однако, как мы можем изобразить этот процесс, чтобы сделать его понятным для человека и объяснить результаты?
Извлечение внутренней топологии модели
Модели, такие как случайный лес, по своей природе выполняют снижение размерности, преобразуя многофакторное пространство признаков в одну вероятностную оценку. Чтобы визуализировать это преобразование, мы можем использовать несколько подходов.
1. Визуализация важности признаков
Первым шагом может быть анализ важности признаков, который показывает, какие особенности данных наибольшим образом влияют на предсказания модели. В R для модели случайного леса можно использовать функцию h2o.varimp()
:
myimp <- h2o.varimp(myrf)
myimp <- myimp %>% arrange(-relative_importance)
Визуализируем важность признаков с помощью ggplot2
, что позволяет определить, какие признаки оказывают основное влияние на предсказания, и уменьшить размерность за счет исключения незначимых признаков.
2. Использование LIME для локального интерпретирования
Метод LIME (Local Interpretable Model-agnostic Explanations) позволяет интерпретировать предсказания модели, создавая локальные аппроксимации. Это полезно для понимания, как модель принимает решения на уровне отдельных экземпляров.
library(lime)
explainer <- lime(df_train, myrf)
explanation <- explain(new_data, explainer, n_labels=1, n_features=5)
Здесь мы можем визуализировать, какие именно признаки оказывают наиболее значительное влияние на конкретное предсказание.
3. Снижение размерности с помощью t-SNE
Для получения наглядной визуализации высокоразмерных данных мы можем использовать алгоритм t-SNE, чтобы проецировать данные в двумерное пространство:
library(Rtsne)
tsne_results <- Rtsne(df_train[, -1]) # исключаем целевой признак
plot(tsne_results$Y, col=df_train$y)
Это позволяет видеть, как подпоследовательности данных группируются по классам и предоставляет наглядное представление о том, как модели принимают свои решения.
4. Иерархическая кластеризация
Случайный лес может быть также рассмотрен как иерархическая кластеризация. Каждое дерево в модели может быть интерпретировано как выполнение кластеризации данных, что может быть удобно для сегментации пользователей на основе их поведения. Метод можно реализовать с помощью функций, таких как hclust()
.
Выводы и рекомендации
Для извлечения внутренней топологии данных в моделях классификации и регрессии следует использовать комбинацию различных методов визуализации и анализа важности признаков. Начните с определения, какие признаки наиболее важны для модели, затем используйте методы, такие как LIME, или алгоритмы снижения размерности, чтобы предоставить среду, в которой пользователи и заинтересованные стороны могут визуально интерпретировать результаты модели.
Понимание механизмов, стоящих за предсказаниями модели, не только улучшает интерпретируемость, но и помогает в разработке более эффективных стратегий маркетинга и сегментации пользователей. Обратите внимание на дополнительные инструменты визуализации и анализа, такие как SHAP и ICE plots, которые также могут углубить понимание модели.
Для дальнейшего изучения и создания дополнительных визуализаций, вы можете воспользоваться сервисом, таким как explicable.ai, который предоставляет средства для визуализации путей, проходящих через модели, такие как дерево решений.
Заключение
Изучая внутреннюю топологию данных, помимо простого получения вероятности предсказания, мы можем значительно повысить качество принятия решений на основе аналитики пользовательского поведения. Применяя описанные методы, вы сможете не просто предсказывать, но и объяснять, почему пользователи реагируют на определенные действия.