Menu
CoddyTech

PCA antes de un modelo

Parte de la sección Aprendizaje no supervisado del Journey de Machine Learning de Coddy. Lección 32 de 51.

Menos características hacen que un modelo sea más rápido y le dan menos ruido que perseguir. PCA puede ir en una canalización, justo antes del 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}")

En los dígitos:

Una línea de precisión de k-NN en los dígitos según los componentes conservados: 0.595 con 2, 0.884 con 5, 0.940 con 10, después casi plana, 0.958 con 20 hasta 0.963 con los 64

La precisión se estabiliza cerca de 20: las otras 44 direcciones no aportan casi nada. Cada partición ajusta PCA con sus propias filas de entrenamiento, así que no hay filtraciones.

¿Unidades mixtas? Coloca StandardScaler() primero, como siempre.

challenge icon

Desafío

Intermedio

Un laboratorio de aceite de oliva clasifica los aceites según la luz que absorben en 36 longitudes de onda, además de 4 pruebas de laboratorio. ¿Cuántas características bastarían? El programa lee una holgura.

  1. Para cada n en sizes, valida cruzadamente (5 particiones) una canalización: escalador, PCA con n componentes, LogisticRegression(max_iter=1000). Imprime cada puntuación.
  2. Imprime el menor número de componentes cuya puntuación esté dentro de la holgura respecto a la mejor.

Para otro laboratorio y 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

Pruébalo tú mismo

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 aceites de oliva: luz absorbida a 36 longitudes de onda, 4 pruebas de laboratorio y la categoría
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())

# Escribe tu código a continuación
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Aprendizaje no supervisado

Practica por tu cuenta: Compilador de Python online