Machine Learning - PCA-Visualisierungsbeispiel
Stellen Sie sich vor, Sie räumen einen unordentlichen Raum voller verschiedener Gegenstände auf. Um die Raumaufteilung besser zu verstehen, könnten Sie mehrere Fotos aus verschiedenen Blickwinkeln machen (z. B. Vorderansicht, Seitenansicht, Draufsicht).
Die Hauptkomponentenanalyse (PCA)macht etwas Ähnliches im maschinellen Lernen.
PCA ist ein leistungsstarkesDaten-Dimensionsreduktions-undund Visualisierungs-Werkzeug. Wenn unsere Daten Hunderte oder Tausende von Merkmalen (Dimensionen) enthalten, sind die Daten wie in einem ultrahochdimensionalen Raum, den Menschen nicht intuitiv verstehen können.
PCA hilft uns, die wichtigsten Perspektiven (d. h. Hauptkomponenten) in den Daten zu finden, und projiziert die Daten auf die wichtigsten zwei oder drei Dimensionen, sodass wir die Struktur und Verteilung hochdimensionaler Daten mithilfe von zwei- oder dreidimensionalen Streudiagrammen beobachten können.
Einfach ausgedrückt sind die Ziele von PCA:
- Dimensionsreduktion:Verwende weniger Merkmale, um die ursprünglichen Daten darzustellen, wodurch Berechnung und Speicherplatz reduziert und Rauschen entfernt werden.
- Visualisierung:Reduziere hochdimensionale Daten auf 2D oder 3D, damit wir die Beziehungen zwischen Datenpunkten intuitiv beobachten können (z. B. Clustering, Trennung).
PCA-Kernprinzipien und Workflow
Die Kernidee von PCA ist, die Richtungen zu finden, in denen die Datenvarianz maximiert wird.
Je größer die Varianz, desto stärker sind die projizierten Punkte in dieser Richtung verteilt und desto mehr Informationen enthalten sie.
Die erste gefundene Richtung ist dieerste Hauptkomponente (PC1),und die zweite Richtung, die orthogonal zu PC1 ist und die nächstgrößte Varianz hat, ist diezweite Hauptkomponente (PC2),und so weiter.
PCA-Workflow-Diagramm

