Machine Learning · Insper

Redução de Dimensionalidade

Poucas colunas novas que guardam o que importa

A maldição da dimensionalidade, o PCA (análise de componentes principais) à mão e os mapas do t-SNE (t-distributed stochastic neighbor embedding) e do UMAP (uniform manifold approximation and projection)

Por que reduzir? O motivo escolhe o método

objetivoo que se exige do métodométodo típico
ver os dadosuma figura em 2D ou 3D; fidelidade local bastat-SNE, UMAP
comprimir / acelerarreconstrução e uma transformação para dados novosPCA
remover ruído / colinearidadedescartar as direções de baixa variânciaPCA
alimentar outro modelofit/transform honestos, sem vazamentoPCA (quase sempre)
Confundir esses motivos está por trás de quase todo mau uso desses métodos.

O caminho desta aula

  1. A maldiçãoas distâncias perdem contraste
  2. Linear: PCAà mão, escala, escolha de k, reconstrução
  3. Não linear: t-SNE, UMAPonde o PCA se esgota, o que um mapa não diz
  4. Comparar e escolherlado a lado, afirmações proibidas, o objetivo decide
Cada etapa responde a uma pergunta: por que muitas colunas atrapalham? → quais poucas direções guardam mais variância? → como mapear uma estrutura curva e o que o mapa pode dizer? → qual método serve a qual objetivo?
Etapa 1 · Por que muitas colunas atrapalham?

A maldição da dimensionalidade

Sorteie pontos no cubo unitário e olhe as distâncias entre eles.

Preveja. Em 1.000 dimensões, quanto o vizinho mais distante de um ponto está mais longe que o mais próximo: 40 vezes, 10 vezes ou uns 10%?

Simulador: distâncias em \(d\) dimensões

Aumente \(d\) e veja o histograma das distâncias colapsar num pico.

Contraste relativo, medido

\((d_{\max} - d_{\min})/d_{\min}\), mediana sobre 400 pontos:

\(d\)colunas de ruídofolha 2D em \(d\) colunas
242,9739,23
102,2741,51
1000,3945,88
10000,1144,24
Contraste relativo contra o número de colunas: com ruído cai de 43,0 para 0,11; a folha 2D girada fica entre 39 e 46
A concentração não é causada pelo número de colunas: a folha girada tem 1.000 colunas e não se mexe. O que prejudica são colunas que não carregam informação. A pergunta prática: quantas direções de fato variam?
Etapa 2 · Quais poucas direções guardam mais variância?

PCA: as direções de variância máxima

Dados centrados \(X\); covariância \(C = \frac{1}{n-1} X^\top X\).

\[ w_1 = \arg\max_{\|w\|=1} w^\top C\, w \qquad \text{EVR}_k = \frac{\lambda_k}{\sum_j \lambda_j} \]
  • \(w_1\) é o autovetor de \(C\) com o maior autovalor \(\lambda_1\); o próximo é ortogonal a ele e assim por diante.
  • \(\lambda_k\) é a variância capturada pelo componente \(k\); EVR é a razão de variância explicada (explained variance ratio).
Por Pitágoras, a parte de cada ponto ao longo da reta mais a parte perpendicular a ela é fixa: variância máxima = erro de reconstrução mínimo.

PCA à mão: centralizar, depois a covariância

\(x\)\(y\)\(x-\bar x\)\(y-\bar y\)
24−3−1
42−1−3
5500
6813
8631

1. A média é \((5, 5)\).

2. Com \(n - 1 = 4\): a variância de \(x\) é \((9+1+0+1+9)/4 = 5\), a de \(y\) também; a covariância é \((3+3+0+3+3)/4 = 3\).

\[ C = \begin{pmatrix} 5 & 3 \\ 3 & 5 \end{pmatrix} \]

PCA à mão: autovalores e direções

3. \(\det(C - \lambda I) = 0\):

\[ \lambda^2 - \underbrace{10}_{\text{traço}}\lambda + \underbrace{16}_{\det} = 0 \quad\Rightarrow\quad \lambda_1 = 8,\ \lambda_2 = 2 \]

Conferência: \(8 + 2 = 10 = 5 + 5\), a variância total. Logo \(\text{EVR}_1 = 8/10 = 80\%\).

4. \((C - 8I)w = 0\) dá \(w_1 = w_2\): a PC1, o primeiro componente principal, é \((1,1)/\sqrt{2}\), a diagonal de 45°. A PC2 é \((-1,1)/\sqrt{2}\).

