Inhaltsverzeichnis
1. Dimensionsreduzierung
2. Wie funktioniert die Hauptkomponentenanalyse?
3. Implementierung in Python
4. Auswertung und Interpretation
5. Schlussfolgerungen und nächste Schritte
Viele echte Probleme des maschinellen Lernens betreffen Datensätze mit Tausenden oder sogar Millionen von Merkmalen. Das Trainieren solcher Datensätze kann rechenintensiv sein, und die Interpretation der resultierenden Lösungen kann eine noch größere Herausforderung darstellen.
Mit zunehmender Anzahl von Merkmalen werden die Datenpunkte spärlicher und die Distanzmetriken werden weniger aussagekräftig, da die Distanzen zwischen den Punkten weniger ausgeprägt sind, was es schwierig macht, nahe und weit entfernte Punkte zu unterscheiden. Dies wird als Fluch der Dimensionalität.
Die spärlicheren Daten machen das Trainieren von Modellen schwieriger und sie neigen eher zu Überanpassung, da sie eher Rauschen als die zugrunde liegenden Muster erfassen. Dies führt zu einer schlechten Generalisierung auf neue, bisher unbekannte Daten.
Die Dimensionsreduktion wird in der Datenwissenschaft und im maschinellen Lernen verwendet, um die Anzahl der Variablen oder Merkmale in einem Datensatz zu reduzieren und dabei so viele ursprüngliche Informationen wie möglich beizubehalten. Diese Technik ist nützlich, um komplexe Datensätze zu vereinfachen, die Rechenleistung zu verbessern und bei der Datenvisualisierung zu helfen.
Eine der am häufigsten verwendeten Techniken zur Milderung des Fluchs der Dimensionalität ist die Hauptkomponentenanalyse (PCA). Die PCA reduziert die Anzahl der Merkmale in einem Datensatz, während die meisten nützlichen Informationen erhalten bleiben, indem sie die Achsen findet, die für die größte Varianz im Datensatz verantwortlich sind. Diese Achsen werden als Hauptbestandteile.
Da PCA darauf abzielt, eine niedrigdimensionale Darstellung eines Datensatzes zu finden und dabei einen großen Teil der Varianz beizubehalten, anstatt Vorhersagen zu treffen, wird es als unbeaufsichtigtes Lernen Algorithmus.
Aber warum bedeutet das Beibehalten der Varianz das Beibehalten wichtiger Informationen?
Stellen Sie sich vor, Sie analysieren einen Datensatz über Verbrechen in einer Stadt. Die Daten weisen zahlreiche Merkmale auf, darunter „Verbrechen gegen Personen – mit Verletzungen“ und „Verbrechen gegen Personen – ohne Verletzungen“. Natürlich müssen die Orte mit hohen Raten des ersten Beispiels auch hohe Raten des zweiten Beispiels aufweisen.
Mit anderen Worten: Die beiden Merkmale des Beispiels sind stark korreliert, sodass es möglich ist, die Dimensionen dieses Datensatzes zu reduzieren, indem die Redundanzen in den Daten (das Vorhandensein oder Fehlen von Verletzungen beim Opfer) verringert werden.
Der PCA-Algorithmus ist nichts anderes als eine ausgeklügelte Methode, dies zu erreichen.
Lassen Sie uns nun in den folgenden Schritten aufschlüsseln, wie der PCA-Algorithmus im Hintergrund funktioniert:
Schritt 1: Zentrieren der Daten
Die PCA wird durch den Maßstab der Daten beeinflusst. Daher besteht das erste, was zu tun ist, darin, den Mittelwert jedes Merkmals des Datensatzes zu subtrahieren. Dadurch wird sichergestellt, dass alle Merkmale einen Mittelwert von 0 haben.
Schritt 2: Berechnung der Kovarianzmatrix
Nun müssen wir die Kovarianzmatrix berechnen, um zu erfassen, wie jedes Merkmalspaar in den Daten zusammen variiert. Wenn der Datensatz N Merkmale, die resultierende Kovarianzmatrix hat N X N Type.
Im Bild unten haben stärker korrelierte Merkmale Farben, die näher an Rot liegen. Natürlich wird jedes Merkmal stark mit sich selbst korreliert sein.
Schritt 3: Eigenwertzerlegung
Als nächstes müssen wir die Eigenwertzerlegung der Kovarianzmatrix durchführen. Falls Sie sich nicht erinnern: Bei der Kovarianzmatrix Σ (einer quadratischen Matrix) ist die Eigenwertzerlegung der Prozess, bei dem eine Menge von Skalaren (Eigenwerten) und Vektoren (Eigenvektoren) ermittelt wird, sodass:
Wo:
- Σ ist die n×n-Kovarianzmatrix.
- gegen ist ein von Null verschiedener Vektor, der Eigenvektor genannt wird.
- λ ist ein Skalar, der Eigenwert, der mit dem Eigenvektor verknüpft ist gegen.
Eigenvektoren geben die Richtungen der maximalen Varianz in den Daten an (die Hauptkomponenten), während Eigenwerte Quantifizieren Sie die von jeder Hauptkomponente erfasste Varianz.
Wenn eine Matrix A kann in Eigenwerte und Eigenvektoren zerlegt werden und lässt sich wie folgt darstellen:
Wo:
- Q ist eine Matrix, deren Spalten die Eigenvektoren von sind A.
- Λ ist eine Diagonalmatrix, deren Diagonalelemente die Eigenwerte von A.
Auf diese Weise können wir dieselben Schritte verwenden, um die Eigenwerte und Eigenvektoren der Kovarianzmatrix zu finden.
Im obigen Bild können wir sehen, dass der erste Eigenvektor in die Richtung mit der größten Varianz der Daten zeigt und der zweite Eigenvektor in die Richtung mit der zweitgrößten Varianz.
Schritt 4: Auswählen der Hauptkomponenten
Wie bereits erwähnt, quantifizieren die Eigenwerte die Varianz der Daten in Richtung ihres entsprechenden Eigenvektors. Daher sortieren wir die Eigenwerte in absteigender Reihenfolge und behalten nur die obersten n benötigten Hauptbestandteile.
Das folgende Bild veranschaulicht den Anteil der Varianz, der von jeder Hauptkomponente in einer PCA mit zwei Dimensionen erfasst wird.
Schritt 5: Projizieren Sie die Daten
Schließlich müssen wir die Originaldaten auf die Dimensionen projizieren, die durch die ausgewählten Hauptkomponenten dargestellt werden. Dazu müssen wir den Datensatz, nachdem er zentriert wurde, mit der Matrix der Eigenvektoren multiplizieren, die wir bei der Zerlegung der Kovarianzmatrix gefunden haben.
Nachdem wir nun die Schlüsselkonzepte der Hauptkomponentenanalyse gründlich verstanden haben, ist es an der Zeit, etwas Code zu erstellen.
Zuerst müssen wir die Umgebung einrichten, indem wir das Numpy-Paket für mathematische Berechnungen und Matplotlib für die Visualisierung importieren:
import numpy as np
import matplotlib.pyplot as plt
Als Nächstes kapseln wir alle im vorherigen Abschnitt behandelten Konzepte in einer Python-Klasse mit den folgenden Methoden:
Konstruktormethode zum Initialisieren der Parameter des Algorithmus: die Anzahl der gewünschten Komponenten, eine Matrix zum Speichern der Komponentenvektoren und ein Array zum Speichern der erklärten Varianz jeder ausgewählten Dimension.
Bei der Match-Methode werden die im vorigen Abschnitt vorgestellten ersten vier Schritte mit Code umgesetzt. Außerdem werden die erklärten Varianzen der einzelnen Komponenten berechnet.
Die Transformationsmethode führt den letzten im vorherigen Abschnitt vorgestellten Schritt aus: Projizieren Sie die Daten auf die ausgewählten Dimensionen.
Die letzte Methode ist eine Hilfsfunktion zum Darstellen der erklärten Varianz jeder ausgewählten Hauptkomponente als Balkendiagramm.
Hier ist der vollständige Code:
class PCA:
def __init__(self, n_components):
self.n_components = n_components
self.elements = None
self.imply = None
self.explained_variance = Nonedef match(self, X):
# Step 1: Standardize the info (subtract the imply)
self.imply = np.imply(X, axis=0)
X_centered = X - self.imply
# Step 2: Compute the covariance matrix
cov_matrix = np.cov(X_centered, rowvar=False)
# Step 3: Compute the eigenvalues and eigenvectors
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
# Step 4: Kind the eigenvalues and corresponding eigenvectors
sorted_indices = np.argsort(eigenvalues)(::-1)
eigenvalues = eigenvalues(sorted_indices)
eigenvectors = eigenvectors(:, sorted_indices)
# Step 5: Choose the highest n_components
self.elements = eigenvectors(:, :self.n_components)
# Calculate defined variance
total_variance = np.sum(eigenvalues)
self.explained_variance = eigenvalues(:self.n_components) / total_variance
def remodel(self, X):
# Step 6: Venture the info onto the chosen elements
X_centered = X - self.imply
return np.dot(X_centered, self.elements)
def plot_explained_variance(self):
# Create labels for every principal element
labels = (f'PCA{i+1}' for i in vary(self.n_components))
# Create a bar plot for defined variance
plt.determine(figsize=(8, 6))
plt.bar(vary(1, self.n_components + 1), self.explained_variance, alpha=0.7, align='middle', colour='blue', tick_label=labels)
plt.xlabel('Principal Part')
plt.ylabel('Defined Variance Ratio')
plt.title('Defined Variance by Principal Parts')
plt.present()
Jetzt ist es an der Zeit, die Klasse, die wir gerade implementiert haben, auf einem simulierten Datensatz anzuwenden, der mit dem Numpy-Paket erstellt wurde. Der Datensatz hat 10 Options und 100 Beispiele.
# create simulated knowledge for evaluation
np.random.seed(42)
# Generate a low-dimensional sign
low_dim_data = np.random.randn(100, 4)# Create a random projection matrix to venture into greater dimensions
projection_matrix = np.random.randn(4, 10)
# Venture the low-dimensional knowledge to greater dimensions
high_dim_data = np.dot(low_dim_data, projection_matrix)
# Add some noise to the high-dimensional knowledge
noise = np.random.regular(loc=0, scale=0.5, dimension=(100, 10))
data_with_noise = high_dim_data + noise
X = data_with_noise
Vor der Durchführung der PCA bleibt eine Frage offen: Wie wählen wir die richtige oder optimale Anzahl von Dimensionen?? Im Allgemeinen müssen wir nach der Anzahl der Komponenten suchen, die zusammen mindestens 95 % der erklärten Varianz des Datensatzes ausmachen.
Schauen wir uns dazu an, wie jede Hauptkomponente zur Gesamtvarianz des Datensatzes beiträgt:
# Apply PCA
pca = PCA(n_components=10)
pca.match(X)
X_transformed = pca.remodel(X)print("Defined Variance:n", pca.explained_variance)
>> Defined Variance (%):
(55.406, 25.223, 11.137, 5.298, 0.641, 0.626, 0.511, 0.441, 0.401, 0.317)
Als nächstes stellen wir die kumulierte Summe der Varianz dar und prüfen, bei welcher Dimensionenanzahl wir den optimalen Wert von 95 % der Gesamtvarianz erreichen.
Wie in der Grafik oben zu sehen ist, beträgt die optimale Anzahl von Dimensionen für den Datensatz 4, was insgesamt 97,064 % der erklärten Varianz entspricht. Mit anderen Worten: Wir haben einen Datensatz mit 10 Merkmalen in einen mit nur 3 Dimensionen umgewandelt und dabei mehr als 97 % der ursprünglichen Informationen beibehalten.
Das bedeutet, dass die meisten der ursprünglichen zehn Merkmale sehr korreliert waren und der Algorithmus diese hochdimensionalen Daten in unkorrelierte Hauptkomponenten umgewandelt hat.
Wir haben eine PCA-Klasse erstellt, bei der nur das Numpy-Paket verwendet wurde, wodurch die Dimensionalität eines Datensatzes erfolgreich von 10 auf nur 4 Merkmale reduziert wurde und dabei etwa 97 % der Datenvarianz erhalten blieb.
Außerdem haben wir eine Methode untersucht, um eine optimale Anzahl von Hauptkomponenten der PCA-Analyse zu erhalten, die je nach Problemstellung angepasst werden kann (wir sind beispielsweise möglicherweise daran interessiert, nur 90 % der Varianz beizubehalten).
Dies zeigt das Potenzial der PCA-Analyse, mit dem zuvor erläuterten Fluch der Dimensionalität umzugehen. Darüber hinaus möchte ich noch ein paar Punkte für weitere Untersuchungen offen lassen:
- Führen Sie mithilfe des PCA-Algorithmus Klassifizierungs- oder Regressionsaufgaben mit anderen Algorithmen des maschinellen Lernens auf dem reduzierten Datensatz durch und vergleichen Sie die Leistung von Modellen, die auf dem ursprünglichen Datensatz trainiert wurden, mit der Leistung des PCA-transformierten Datensatzes, um die Auswirkungen der Dimensionsreduzierung zu beurteilen.
- Verwenden Sie PCA zur Datenvisualisierung, um hochdimensionale Daten besser interpretierbar zu machen und Muster aufzudecken, die im ursprünglichen Merkmalsraum nicht erkennbar waren.
- Erwägen Sie die Erforschung anderer Techniken zur Dimensionsreduzierung, wie zum Beispiel t-verteilte stochastische Nachbareinbettung (t-SNE) und Lineare Diskriminanzanalyse (LDA).
Vollständiger Code verfügbar Hier.