У меня есть фрейм данных, который выглядит так:
label predicted F1 F2 F3 .... F40
major minor 2 1 4
major major 1 0 10
minor patch 4 3 23
major patch 2 1 11
minor minor 0 4 8
patch major 7 3 30
patch minor 8 0 1
patch patch 1 7 11
У меня есть label
, которая является истинной меткой для id
(не показана, поскольку она не имеет значения), и метка predicted
, а затем набор из примерно 40 функций в моем df.
Идея состоит в том, чтобы преобразовать эти 40 функций в 2 измерения и визуализировать их истинное и предсказанное. У нас есть 9 случаев для всех трех меток major
, minor
и patch
по сравнению с их прогнозами.
С PCA он не может уловить большую дисперсию с двумя компонентами, и я не уверен, как сопоставить значения PCA с метками и прогнозами в исходном df в целом. Способ добиться этого - разделить все случаи на 9 фреймов данных и добиться результата, но это не то, что я ищу.
Есть ли другой способ уменьшить и визуализировать данные? Любые предложения будут высоко оценены.
Нет, часть корреляции еще не была выполнена, для моего анализа мы запустили модель GaussianNB, тренируя все 40 функций в моем наборе данных, чтобы увидеть, как предсказанные метки модели сравниваются с исходными метками, сделанными вручную. Теперь мы хотим увидеть, как формируются кластеры для каждого из 9 случаев, это означает, что они больше коррелируют с одним ПКА для одного случая и, возможно, со вторым ПКА для другого. Это отчасти цель.
Я тоже уже делал что-то подобное: reneshbedre.com/blog/principal-component-analysis.html, анализ загрузок для всех названий моих функций, но это было не так уж полезно, так как есть много функций, и они перекрываются, что означает отдельный график для важных функций, из-за которого я теряю шаблоны для других функций (не столь важных)
Вы можете рассмотреть небольшой множественный график с одной диаграммой рассеяния для каждой ячейки матрицы путаницы.
По моему опыту, если PCA не работает хорошо, t-распределенное стохастическое встраивание соседей (TSNE) часто является хорошей альтернативой.
Например, с набором данных радужной оболочки, который также имеет три класса прогнозирования, это может выглядеть так:
import pandas as pd
import seaborn as sns
from sklearn.manifold import TSNE
iris = sns.load_dataset('iris')
# Mock up some predictions.
iris['species_pred'] = (40 * ['setosa'] + 5 * ['versicolor'] + 5 * ['virginica']
+ 40 * ['versicolor'] + 5 * ['setosa'] + 5 * ['virginica']
+ 40 * ['virginica'] + 5 * ['versicolor'] + 5 * ['setosa'])
# Show confusion matrix.
pd.crosstab(iris.species, iris.species_pred)
species_pred setosa versicolor virginica
species
setosa 40 5 5
versicolor 5 40 5
virginica 5 5 40
# Reduce features to two dimensions.
X = iris.iloc[:, :4].values
X_embedded = TSNE(n_components=2, init='random', learning_rate='auto'
).fit_transform(X)
iris[['tsne_x', 'tsne_y']] = X_embedded
# Plot small multiples, corresponding to confusion matrix.
sns.set()
g = sns.FacetGrid(iris, row='species', col='species_pred', margin_titles=True)
g.map(sns.scatterplot, 'tsne_x', 'tsne_y');
Спасибо, что так хорошо объяснили! Это действительно очень помогло мне, оказалось, что t-sne дал лучшие кластеры, я также пробовал его на pca и umap, но формирование кластера не было таким определенным.
Что вы подразумеваете под «визуализировать истинное против предсказанного»? Какова цель? Я думал, что анализ измерений использовался для уменьшения количества функций в модели регрессии/классификации. Вы уверены, что не хотите показывать корреляцию для каждого случая (9) между функциями?