PCA à mão: projetar e reconstruir

Os cinco pontos, as duas direções principais com lambda 8 e 2, os resíduos até a diagonal; a variância capturada e a descartada sempre somam 10

5. Escores na PC1: \(-2\sqrt2, -2\sqrt2, 0, 2\sqrt2, 2\sqrt2\). A variância deles é 8: o autovalor.

6. Só a PC1: \((2,4)\) e \((4,2)\) viram \((3,3)\); erro quadrático \(4 \times 2 = 8\) e \(8/4 = 2 = \lambda_2\).

O autovalor é a variância ao longo do componente. O erro de reconstrução é exatamente a variância que você jogou fora.

O mesmo em código e dois detalhes

  • np.linalg.eigh devolve os autovalores em ordem crescente: a melhor direção vem por último. Esquecer de ordenar é um bug silencioso.
  • O PCA do scikit-learn concorda: explained_variance_ratio_ = [0,8; 0,2].
  • Os sinais são arbitrários: \(w\) e \(-w\) são ambos autovetores; interprete os sinais relativos dentro de um componente, nunca o sinal absoluto.
  • Pontos novos não exigem reajuste: \((9,7) - (5,5) = (4,2)\) e \((4+2)/\sqrt2 = 4{,}243\), exatamente o pca.transform.
É isso que permite ao PCA ficar dentro de um pipeline. O t-SNE não consegue.

Simulador: gire a reta

Preveja. Conforme você gira a reta, em quantos ângulos a variância capturada chega ao máximo? Depois aperte encontrar PC1.

A questão da escala

Vinhos: 13 medidas químicas de 178 vinhos. A prolina tem desvio-padrão 314,9; a tonalidade fica em torno de 1.

Preveja. Nas colunas brutas, o que vai ser a PC1?
razão de variância de PC1, PC2, PC3maiores pesos na PC1
colunas brutas0,998; 0,002; 0,0prolina 1,000
padronizadas0,362; 0,192; 0,111flavonoides, fenóis totais, OD280

99,8% não é uma descoberta sobre vinho: é uma medida da unidade da prolina.

Isso importa mais adiante?

Vinhos em PC1 e PC2: brutos, os cultivares se sobrepõem; padronizados, formam três grupos separados

Um classificador k-NN (k vizinhos mais próximos) que só vê as duas coordenadas do PCA, em 30% dos vinhos:

bruto → PCA(2)

0,722

padronizado → PCA(2)

0,926
Padronize colunas em unidades diferentes; não às cegas quando a unidade é a mesma e a variância tem significado (pixels de uma imagem). E mantenha o PCA dentro do pipeline.

Escolhendo \(k\): 64 pixels de dígitos

Barras do scree dos 64 componentes dos dígitos e a variância explicada acumulada; 2 componentes guardam 28,5%, 90% exige 21, 95% exige 29
  • 2 componentes guardam 28,5%: uma figura 2D de PCA mostra menos de um terço.
  • 90% exige 21, 95% exige 29, 99% exige 41.
  • PCA(n_components=0.95) faz a busca por você.

Critérios, do mais confiável ao menos: um limiar de variância acumulada; o cotovelo (subjetivo); o desempenho a jusante em dados de validação; o critério de Kaiser (frágil).

Reconstrução: o que \(k\) componentes guardam

\(k\)guardadoerro / imagem\(\lambda\) descartados
114,9%1022,61022,6
228,5%858,9858,9
1073,8%314,5314,5
2995,5%54,354,3
64100,0%0,00,0
Quatro dígitos reconstruídos de k = 1 a 64 componentes; reconhecíveis com 10, próximos do original com 29
As duas últimas colunas são o mesmo número: o erro é a soma dos autovalores descartados. Daí a compressão e a remoção de ruído.

Simulador: reconstrua uma imagem com \(k\) componentes

Preveja. De quão poucos componentes o olho precisa até parar de reclamar?

Cinco armadilhas do PCA

  1. Não padronizar colunas em unidades diferentes: você mede a unidade.
  2. Ajustar antes da divisão: as linhas de teste moldam a projeção.
  3. Supor que os componentes de alta variância são os úteis para prever: o PCA nunca olha o alvo.
  4. Ler componentes como fatores do mundo real: os sinais são arbitrários; autovalores próximos admitem qualquer rotação.
  5. PCA em colunas one-hot sem pensar: uma coluna 0/1 tem variância \(p(1-p)\), então categorias raras somem.