Zentrale Schritte im Workflow:
Standardisierung:Sorge dafür, dass jedes Merkmal einen Mittelwert von 0 und eine Standardabweichung von 1 hat, wodurch alle Merkmale bei der Berechnung gleich wichtig sind.
Kovarianzmatrix:Berechne die Korrelationen zwischen den Merkmalen. PCA findet die Hauptrichtungen der Datenvariation, indem diese Matrix analysiert wird.
Eigenwerte und Eigenvektoren:
- Eigenvektoren:Dies sind die Hauptkomponentenrichtungen, nach denen wir suchen.
- Eigenwerte:Sie entsprechen der Datenvarianz entlang der Richtung des Eigenvektors. Je größer der Eigenwert, desto wichtiger die entsprechende Hauptkomponente.
Auswahl der Hauptkomponenten:Wir sortieren die Eigenwerte vom größten zum kleinsten und wählen die Eigenvektoren aus, die den K größten Eigenwerten entsprechen. K ist die Zieldimensionalität, auf die wir reduzieren möchten (z. B. für die Visualisierung, K=2 oder 3).
Datentransformation:Verwenden Sie die ausgewählten K Eigenvektoren, um eine Projektionsmatrix zu bilden, und multiplizieren Sie dann die Originaldaten mit dieser Matrix, um die Koordinaten auf den K neuen Hauptkomponenten zu erhalten, d. h. die reduzierten Daten.
Praxisbeispiel: Visualisierung des Iris-Datensatzes
Wir werden den klassischenIris-Datensatzverwenden, um PCA zu demonstrieren. Dieser Datensatz enthält 150 Proben, jede mit 4 Merkmalen (Kelchblattlänge, Kelchblattbreite, Blütenblattlänge, Blütenblattbreite), und gehört zu 3 verschiedenen Arten.
Unser Ziel ist es, PCA zu verwenden, um diese 4-dimensionalen Daten auf 2 Dimensionen zu reduzieren und sie auf einer 2D-Ebene darzustellen, um zu sehen, ob verschiedene Blumenarten unterschieden werden können.
Vorbereitung der Umgebung und Laden der Daten
Stellen Sie zunächst sicher, dass Sie die erforderlichen Python-Bibliotheken installiert haben:scikit-learn, matplotlib, numpy,pandas。
Beispiel
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
# Chinesische Schriftart und Diagrammstil festlegen (optional)
plt.rcParams['font.sans-serif'] = ['SimHei'] # Wird verwendet, um chinesische Beschriftungen korrekt anzuzeigen
plt.rcParams['axes.unicode_minus'] = False # Wird verwendet, um negative Vorzeichen korrekt anzuzeigen
# Laden des Iris-Datensatzes
iris = datasets.load_iris()
X = iris.data # Merkmalsdaten, Form (150, 4)
y = iris.target # Ziel-Labels (Arten), Form (150,)
target_names = iris.target_names # Artnamen: ['setosa', 'versicolor', 'virginica']
print(f"Form des Datensatzes: {X.shape}")
print(f"Merkmalsnamen: {iris.feature_names}")
print(f"Zielklassen: {target_names}")
Ausgabe:
数据集形状: (150, 4) 特征名称: ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)'] 目标类别: ['setosa' 'versicolor' 'virginica']
Datenstandardisierung
Bevor PCA angewendet wird, ist die Standardisierung der Daten einentscheidenderSchritt.
Weil PCA sehr empfindlich auf die Skalierung der Merkmale reagiert. Wenn ein Merkmal einen numerischen Wertebereich hat (z. B. Blütenblattlänge in Zentimetern gemessen, Werte zwischen 1-10), der viel größer ist als der eines anderen Merkmals (z. B. Kelchblattbreite in Millimetern gemessen, Werte zwischen 0.1-1), dann wird das Merkmal mit dem größeren Bereich die Richtung der Hauptkomponenten dominieren, was normalerweise nicht gewünscht ist.
Beispiel
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
print("Nach der Standardisierung, die ersten 5 Stichproben:")
print(X_scaled[:5])
PCA zur Dimensionsreduktion anwenden
Wir verwenden diescikit-learnvonPCAPCA-Klasse, die alle mathematischen Berechnungen einfach durchführen kann.
Beispiel
pca = PCA(n_components=2)
# Passe das PCA-Modell an die standardisierten Daten an und transformiere die Daten
X_pca = pca.fit_transform(X_scaled)
print(f"Form der reduzierten Daten: {X_pca.shape}")
print(f"Koordinaten der ersten 5 Stichproben auf PC1 und PC2:\n{X_pca[:5]}")
# Prüfe den Anteil der erklärten Varianz jeder Hauptkomponente
print(f"Anteil der erklärten Varianz der Hauptkomponenten: {pca.explained_variance_ratio_}")
print(f"Kumulativer Varianzaufklärungsanteil der ersten beiden Hauptkomponenten: {sum(pca.explained_variance_ratio_):.4f}")
Code-Erklärung:
n_components=2: Gibt an, dass wir die Daten auf 2 Dimensionen reduzieren möchten.
fit_transform(X_scaled): Diese Methode erledigt zwei Dinge gleichzeitig:
fit: Basierend auf den Eingabedaten,X_scaledberechne die von PCA benötigten Parameter (wie die Richtungen der Hauptkomponenten).transform: Verwende die berechneten Parameter, umX_scaleddie Daten in den neuen zweidimensionalen Raum zu transformieren.
explained_variance_ratio_: Dies ist ein sehr wichtiges Attribut. Es sagt uns denAnteil der Varianz der Originaldaten, der von jeder Hauptkomponente erfasst wird.Zum Beispiel, wenn die Ausgabe[0.73, 0.23], dann bedeutet das, dass PC1 73% der Informationen in den Originaldaten beibehält, PC2 23% beibehält und beide zusammen 96% der Informationen beibehalten. Das hilft uns, den Informationsverlust nach der Dimensionsreduktion zu bewerten.
Visualisierungsergebnisse
Jetzt haben wir die zweidimensionalen DatenX_pca, und wir können sie einfach mit einem Streudiagramm visualisieren.
Beispiel
plt.figure(figsize=(8, 6))
# Unterschiedliche Farben und Marker für jede Art festlegen
colors = ['navy', 'turquoise', 'darkorange']
lw = 2 # Linienbreite
# Durch die drei Arten iterieren und jede zeichnen
for color, i, target_name in zip(colors, [0, 1, 2], target_names):
plt.scatter(X_pca[y == i, 0], # Die PC1-Koordinaten der zu Art i gehörenden Proben auswählen
X_pca[y == i, 1], # Die PC2-Koordinaten der zu Art i gehörenden Proben auswählen
color=color, alpha=0.8, lw=lw,
label=target_name)
# Diagrammtitel und Achsenbeschriftungen hinzufügen
plt.title('PCA 2D-Visualisierung des Iris-Datensatzes')
plt.xlabel(f'Erste Hauptkomponente (PC1) - Anteil der erklärten Varianz: {pca.explained_variance_ratio_)
plt.ylabel(f'Zweite Hauptkomponente (PC2) - Anteil der erklärten Varianz: {pca.explained_variance_ratio_)
plt.legend(loc='best', shadow=False, scatterpoints=1)
plt.grid(True, linestyle='--', alpha=0.6)
# Diagramm anzeigen
plt.tight_layout()
plt.show()
Interpretation der Visualisierungsergebnisse:Nach Ausführung des obigen Codes erhalten Sie ein zweidimensionales Streudiagramm.
- X-Achse (PC1): Stellt die Richtung der maximalen Varianz unter den ursprünglichen 4 Merkmalen dar und ist die wichtigste Dimension zur Unterscheidung der Daten. Wie in der Abbildung zu sehen ist, trennt sie dieSetosa-Art gut von den anderen beiden Arten.
- Y-Achse (PC2): Stellt die zu PC1 orthogonale Richtung mit der zweitgrößten Varianz dar und liefert zusätzliche Unterscheidungsinformationen. Sie hilft,VersicolorundVirginica (Virginia-Iris) weiter zu unterscheiden, obwohl die beiden eine gewisse Überlappung aufweisen.
- Fazit: Durch PCA haben wir die 4-dimensionalen Daten erfolgreich auf eine 2D-Ebene projiziert und die Clusterbildung der drei Arten deutlich beobachtet. Setosa ist vollständig getrennt, während Versicolor und Virginica in der 2D-Projektion teilweise überlappen, was darauf hindeutet, dass die Verwendung nur der ersten beiden Hauptkomponenten (wobei etwa 95% der Informationen erhalten bleiben) nicht ausreicht, um die letztgenannten beiden Arten perfekt zu unterscheiden, aber ihre Hauptverteilungstrends bereits sehr offensichtlich sind.
Weiterführende Erkundung und Überlegungen
Wie wählt man die Anzahl der Hauptkomponenten (K-Wert)?
In realen Projekten wissen wir möglicherweise nicht, auf wie viele Dimensionen reduziert werden soll. Eine gängige Methode ist das Zeichnen einesScree Plot, der den Anteil der erklärten Varianz jeder Hauptkomponente zeigt.
Beispiel
pca_full = PCA()
pca_full.fit(X_scaled)
# Den Scree-Plot zeichnen
plt.figure(figsize=(8, 5))
plt.plot(range(1, len(pca_full.explained_variance_ratio_) + 1),
pca_full.explained_variance_ratio_, 'o-', linewidth=2)
plt.title('Scree-Plot der PCA-Varianzaufklärungsrate')
plt.xlabel('Index der Hauptkomponente')
plt.ylabel('Varianzaufklärungsrate')
plt.grid(True, linestyle='--', alpha=0.6)
plt.xticks(range(1, len(pca_full.explained_variance_ratio_) + 1))
plt.tight_layout()
plt.show()
# Die kumulative Varianzaufklärungsrate darstellen
plt.figure(figsize=(8, 5))
plt.plot(range(1, len(pca_full.explained_variance_ratio_) + 1),
np.cumsum(pca_full.explained_variance_ratio_), 's-', linewidth=2, color='red')
plt.title('Kumulierte erklärte Varianzrate von PCA')
plt.xlabel('Anzahl der Hauptkomponenten')
plt.ylabel('Kumulierte erklärte Varianzrate')
plt.axhline(y=0.95, color='gray', linestyle='--', label='95%-Schwellenwert') # Üblicher Schwellenwert
plt.legend()
plt.grid(True, linestyle='--', alpha=0.6)
plt.xticks(range(1, len(pca_full.explained_variance_ratio_) + 1))
plt.tight_layout()
plt.show()
Wie wählt man den K-Wert?
- Betrachten Sie den Ellenbogenpunkt: Suchen Sie im Scree-Plot den Punkt, an dem die Abnahme der erklärten Varianzrate plötzlich langsamer wird (d. h. der Ellenbogen). Die Hauptkomponenten danach tragen weniger bei.
- Legen Sie einen Schwellenwert fest: Wählen Sie im kumulativen Varianzplot den kleinsten K-Wert, bei dem die kumulierte erklärte Rate einen zufriedenstellenden Schwellenwert erreicht (z. B. 95% oder 99%). Aus dem kumulativen Plot der Iris-Daten geht hervor, dass die ersten beiden Hauptkomponenten bereits mehr als 95% der Varianz erklären, daher ist K=2 eine gute Wahl.
Die Bedeutung der Hauptkomponenten verstehen
Wir können uns auch dieLadungender Hauptkomponenten ansehen, d. h. die Beitragsgewichte jedes ursprünglichen Merkmals zu den Hauptkomponenten, was hilft, die tatsächliche Bedeutung der Hauptkomponenten zu interpretieren.
Beispiel
pca_components = pca.components_ # Die Form ist (2, 4)
# Verwende einen DataFrame für eine übersichtlichere Anzeige
df_components = pd.DataFrame(pca_components,
columns=iris.feature_names,
index=['PC1', 'PC2'])
print("Ladungsmatrix der Hauptkomponenten (Eigenvektoren):")
print(df_components)
# Kann mit einer Heatmap visualisiert werden
import seaborn as sns
plt.figure(figsize=(8, 4))
sns.heatmap(df_components, annot=True, cmap='RdBu_r', center=0)
plt.title('Heatmap der Hauptkomponenten-Ladungen')
plt.tight_layout()
plt.show()
Interpretation der Ladungsmatrix:
- FürPC1, wenn Blütenblattlänge und Blütenblattbreite relativ großekorrekteGewichte haben, während Kelchblattbreite relativ großenegativeGewichte, dann kann PC1 hauptsächlich das Gesamtmerkmal des Kontrasts zwischen Blütenblattgröße und Kelchblattbreite repräsentieren.
- FürPC2ist das Gewichtsmuster anders, und es kann eine andere Kombination von Merkmalen repräsentieren. Durch die Analyse dieser Gewichte können wir den abstrakten Hauptkomponenten eine praktische biologische oder geschäftliche Bedeutung zuweisen.
Zusammenfassung und Übungsaufgaben
Zusammenfassung der Kernpunkte
- Was ist PCA: Eine unüberwachte lineare Methode zur Dimensionsreduktion, die Daten neu ausdrückt, indem sie die orthogonalen Richtungen (Hauptkomponenten) mit maximaler Datenvarianz findet.
- Kernschritte: Standardisierung -> Kovarianzmatrix berechnen -> Eigenwerte und Eigenvektoren berechnen -> Hauptkomponenten auswählen -> Daten projizieren.
- Wichtige Konzepte:
- Hauptkomponenten: Neue, unkorrelierte Merkmalsachsen.
- Rate der erklärten Varianz: Ein Maß, das die Wichtigkeit jeder Hauptkomponente misst.
- Ladungen: Die Brücke, die ursprüngliche Merkmale und Hauptkomponenten verbindet und dazu dient, die Bedeutung der Hauptkomponenten zu erklären.
- Hauptanwendungen: Datenvisualisierung, Entfernen von Rauschen und Redundanz sowie die Funktion als Vorverarbeitungsschritt für andere Modelle (wie Klassifikation, Regression), um das Training zu beschleunigen.
Praktische Übung
Um Ihr Wissen zu festigen, versuchen Sie bitte, die folgenden Übungen abzuschließen:
Übung 1: Verschiedene Datensätze erkundenVersuchen Sie,scikit-learnin anderen Datensätzen (wie z. B.digitshandschriftlicher Ziffern-Datensatz oderwineWein-Datensatz), um eine PCA-Visualisierung durchzuführen. Beobachten Sie, ob die Bilder mit reduzierter Dimension die Unterscheidung zwischen verschiedenen Kategorien weiterhin beibehalten können.
Beispiel
from sklearn.datasets import load_wine
wine = load_wine()
# ... Wiederholen Sie den PCA-Prozess
Übung 2: 3D-VisualisierungReduzieren Sie die Iris-Daten auf 3 Dimensionen und verwenden Siempl_toolkits.mplot3dBibliothek, um ein 3D-Streudiagramm zu zeichnen. Prüfen Sie, ob die Überlappung zwischen Versicolor und Virginica abnimmt, nachdem eine Dimension hinzugefügt wurde.
Beispiel
pca3 = PCA(n_components=3)
X_pca3 = pca3.fit_transform(X_scaled)
# ... Eine 3D-Figur zum Plotten erstellen