Menu
CoddyTech

PCA vor einem Modell

Teil des Abschnitts Unüberwachtes Lernen der Machine Learning-Journey von Coddy. Lektion 32 von 51.

Weniger Merkmale machen ein Modell schneller und geben ihm weniger Rauschen, dem es nachjagen kann. PCA kann in einer Pipeline direkt vor dem Modell stehen:

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}")

Zu den Ziffern:

Ein Liniendiagramm der k-NN-Genauigkeit bei den Ziffern nach Anzahl der beibehaltenen Komponenten: 0.595 bei 2, 0.884 bei 5, 0.940 bei 10, danach nahezu konstant, 0.958 bei 20 bis 0.963 bei allen 64

Die Genauigkeit pendelt sich bei etwa 20 ein: Die übrigen 44 Richtungen tragen fast nichts bei. Jeder Fold passt PCA auf seinen eigenen Trainingszeilen an, sodass nichts durchsickert.

Gemischte Einheiten? Setze wie immer zuerst StandardScaler() ein.

challenge icon

Aufgabe

Mittel

Ein Olivenöllabor bewertet Öle anhand des Lichts, das sie bei 36 Wellenlängen absorbieren, sowie anhand von 4 Labortests. Wie wenige Merkmale würden ausreichen? Das Programm liest eine Toleranz ein.

  1. Führe für jedes n in sizes eine Kreuzvalidierung (5 Folds) einer Pipeline durch: Scaler, PCA mit n Komponenten, LogisticRegression(max_iter=1000). Gib jeden Score aus.
  2. Gib die kleinste Anzahl von Komponenten aus, deren Score höchstens um die Toleranz unter dem besten Score liegt.

Für ein anderes Labor und 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

Probier es selbst

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 Olivenöle: absorbiertes Licht bei 36 Wellenlängen, 4 Labortests und die Qualitätsstufe
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())

# Schreibe deinen Code unten
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Unüberwachtes Lernen

Übe selbstständig: Online-Python-Compiler