Etapa 3 · Como mapear uma estrutura curva e o que o mapa pode dizer?

Onde o PCA se esgota

O PCA só pode rotacionar e projetar: move os eixos, nunca os dobra.

O rocambole suíço (swiss roll): uma folha 2D enrolada em 3D. Dois pontos em camadas opostas estão perto em linha reta e longe ao longo da folha.

Preveja. Projete o rocambole com PCA. O que acontece com as cores das duas camadas?

Simulador: o rocambole suíço

Marque marcar par de pontos e depois projete com PCA. A distância euclidiana atravessa o espaço vazio; a geodésica caminha sobre a folha.

Uma nota para um mapa: a trustworthiness

Dos \(k\) vizinhos mais próximos de cada ponto no mapa, quantos eram vizinhos de verdade? 1 = nenhum intruso; um mapa aleatório ≈ 0,5.

PCA no rocambole

0,810
as camadas caem umas sobre as outras

Isomap

0,976
caminha num grafo de 10 vizinhos: desenrola a folha
A aposta de todo método não linear: a distância euclidiana só é confiável localmente. Construa um grafo de vizinhança onde ela vale e deduza dele a forma global.

O t-SNE em três passos

  1. Vizinhanças nos dados: uma gaussiana em torno de cada ponto, com a largura ajustada ponto a ponto até uma perplexidade ("número efetivo de vizinhos"). Regiões densas e esparsas ganham larguras diferentes.
  2. Vizinhanças no mapa: uma t de Student, de caudas pesadas, para abrir espaço em 2D. Efeito colateral: as distâncias entre grupos deixam de ser interpretáveis.
  3. Minimizar a divergência de Kullback–Leibler \(\text{KL}(P\,\|\,Q)\): vizinhos de verdade desenhados longe custam caro; pontos distantes desenhados perto saem quase de graça.
O que está perto nos dados costuma estar perto no mapa. O que está perto no mapa pode não estar perto nos dados.

Simulador: t-SNE de verdade, no navegador

Experimente. Rode em ruído uniforme; mude só a perplexidade; compare grupos de tamanhos diferentes.

O que um mapa t-SNE não diz, medido

dadost-SNE
quantas vezes mais largo é o grupo espalhado11,61,0
quantas vezes mais longe está o grupo distante10,01,3
Dados originais e t-SNE: grupos com larguras 11,6 vezes diferentes saem do mesmo tamanho; um grupo 10 vezes mais distante sai 1,3 vez mais distante; o ruído vira aglomerados
Não são defeitos, é o projeto: a largura por ponto iguala grupos densos e esparsos; a cauda pesada faz "longe" e "muito longe" custarem o mesmo.

A perplexidade muda a figura

perplexidaderazão de distâncias
23,3
51,1
301,3
1007,0
Os três grupos com perplexidade 2, 5, 30 e 100: fragmentos com 2 e 5, equidistantes com 30, o grupo distante empurrado para longe com 100

Com 2 e 5 todo grupo se estilhaça em fragmentos que não existem. Não há perplexidade "certa": em geral de 5 a 50, menor que o menor grupo que você quer enxergar.

Rode várias e confie só no que persiste. Informe a perplexidade como uma semente aleatória.

O t-SNE encontra grupos no ruído

melhor silhuetatrustworthiness
o próprio ruído de 10 colunas0,09
o mapa t-SNE dele, perplexidade 300,380,86
ruído de 4 colunas, mapa t-SNE0,430,97
  • O mapa parece de quatro a cinco vezes mais "agrupado" que os dados.
  • Uma boa trustworthiness não certifica a estrutura: o ruído também tem vizinhanças locais.
O remédio: uma comparação nula. Embaralhe cada coluna de forma independente, rode o mesmo pipeline e compare. Se os dados embaralhados parecerem igualmente estruturados, você viu o algoritmo.

Eixos e execuções

A perda depende só das distâncias no mapa: girá-lo ou espelhá-lo não muda nada. Dígitos, inicialização aleatória, semente 0 contra as sementes 1, 2 e 3:

|correlação| dos eixos horizontais

1,0; 0,0; 0,1

a semente 2 saiu girada de um quarto de volta

vizinhos em comum

90%, 94%, 85%

no ruído: só 47%

As vizinhanças são reais; a orientação não. O init="pca" (o padrão) torna o mapa reprodutível, o que não é o mesmo que estável.

