Menu
CoddyTech

PCA antes de um modelo

Parte da seção Aprendizado não supervisionado do Journey de Machine Learning da Coddy. Lição 32 de 51.

Menos atributos tornam um modelo mais rápido e dão a ele menos ruído para perseguir. PCA pode ficar em um pipeline, logo antes do modelo:

for n in [2, 5, 10, 20, 40, 64]:
    model = make_pipeline(PCA(n_components=n), KNeighborsClassifier())
    print(n, f"{cross_val_score(model, X, y, cv=5).mean():.3f}")

Nos dígitos:

Uma linha da precisão do k-NN nos dígitos por número de componentes mantidos: 0.595 com 2, 0.884 com 5, 0.940 com 10, depois quase estável, 0.958 com 20 até 0.963 com todos os 64

A acurácia se estabiliza perto de 20: as outras 44 direções quase não acrescentam nada. Cada divisão ajusta o PCA em suas próprias linhas de treinamento, então nada vaza.

Unidades diferentes? Coloque StandardScaler() primeiro, como sempre.

challenge icon

Desafio

Médio

Um laboratório de azeite classifica os óleos pela luz que absorvem em 36 comprimentos de onda, além de 4 testes de laboratório. De quantas poucas características daria para precisar? O programa lê uma margem.

  1. Para cada n em sizes, faça validação cruzada (5 partições) de um pipeline: padronizador, PCA com n componentes, LogisticRegression(max_iter=1000). Imprima cada pontuação.
  2. Imprima o menor número de componentes com pontuação dentro da margem em relação à melhor.

Para outro laboratório e 0.05:

2 components: 0.817
3 components: 0.833
4 components: 0.889
5 components: 0.928
10 components: 0.928
20 components: 0.917
40 components: 0.922
Fewest within 0.05 of the best: 4 components

Experimente você mesmo

import pandas as pd
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score

# 180 azeites de oliva: luz absorvida em 36 comprimentos de onda, 4 testes de laboratório e a classificação
oils = pd.read_csv("oils.csv")
X = oils.drop(columns=["oil", "grade"])
y = oils["grade"]
sizes = [2, 3, 4, 5, 10, 20, 40]
slack = float(input())

# Escreva seu código abaixo
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Aprendizado não supervisionado

Pratique por conta própria: Compilador de Python online