Supervisionado e Não Supervisionado

Autor

Douglas Braga

Nota

Esta seção corresponde às seções 2.1.4 e 2.1.5 de James et al. (2023).

Toda seção deste capítulo até aqui partiu do mesmo formato de dado, sem nomeá-lo: um X que se mede e um Y que se quer prever ou explicar — vendas em Advertising, renda em Income1 e em Income2. Essa suposição tem nome, e é ela que separa o aprendizado estatístico em duas famílias.

Uma resposta para cada observação, ou nenhuma

No aprendizado supervisionado, cada observação chega como um par (X_i, Y_i): um vetor de preditores e uma resposta associada a ele, que torna possível checar o quanto uma estimativa acerta. É esse par que sustentou a seção 7.2 inteira — estimar f, decompor o erro em redutível e irredutível, perguntar se o que interessa é prever Y ou entender como X o explica. Sem Y, nenhuma dessas perguntas tem como ser respondida: não sobra nada para comparar contra a previsão.

No aprendizado não supervisionado, cada observação chega só como X_i — os preditores, sem resposta nenhuma emparelhada. Não é descuido de quem coletou o dado: para muitos problemas reais simplesmente não existe um Y a registrar, nenhum rótulo verdadeiro contra o qual comparar. E a ausência de Y muda a natureza da pergunta, não só a resposta disponível: deixa de ser “o que prevê Y” e passa a ser “que estrutura existe neste X” — quantos grupos naturais o dado tem, quais variáveis se movem juntas, qual observação foge do padrão das demais.

A mesma nuvem, duas perguntas

A diferença fica mais clara olhando o mesmo dado das duas formas. A nuvem a seguir é simulada — três grupos de pontos em duas dimensões, cada um sorteado ao redor de um centro diferente:

rng = np.random.default_rng(7)
n_por_grupo = 40
centros = np.array([[0.0, 0.0], [4.5, 4.0], [-1.0, 5.5]])
X = np.concatenate(
    [rng.normal(loc=centro, scale=1.0, size=(n_por_grupo, 2)) for centro in centros]
)
rotulo = np.repeat(np.arange(len(centros)), n_por_grupo)
X.shape, rotulo.shape
((120, 2), (120,))
np.unique(rotulo, return_counts=True)
(array([0, 1, 2]), array([40, 40, 40]))

Cento e vinte pontos ao todo, quarenta de cada um dos três grupos que geraram a nuvem. É a mesma nuvem que aparece nos dois painéis a seguir — só muda o que se sabe sobre ela:

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(11, 4.5))

for grupo in range(len(centros)):
    pontos_do_grupo = X[rotulo == grupo]
    ax1.scatter(pontos_do_grupo[:, 0], pontos_do_grupo[:, 1], label=f"grupo {grupo}")
ax1.set_title("supervisionado: o rótulo é conhecido")
ax1.set_xlabel("x1")
ax1.set_ylabel("x2")
ax1.legend()

ax2.scatter(X[:, 0], X[:, 1], color="0.5", label="quantos grupos existem aqui?")
ax2.set_title("não supervisionado: sem rótulo")
ax2.set_xlabel("x1")
ax2.set_ylabel("x2")
ax2.legend()

plt.tight_layout()
plt.show()
Figura 39.1: A mesma nuvem simulada, olhada de duas formas. Esquerda: cada ponto colorido pelo grupo que o gerou — o problema é supervisionado, porque existe um rótulo contra o qual checar qualquer resposta. Direita: os mesmos 120 pontos, sem cor nenhuma — o problema é não supervisionado, e a pergunta passa a ser quantos grupos existem aqui.

À esquerda, a cor de cada ponto vem do grupo que o sorteou — é isso que torna o problema supervisionado: existe uma resposta contra a qual qualquer partição proposta pode ser conferida, certa ou errada. À direita, a mesma nuvem, sem nenhuma cor: o que resta é a pergunta que dá título ao painel. Um método de agrupamento poderia propor uma partição parecida com a da esquerda — e, olhando a nuvem, três grupos parecem mesmo a resposta razoável —, mas não há como confirmar isso contra um rótulo verdadeiro, porque nenhum rótulo verdadeiro existe do lado direito. O que existe é a estrutura que os pontos sugerem por si.

Regressão contra classificação: a natureza de Y

Dentro do lado supervisionado ainda existe uma segunda distinção — não sobre ter ou não ter Y, mas sobre que tipo de valor Y assume. Quando Y é quantitativo — um número que mede algo, como vendas em Advertising ou renda em Income1 e Income2 —, o problema é de regressão: sem nomear, cada seção deste capítulo até aqui foi um problema de regressão. Quando Y é qualitativo — uma categoria, como “inadimplente” ou “não inadimplente”, “spam” ou “não spam” —, o problema é de classificação: não existe meio caminho entre duas categorias, e o erro passa a se medir contando acerto e erro, não medindo distância.

Essa segunda distinção, porém, é menos nítida do que o parágrafo anterior sugere: alguns métodos não escolhem um lado. O k-NN que a seção 7.3 ajustou a Income2 mediu a distância até os vizinhos mais próximos de cada ponto e devolveu a média das respostas deles — um número, porque ali Y era quantitativo. O mesmo mecanismo, aplicado a um Y qualitativo, devolve a categoria mais comum entre os vizinhos, em vez da média: nada no método muda, só o que se faz com a vizinhança encontrada. k-NN serve aos dois lados dessa distinção, e não é o único método capaz disso — a fronteira entre regressão e classificação separa problemas, não separa métodos.

As duas próximas seções seguem essa costura: a seção 7.6 mede a qualidade de um ajuste de regressão, com o erro quadrático médio; a seção 7.7 faz o mesmo do lado da classificação, com a taxa de erro e um piso que nenhum classificador consegue furar. Mais adiante neste material, a costura muda de novo, para o aprendizado não supervisionado — onde a nuvem cinzenta desta seção ganha um bloco inteiro dedicado a responder, com método, à pergunta que aqui ficou em aberto.

James, Gareth, Daniela Witten, Trevor Hastie, Robert Tibshirani, e Jonathan Taylor. 2023. An Introduction to Statistical Learning with Applications in Python. Springer.