UMAP: um grafo de vizinhos

  1. Cada ponto é ligado a seus n_neighbors pontos mais próximos, com pesos difusos; nenhum ponto fica isolado.
  2. Os pesos são fundidos num único grafo difuso simétrico.
  3. Um layout 2D por gradiente descendente estocástico: as arestas atraem, pontos aleatórios sorteados repelem; uma penalidade explícita por aproximar pontos distantes.

n_neighbors (15)

a escala em que a distância euclidiana é confiável: detalhe local contra estrutura global

min_dist (0,1)

quão apertados os pontos ficam: cosmético, não estrutural

O UMAP tem transform: ajustado em 80% dos dígitos, 96,4% das imagens novas caem ao lado de uma imagem do mesmo dígito.
Etapa 4 · Qual método serve a qual objetivo?

PCA vs t-SNE, lado a lado

Dígitos: o PCA sobrepõe as classes (0,830), o t-SNE as separa (0,992) mas parte os 1; rocambole suíço: o PCA mistura (0,810), o t-SNE corta a folha em pedaços (0,976)

Trustworthiness nos dígitos, para vizinhanças de tamanho \(k\):

k=5k=30k=100
PCA0,8300,8300,835
t-SNE0,9950,9850,963
UMAP0,9890,9830,961

O t-SNE parte os 1 em ilhas e corta o rocambole em pedaços. Não há vencedor até você dizer qual escala lhe interessa.

A tabela comparativa

PCAt-SNEUMAP
naturezalinear, determinísticonão linear, estocásticonão linear, estocástico
estrutura localfracomuito bommuito bom
estrutura globalótimo (variância)fracomoderado
distâncias / tamanhos dos grupossim / simnão / nãoparcialmente / não
transform em dados novossim, trivialnãosim
hiperparâmetros críticos\(k\), padronizaçãoperplexidade, iteraçõesn_neighbors, min_dist
pré-processamento de um modelorecomendadodesaconselhadocom cautela, dentro do pipeline

Sete afirmações proibidas sobre um gráfico t-SNE/UMAP

  1. "Este grupo é maior, logo varia mais." (11,6× nos dados, 1,0× no mapa)
  2. "Estes dois grupos estão próximos, logo são parecidos." (10× nos dados, 1,3× no mapa)
  3. "Há 5 grupos nos dados." Há 5 manchas no gráfico.
  4. "O eixo horizontal representa X." Rotação e reflexão são arbitrárias.
  5. "Rodei uma vez e vi isso." Varie a semente, a perplexidade, a amostra.
  6. "Usei os 2 componentes do t-SNE como atributos." Não há transform honesto.
  7. "Rodei o t-SNE no conjunto todo e depois dividi." Vazamento.
Um gráfico é uma hipótese, não um resultado. Uma afirmação precisa de um número: erro de reconstrução, trustworthiness em várias escalas, uma comparação nula, um modelo a jusante.

Escolhendo um método

  • Vai alimentar outro modelo ou você precisa de reversibilidade → PCA. Ponto final.
  • Você quer olhar os dados para gerar hipóteses, com até alguns milhares de pontos → t-SNE ou UMAP, com PCA antes se \(d\) for grande.
  • \(n\) é grande ou você precisa projetar dados novos no mesmo mapa → UMAP.
  • Você precisa de estrutura global confiável numa figura → nenhum é ideal: mostre o PCA e o t-SNE/UMAP.

Resumo

  1. As distâncias se concentram quando as colunas não carregam informação; pergunte quantas direções variam.
  2. PCA = autovetores da covariância; \(\lambda\) é a variância guardada; o erro é a variância jogada fora.
  3. Padronize colunas em unidades diferentes; ajuste o PCA dentro do pipeline.
  4. O t-SNE e o UMAP guardam as vizinhanças locais; tamanhos, distâncias e eixos nos mapas deles não significam nada.
  5. Só o UMAP e o PCA posicionam pontos novos.
Lab · cerca de um minuto num notebook

Mapeando CEPs manuscritos

  • USPS (serviço postal dos EUA): 9.298 dígitos manuscritos de envelopes, 16×16 = 256 colunas.
  • Baixe o notebook do lab e abra no Jupyter ou no Colab; no Colab, rode antes !pip install umap-learn.

1. carregar uma amostra
2. quantas dimensões o USPS realmente tem?
3. compressão e erro de reconstrução
4. três mapas das mesmas imagens

5. dar nota aos mapas com a trustworthiness
6. perplexidade
7. UMAP: n_neighbors, min_dist, imagens novas
8. testar uma afirmação proibida