Алгоритм 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 — следите за обновлениями, позвольте мне рассказать больше в следующий раз!

Ссылка

Конец примечаний:

Спасибо за чтение этой статьи, любые отзывы/вопросы высоко ценятся. Смело обращайтесь для дальнейшего сотрудничества 😃

(статья по теме, но в простой версии была опубликована тем же автором на paullo.myvnc.com/blog/ еще в 2016 году)