Алгоритм t-распределенного стохастического встраивания соседей (t-SNE)
Прежде всего, что такое t-SNE и когда и почему мы его используем? Это алгоритм unsupervised
и non-linear
dimension reduction
, люди обычно используют его во время exploratory data analysis
, ранней стадии всего конвейера машинного обучения. Это помогает нам отображать многомерные наборы данных (например, многие функции) с помощью 2D- или 3D-графика (или других относительно небольших чисел) и, таким образом, получить быстрое интуитивное представление о данных. Он НЕ разработан таким образом, чтобы применять его непосредственно к задаче классификации.
А как насчет PCA? В области сокращения параметров люди часто сравнивают его с PCA
или Principal Component Analysis
. На самом деле, t-SNE
– гораздо более новый подход, разработанный Лоренсом ван дер Маатенсом и Джеффри Хинтоном в 2008 году (см. статью «Визуализация данных с использованием t-SNE здесь»), в то время как PCA был разработан Хотеллингом. Х. еще в 1933 г. (Разложение комплекса статистических переменных на главные компоненты), почти 3 поколения назад!
Как упоминалось в документе t-SNE, безусловно, существуют некоторые ограничения для моделей линейного типа, таких как PCA: «Для многомерных данных, которые лежат на малоразмерных или рядом с ними, нелинейное многообразие обычно важнее, чтобы низкоразмерные представления очень похожих точек данных находились близко друг к другу, что обычно невозможно при линейном отображении”
Чтобы лучше понять это, мы можем взглянуть на лежащий в основе алгоритм (и множество замечательных статей PCA vs t-SNE в Интернете), помимо раздела Алгоритм в исходной статье, я также настоятельно рекомендую этот An иллюстрированное введение в алгоритм t-SNE, которое обеспечивает очень интуитивное, но математическое представление о модели. Чтобы перейти к разделу кодирования, давайте просто скажем, что t-SNE
более эффективен при обработке определенных типов сложных данных по сравнению с линейным подходом PCA
. Как показано на следующих рисунках, скрипт Kaggle, созданный puyokw, наглядно демонстрирует возможности t-SNE.
Код
Для Р
Шаг 1. Установите и загрузите пакет Rtsne
install.packages("Rtsne") # Install Rtsne from CRAN library library(Rtsne)
Шаг 2. Загрузите набор данных для нашего примера использования
> iris_unique <- unique(iris) # remove duplicate rows > head(iris_unique) Sepal.Length Sepal.Width Petal.Length Petal.Width Species 1 5.1 3.5 1.4 0.2 setosa 2 4.9 3.0 1.4 0.2 setosa 3 4.7 3.2 1.3 0.2 setosa 4 4.6 3.1 1.5 0.2 setosa 5 5.0 3.6 1.4 0.2 setosa
Шаг 3. Сопоставьте с t-SNE и визуализируйте
Да - это действительно так просто
> iris_matrix = as.matrix(iris_unique[,1:4]) # note: we can only pass in numeric columns > tsne_out <- Rtsne(iris_matrix) > plot(tsne_out$Y,col=iris$Species) # graph is now generated
Теперь давайте попробуем использовать другой реальный набор данных, но гораздо более сложный — набор данных бронирования пользователей Airbnb в конкурсе Kaggle. С помощью следующего кода мы можем проверить его визуализацию в 2D-пространстве.
Шаг 1. Загрузите данные: Набор данных Airbnb (в обучающем наборе данных 213 451 строка)
> library(readr) > df_train = read_csv(“train_users.csv”) # subset numerical features > numeric_columns = sapply(df_train, is.numeric) > countries = as.factor(df_train$country_destination) > df_train = df_train[, numeric_columns] > df_train$country_destination = countries # put destination column back > df_train_unique <- unique(train) # de-duplication > dim(df_train_unique) [1] 213451 31
Шаг 2. Соответствуйте t-SNE и сгенерируйте график
> matrx = as.matrix(df_train_unique) > tsne_out <- Rtsne(matrx) > plot(tsne_out$Y, col=countries, main=’t-SNE of airbnb dataset on Kaggle (31 features)’)
На Rtsne()
и unique()
ушло 20–30 минут, и получившийся график был плохим, что означало, что я еще не придумал хороших функций, чтобы разделить 12 разных стран назначения для точного прогноза.< br /> (Скорость можно улучшить с помощью таких параметров, как theta, max_iter и т. д.)
> colnames(df_train) [1] “timestamp_first_active” “age” [3] “signup_flow” “-unknown-” [5] “Android App Unknown Phone/Tablet” “Android Phone” [7] “Blackberry” “Chromebook” [9] “Linux Desktop” “Mac Desktop” [11] “Opera Phone” “Tablet” [13] “Windows Desktop” “Windows Phone” [15] “iPad Tablet” “iPhone” [17] “iPodtouch” “total_elapsed_time” [19] “-unknown-_pct” “Android App Unknown Phone/Tablet_pct” [21] “Android Phone_pct” “Blackberry_pct” [23] “Chromebook_pct” “Linux Desktop_pct” [25] “Mac Desktop_pct” “Opera Phone_pct” [27] “Tablet_pct” “Windows Desktop_pct” [29] “Windows Phone_pct” “iPad Tablet_pct” [31] “iPhone_pct”
Код Python
Для любителей Python мы будем использовать пакет TSNE
под sklearn.manifold
, простой вариант использования выглядит следующим образом, хотя есть необязательные параметры, включая learning_rate, n_components (размер встроенного пространства, по умолчанию=2), n_iter(максимальное количество итераций для оптимизации) играть с
from sklearn.manifold import TSNE import matplotlib.pyplot as plt X_tsne = TSNE().fit_transform(df_train_unique) scatter(X_tsne[:, 0], X_tsne[:, 1], c=countries,cmap=plt.cm.spectral,alpha=.4, edgecolor='k')
Компромисс: высокая временная и пространственная сложность
Когда я передал завершенные 150+ объектов (включая категориальные поля, добавленные dummyVars()
) из 200 000 точек данных для построения 2D-визуализации t-SNE, это заняло целую вечность и съело 25 ГБ. памяти в моем MBP, довольно страшно….!
Помимо этого, t-SNE требует больших вычислительных ресурсов. Как показано в документах sklearn, в том же семействе Manifold Learning (нелинейное уменьшение размерности) t-SNE может занять в 6–100 раз больше по сравнению с другими моделями, такими как Спектральное вложение (SE) и Многомерное вложение Масштабирование (MDS).
Когда мы думаем о базовом алгоритме, t-SNE должен вычислять расстояния между всеми точками и поддерживать попарную матрицу расстояний N на N (N = количество примеров).Следовательно, его пространственная и временная сложность находятся на квадратичном уровне,O(n²), и эта проблема, естественно, становится еще одной популярной областью исследований, которую люди пытаются оптимизировать. Одним из примеров является Быстрое преобразование Фурье. -accelerated Interpolation-based t-SNE (FIt-SNE)», подробности можно найти в статье здесь.
Продолжение следует……
Возвращаясь к примеру с набором данных Airbnb, мы должны получить лучший результат визуализации с помощью t-SNE — следите за обновлениями, позвольте мне рассказать больше в следующий раз!
Ссылка
- [Python] sklearn.manifold TSNE
- [R] Rtsne {Rtsne} документация pdf
- [R]dummyVars() — перевести категориальные данные в числовые для целей моделирования (doc)
- [Kaggle script] — Визуализация t-SNE, конкурс Отто
- [Kaggle script] — кластеры в 2D с tsne VS pca, Digit Recognizer
- [Статья] Полное руководство по алгоритму t-SNE с реализацией в R & Python, Analytics Vidhya
- [Статья] Как эффективно использовать t-SNE
- [Бумага] Маатен, Л.В.Д., и Хинтон, Г. (2008). Визуализация данных с использованием t-SNE. Журнал исследований машинного обучения, 9 (ноябрь), 2579–2605.
Конец примечаний:
Спасибо за чтение этой статьи, любые отзывы/вопросы высоко ценятся. Смело обращайтесь для дальнейшего сотрудничества 😃
(статья по теме, но в простой версии была опубликована тем же автором на paullo.myvnc.com/blog/ еще в 2016 году)