Master-Seminar - Exam.pdf

Master-Seminar - Exam
Aufgabe 1) Gegeben ist ein tiefes neuronales Netzwerk mit drei Schichten: einer Eingabeschicht, einer versteckten Schicht und einer Ausgabeschicht. Die Eingabeschicht hat 4 Neuronen, die versteckte Schicht hat 5 Neuronen und die Ausgabeschicht hat 3 Neuronen. Es werden Sigmoid-Aktivierungsfunktionen für die versteckte Schicht und Softmax-Aktivierungsfunktionen für die Ausgabeschicht verwendet. Du ...

© StudySmarter 2024, all rights reserved.

Aufgabe 1)

Gegeben ist ein tiefes neuronales Netzwerk mit drei Schichten: einer Eingabeschicht, einer versteckten Schicht und einer Ausgabeschicht. Die Eingabeschicht hat 4 Neuronen, die versteckte Schicht hat 5 Neuronen und die Ausgabeschicht hat 3 Neuronen. Es werden Sigmoid-Aktivierungsfunktionen für die versteckte Schicht und Softmax-Aktivierungsfunktionen für die Ausgabeschicht verwendet. Du sollst die Trainingsphase des Netzwerks mit einem vorbereiteten Datensatz durchführen, der 1000 Instanzen enthält, bei denen die Eingaben zur Erkennung von handgeschriebenen Ziffern (0–9) verwendet werden.

b)

Rückwärtspropagation: Angenommen, die Zielausgabe ist \(\textbf{t} = [1, 0, 0]\) und die Ausgabe des Netzwerks nach Vorwärtspropagation ist \(\textbf{y} = [0.7, 0.2, 0.1]\). Berechne die Gradienten für die Gewichtsanpassung zwischen der Ausgabeschicht und der versteckten Schicht. Verwende die Softmax-Aktivierungsfunktion und den Cross-Entropy-Loss:

  • Cross-Entropy-Loss: \(L(\textbf{t}, \textbf{y}) = - \sum_{i=1}^{3} t_i \log(y_i)\)
  • Softmax: \(y_i = \frac{e^{z_i}}{\sum_{j=1}^3 e^{z_j}}\)

Lösung:

Um die Gradienten für die Gewichtsanpassung zwischen der Ausgabeschicht und der versteckten Schicht zu berechnen, gehen wir wie folgt vor:

  • Schritt 1: Berechnung des Cross-Entropy-LossDer Cross-Entropy-Loss ist wie folgt definiert:

\( L(\textbf{t}, \textbf{y}) = - \sum_{i=1}^{3} t_i \log(y_i) \)

Gegeben sind \(\textbf{t} = [1, 0, 0]\) und \(\textbf{y} = [0.7, 0.2, 0.1]\). Berechne den Cross-Entropy-Loss:

\( L(\textbf{t}, \textbf{y}) = - (1 \cdot \log(0.7) + 0 \cdot \log(0.2) + 0 \cdot \log(0.1)) \ = - \log(0.7) \ \approx 0.3567 \)

  • Schritt 2: Berechnung der Gradienten des Losses bezüglich der AusgabenFür die Softmax-Aktivierungsfunktion und den Cross-Entropy-Loss ist der Gradient des Losses bezüglich der Ausgaben \(\textbf{y}\) gegeben durch:

\( \frac{\partial L}{\partial y_i} = y_i - t_i \)

Berechne dies für jeden Neuronenausgang:

  • \( \frac{\partial L}{\partial y_1} = 0.7 - 1 = -0.3 \)
  • \( \frac{\partial L}{\partial y_2} = 0.2 - 0 = 0.2 \)
  • \( \frac{\partial L}{\partial y_3} = 0.1 - 0 = 0.1 \)

Daher ist \( \frac{\partial L}{\partial \textbf{y}} = [-0.3, 0.2, 0.1] \).

  • Schritt 3: Berechnung der Gradienten für die Gewichte zwischen der versteckten Schicht und der AusgabeschichtAngenommen, die Ausgabe der versteckten Schicht ist \( \textbf{a}^{(1)} = [a_1, a_2, a_3, a_4, a_5] \).

Die Gradienten der Gewichte \(W_{ij}^{(2)}\) (Gewicht von Neuron \(i\) in der versteckten Schicht zu Neuron \(j\) in der Ausgabeschicht) sind:

\( \frac{\partial L}{\partial W_{ij}^{(2)}} = a_i^{(1)} \cdot \frac{\partial L}{\partial y_j} \)

Da die Aktivierungen \( \textbf{a}^{(1)} \) nicht gegeben sind, verwenden wir allgemeine Aktivierungen \(a_1, a_2, a_3, a_4, a_5\). Die Gradienten sind dann:

  • \( \frac{\partial L}{\partial W_{1j}^{(2)}} = a_1 \cdot \frac{\partial L}{\partial y_j} \)
  • \( \frac{\partial L}{\partial W_{2j}^{(2)}} = a_2 \cdot \frac{\partial L}{\partial y_j} \)
  • \( \frac{\partial L}{\partial W_{3j}^{(2)}} = a_3 \cdot \frac{\partial L}{\partial y_j} \)
  • \( \frac{\partial L}{\partial W_{4j}^{(2)}} = a_4 \cdot \frac{\partial L}{\partial y_j} \)
  • \( \frac{\partial L}{\partial W_{5j}^{(2)}} = a_5 \cdot \frac{\partial L}{\partial y_j} \)

Setze die Werte von \( \frac{\partial L}{\partial y_j} \) ein, um die Gradienten für jedes Gewicht zu berechnen.

  • \( W_{ij}^{(2)} : \frac{\partial L}{\partial W_{ij}^{(2)}} = \begin{bmatrix} a_1 & a_2 & a_3 & a_4 & a_5 \end{bmatrix} \cdot [-0.3, 0.2, 0.1] \)

Dies ergibt die vollständigen Gradienten für die Gewichtsanpassung zwischen der versteckten Schicht und der Ausgabeschicht.

c)

Implikationen der Optimierung: Diskutiere, wie der Gradientenabstieg verwendet wird, um die Gewichte des Netzwerks zu aktualisieren. Gehe auf die Bedeutung der Lernrate im Gradientenabstieg ein und erkläre, was passiert, wenn die Lernrate zu hoch oder zu niedrig ist.

Lösung:

Um die Implikationen der Optimierung mittels Gradientenabstieg zu verstehen, müssen wir folgende Aspekte berücksichtigen:

  • Gradientenabstieg: Der Gradientenabstieg ist ein iteratives Optimierungsverfahren, das verwendet wird, um die Parameter eines Modells (in diesem Fall die Gewichte des neuronalen Netzwerks) zu minimieren, indem der Fehler oder der Loss reduziert wird. Der grundlegende Prozess bei der Anwendung des Gradientenabstiegs zur Aktualisierung der Gewichte ist wie folgt:
  1. Berechne den Gradienten des Losses bezüglich der Gewichte.
  2. Aktualisiere die Gewichte, indem eine proportionale Änderung in Richtung des negativen Gradienten vorgenommen wird:
  3. \( W_{new} = W_{old} - \eta \frac{\partial L}{\partial W} \)

    Hierbei ist \( \eta \) die Lernrate und \( \frac{\partial L}{\partial W} \) der Gradient des Losses bezüglich der Gewichte.

  4. Wiederhole die Schritte 1 und 2, bis eine Konvergenz erreicht ist oder eine vorgegebene Anzahl von Iterationen abgeschlossen ist.
  • Bedeutung der Lernrate: Die Lernrate \( \eta \) ist ein entscheidender Hyperparameter im Gradientenabstieg und bestimmt die Größe der Schrittweite, mit der die Gewichte bei jeder Iteration aktualisiert werden.
  • Wenn die Lernrate zu hoch ist:
  1. Die Gewichtsaktualisierungen können zu groß sein und das Modell kann über die optimale Lösung „springen“.
  2. Dies kann zu einer Divergenz führen oder zu einem Verhalten, bei dem der Loss nicht richtig sinkt oder sogar zunimmt.
  3. Das Training wird instabil und es ist unwahrscheinlich, dass das Modell eine gute Lösung findet.
  • Wenn die Lernrate zu niedrig ist:
  1. Die Gewichtsaktualisierungen sind sehr klein, was bedeutet, dass das Modell nur geringe Fortschritte pro Iteration macht.
  2. Das Training wird sehr langsam und benötigt möglicherweise eine sehr hohe Anzahl von Iterationen, um eine sinnvolle Konvergenz zu erreichen.
  3. Es besteht auch das Risiko, dass das Modell in lokalen Minima stecken bleibt und die globale Optimallösung nicht erreicht wird.
  • Optimales Gleichgewicht: Um ein optimales Gleichgewicht zu finden, ist es oft notwendig, die Lernrate zu justieren, z.B. durch eine Lernratenannehehrung, bei der die Lernrate während des Trainings schrittweise verkleinert wird, oder durch adaptive Lernrate-Methoden wie Adam, die die Lernrate dynamisch anpassen.

Zusammenfassend lässt sich sagen, dass der Gradientenabstieg ein zentrales Werkzeug zur Optimierung der Netzwerkgewichte ist. Die Wahl der Lernrate ist dabei äußerst wichtig und kann den Trainingserfolg maßgeblich beeinflussen. Eine wohlüberlegte Einstellung der Lernrate und die Nutzung moderner Optimierungstechniken können die Trainingszeit verkürzen und die Leistung des Modells signifikant verbessern.

Aufgabe 2)

Du hast ein Machine-Learning-Modell entwickelt, um die Klassifikation von E-Mails als Spam oder Nicht-Spam durchzuführen. Um die Leistungsfähigkeit und die Generalisierungsfähigkeit dieses Modells zu bewerten und zu validieren, musst Du verschiedene Techniken und Metriken anwenden. Gegeben ist ein Datensatz von 10.000 E-Mails, die Du in Train, Validation und Test aufgeteilt hast. Zusätzlich willst Du k-Fold Cross-Validation anwenden, um sicherzustellen, dass Dein Modell nicht overfit oder underfit ist.

a)

Sub-Exercise 1: Beschreibe, wie Du den Datensatz in Trainings-, Validierungs- und Testset aufteilen würdest und erkläre, warum diese Aufteilung wichtig ist. Förmlich zeige die Berechnung des k-Fold Cross-Validation Fehlers für k=5 anhand der folgenden hypothetischen Fehlerwerte für jedes Fold: 0.1, 0.15, 0.12, 0.08, 0.10.

Lösung:

Aufteilung des Datensatzes:

  • Trainingsset: 70% des Datensatzes (7.000 E-Mails)
  • Validierungsset: 15% des Datensatzes (1.500 E-Mails)
  • Testset: 15% des Datensatzes (1.500 E-Mails)

Die Aufteilung des Datensatzes in Trainings-, Validierungs- und Testset ist notwendig, um sicherzustellen, dass das Modell richtig trainiert und ausgewertet wird:

  • Trainingsset: Dieses Set wird verwendet, um das Modell zu trainieren. Es ermöglicht dem Modell, Muster in den Daten zu erkennen.
  • Validierungsset: Dieses Set wird gebraucht, um die Hyperparameter des Modells zu optimieren und Overfitting zu vermeiden. Es wird während des Trainings benutzt, aber die darauf basierenden Daten fließen nicht in die Gewichtungen des Modells ein.
  • Testset: Dieses Set wird erst nach dem Training gebraucht. Es dient der endgültigen Bewertung des Modells, um dessen Generalisierungsfähigkeit zu messen. Da es während des Trainingsprozesses nicht verwendet wird, bietet es eine objektive Bewertung.

Berechnung des k-Fold Cross-Validation Fehlers für k=5:

Bei der k-Fold Cross-Validation wird der Datensatz in k gleich große Teile (Folds) aufgeteilt. Das Modell wird k-mal trainiert und validiert, wobei jedes Mal ein anderer Fold als Validierungsset dient und die restlichen k-1 Folds für das Training verwendet werden. Die Ergebnisse dieser k Durchläufe werden gemittelt, um den k-Fold Cross-Validation Fehler zu berechnen.

Gegeben sind die folgenden hypothetischen Fehlerwerte für die k=5 Folds: 0.1, 0.15, 0.12, 0.08, 0.10

Der k-Fold Cross-Validation Fehler ist der Mittelwert dieser Fehlerwerte:

\[ \text{Fehler} = \frac{1}{k} \times \text{Summe der Fehlerwerte} \]

\[ \text{Fehler} = \frac{1}{5} \times (0.1 + 0.15 + 0.12 + 0.08 + 0.10) \]

\[ \text{Fehler} = \frac{1}{5} \times 0.55 \]

\[ \text{Fehler} = 0.11 \]

Der k-Fold Cross-Validation Fehler beträgt 0.11.

b)

Sub-Exercise 2: Erkläre die Begriffe Overfitting und Underfitting in Bezug auf Dein Modell. Zeichne ein kurvengestütztes Diagramm, das das Modellierungsproblem illustriert und erläutere, wie Regularisierung und eine geeignete Datenaufteilung Overfitting und Underfitting vermeiden können.

Lösung:

Overfitting und Underfitting:

  • Overfitting: Overfitting tritt auf, wenn ein Modell zu gut an die Trainingsdaten angepasst ist, sodass es gelernt hat, auch das Rauschen und die zufälligen Schwankungen im Datensatz zu modellieren. Das führt dazu, dass das Modell schlecht generalisiert und auf neuen, ungesehenen Daten (z.B. dem Testset) schlecht performt.
  • Underfitting: Underfitting geschieht, wenn das Modell nicht in der Lage ist, die zugrunde liegenden Muster in den Trainingsdaten zu erkennen. Das kann passieren, wenn das Modell zu einfach ist (zum Beispiel ein lineares Modell für ein nichtlineares Problem), sodass es sowohl auf Trainingsdaten als auch auf neuen Daten schlecht abschneidet.

Illustratives Diagramm:

Das folgende Diagramm zeigt beispielhaft das Verhalten der Trainings- und Validierungsfehler in Bezug auf die Komplexität des Modells:

Overfitting and Underfitting Chart

In diesem Diagramm sehen wir drei Bereiche:

  • Underfitting-Bereich: Bei niedriger Modellkomplexität haben sowohl Trainings- als auch Validierungsfehler hohe Werte, da das Modell nicht in der Lage ist, die grundlegenden Muster in den Daten zu erfassen.
  • Optimalbereich: Hier ist die Modellkomplexität genau richtig. Der Trainingsfehler ist niedrig, und der Validierungsfehler ist ebenfalls niedrig, was auf eine gute Generalisierung hinweist.
  • Overfitting-Bereich: Bei hoher Modellkomplexität ist der Trainingsfehler sehr niedrig, jedoch steigt der Validierungsfehler an, weil das Modell das Rauschen der Trainingsdaten erlernt hat und somit schlecht auf neuen Daten abschneidet.

Vermeidung von Overfitting und Underfitting:

  • Regularisierung: Regularisierungstechniken wie L1- oder L2-Regularisierung fügen eine Strafe hinzu, wenn die Modellkomplexität zu hoch wird. Das hilft, überflüssige Parameter zu vermeiden und das Modell einfacher zu halten, was Overfitting reduziert.
  • Datenaufteilung: Eine geeignete Aufteilung des Datensatzes in Trainings-, Validierungs- und Testset sowie die Verwendung von Techniken wie k-Fold Cross-Validation sichern ab, dass das Modell ausreichend validiert wird und seine Generalisierungsfähigkeit gut bewertet werden kann.

Aufgabe 3)

Explorative Datenanalyse (EDA) Du wirst einen Datensatz untersuchen, um dessen Hauptmerkmale zu verstehen. Dabei nutzt Du verschiedene EDA-Verfahren, wie z.B. Datenvisualisierung, deskriptive Statistik und Datenbereinigung. Verwende dazu die Programmiersprache Python mit den Bibliotheken pandas, matplotlib und seaborn. Auch die Identifikation von Ausreißern, Verteilungen und Korrelationen spielt eine wichtige Rolle.Szenario: Du hast einen Datensatz eines Online-Händlers erhalten, der Informationen über Bestellungen, Preise, Mengen und Bewertungspunkte enthält. Dein Ziel ist es, Auffälligkeiten und Zusammenhänge zu identifizieren und Hypothesen für weitere Untersuchungen zu generieren.

a)

Lese den Datensatz in ein pandas DataFrame ein und führe eine erste deskriptive Analyse der Daten durch. Nutze die Methode describe() auf dem DataFrame, um wesentliche Kennzahlen wie Mittelwert, Median und Standardabweichung für die numerischen Spalten zu berechnen. Interpretiere die ausgegebenen Ergebnisse und leite erste Erkenntnisse ab.

Lösung:

  • Explorative Datenanalyse (EDA)
  • Du wirst einen Datensatz untersuchen, um dessen Hauptmerkmale zu verstehen. Dabei nutzt Du verschiedene EDA-Verfahren, wie z.B. Datenvisualisierung, deskriptive Statistik und Datenbereinigung. Verwende dazu die Programmiersprache Python mit den Bibliotheken pandas, matplotlib und seaborn. Auch die Identifikation von Ausreißern, Verteilungen und Korrelationen spielt eine wichtige Rolle.
Szenario: Du hast einen Datensatz eines Online-Händlers erhalten, der Informationen über Bestellungen, Preise, Mengen und Bewertungspunkte enthält. Dein Ziel ist es, Auffälligkeiten und Zusammenhänge zu identifizieren und Hypothesen für weitere Untersuchungen zu generieren.Schritte zur Lösung der Teilaufgabe:
  1. Importiere die notwendigen Bibliotheken:Um den Datensatz in Python analysieren zu können, importierst Du zunächst die benötigten Bibliotheken pandas, matplotlib und seaborn. Dies machst Du mit folgendem Code:
    import pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns
  2. Lese den Datensatz in ein DataFrame ein:Du lädst den Datensatz in ein pandas DataFrame. Falls der Dateiname beispielsweise 'data.csv' lautet, verwendest Du folgenden Code:
    df = pd.read_csv('data.csv')
  3. Erste deskriptive Analyse der Daten:Nutze die Methode describe(), um wesentliche Kennzahlen wie Mittelwert, Median und Standardabweichung der numerischen Spalten zu berechnen:
    descriptive_stats = df.describe()print(descriptive_stats)
  4. Interpretation der Ergebnisse:Nach der Ausführung des obigen Codes erhältst Du eine Ausgabe, die verschiedene Kennzahlen der numerischen Spalten des DataFrames enthält. Diese Kennzahlen umfassen den Mittelwert (mean), die Standardabweichung (std), die Minimum- und Maximumwerte sowie die Quantile (25%, 50%, 75%). Hier sind einige mögliche Beobachtungen und deren Interpretation:
    • Mittelwert (mean): Der Mittelwert einer Spalte gibt den durchschnittlichen Wert an. Ein sehr hoher oder sehr niedriger Mittelwert könnte auf Ausreißer hinweisen.
    • Standardabweichung (std): Die Standardabweichung gibt an, wie stark die Werte von ihrem Mittelwert abweichen. Eine hohe Standardabweichung weist auf eine große Varianz der Daten hin.
    • Min- und Max-Werte: Diese Werte geben die Spannweite der Daten an. Sehr stark abweichende Werte könnten Ausreißer darstellen.
    • Quantile: Die Quantile (25%, 50%, 75%) geben die Verteilung der Daten an. Das 50%-Quantil entspricht dem Median und teilt die Daten in zwei gleich große Hälften.
  5. Einschätzung: Basierend auf den Kennzahlen kannst Du erste Hypothesen entwickeln und weitere Untersuchungen planen. Auffälligkeiten wie hohe Standardabweichungen oder extreme Min- und Max-Werte könnten auf Ausreißer oder besondere Muster in den Daten hinweisen, die einer genaueren Betrachtung bedürfen.

b)

Erstelle verschiedene Visualisierungen der Daten, um Muster und Auffälligkeiten zu erkennen. Zeichne ein Histogramm der Produktpreise sowie einen Boxplot der Bewertungszahlen. Was kannst Du aus den Plots über die Verteilung der Preise und der Bewertungen ableiten? Sind Ausreißer erkennbar?

Lösung:

  • Explorative Datenanalyse (EDA)
  • Du wirst einen Datensatz untersuchen, um dessen Hauptmerkmale zu verstehen. Dabei nutzt Du verschiedene EDA-Verfahren, wie z.B. Datenvisualisierung, deskriptive Statistik und Datenbereinigung. Verwende dazu die Programmiersprache Python mit den Bibliotheken pandas, matplotlib und seaborn. Auch die Identifikation von Ausreißern, Verteilungen und Korrelationen spielt eine wichtige Rolle.
Szenario: Du hast einen Datensatz eines Online-Händlers erhalten, der Informationen über Bestellungen, Preise, Mengen und Bewertungspunkte enthält. Dein Ziel ist es, Auffälligkeiten und Zusammenhänge zu identifizieren und Hypothesen für weitere Untersuchungen zu generieren.Schritte zur Lösung der Teilaufgabe:
  1. Importiere die notwendigen Bibliotheken:Um den Datensatz in Python analysieren zu können, importierst Du zunächst die benötigten Bibliotheken pandas, matplotlib und seaborn. Dies machst Du mit folgendem Code:
    import pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns
  2. Lese den Datensatz in ein DataFrame ein:Du lädst den Datensatz in ein pandas DataFrame. Falls der Dateiname beispielsweise 'data.csv' lautet, verwendest Du folgenden Code:
    df = pd.read_csv('data.csv')
  3. Erstelle ein Histogramm der Produktpreise:Verwende die Funktion histplot von seaborn, um ein Histogramm der Produktpreise zu erstellen. Dies zeigt Dir die Verteilung der Preise:
    plt.figure(figsize=(10, 6))sns.histplot(df['Preis'], bins=30, kde=True)plt.xlabel('Preis')plt.ylabel('Häufigkeit')plt.title('Histogramm der Produktpreise')plt.show()
  4. Erstelle einen Boxplot der Bewertungszahlen:Verwende die Funktion boxplot von seaborn, um einen Boxplot der Bewertungspunkte zu erzeugen. Dies hilft Dir, Ausreißer und die Verteilung der Bewertungen zu erkennen:
    plt.figure(figsize=(10, 6))sns.boxplot(x=df['Bewertung'])plt.xlabel('Bewertung')plt.title('Boxplot der Bewertungen')plt.show()
  5. Interpretation der Ergebnisse:Nachdem die Visualisierungen erstellt sind, kannst Du diese interpretieren:
    • Histogramm der Produktpreise:Das Histogramm zeigt die Verteilung der Preise. Wenn die Verteilung symmetrisch ist, sind die Preise gleichmäßig um den Mittelwert verteilt. Eine rechtsschiefe Verteilung (lange rechte Seite) deutet auf viele hohe Preise hin, während eine linksschiefe Verteilung (lange linke Seite) auf viele niedrige Preise hinweist. Beachte auch eventuelle Peaks, die auf bestimmte Preiskategorien hindeuten könnten.
    • Boxplot der Bewertungen:Der Boxplot zeigt die Verteilung der Bewertungen, wobei die Box die mittleren 50% der Daten darstellt. Die Linien (Whisker) erstrecken sich bis zu den Minimum- und Maximum-Werten innerhalb einer festgelegten Reichweite. Punkte außerhalb dieser Reichweite gelten als Ausreißer. Wenn viele Bewertungen außerhalb der Whisker liegen, deutet dies auf eine breite Streuung und das Vorhandensein von Ausreißern hin.

c)

Untersuche die Korrelationen zwischen den verschiedenen numerischen Variablen des Datensatzes. Erstelle ein Korrelationsdiagramm (Heatmap) mit seaborn und interpretiere die daraus resultierenden Werte. Gibt es starke positive oder negative Korrelationen? Welche Variablen zeigen signifikante Beziehungen und wie könnten diese interpretiert werden?

Lösung:

  • Explorative Datenanalyse (EDA)
  • Du wirst einen Datensatz untersuchen, um dessen Hauptmerkmale zu verstehen. Dabei nutzt Du verschiedene EDA-Verfahren, wie z.B. Datenvisualisierung, deskriptive Statistik und Datenbereinigung. Verwende dazu die Programmiersprache Python mit den Bibliotheken pandas, matplotlib und seaborn. Auch die Identifikation von Ausreißern, Verteilungen und Korrelationen spielt eine wichtige Rolle.
Szenario: Du hast einen Datensatz eines Online-Händlers erhalten, der Informationen über Bestellungen, Preise, Mengen und Bewertungspunkte enthält. Dein Ziel ist es, Auffälligkeiten und Zusammenhänge zu identifizieren und Hypothesen für weitere Untersuchungen zu generieren.Schritte zur Lösung der Teilaufgabe:
  1. Importiere die notwendigen Bibliotheken:Um den Datensatz in Python analysieren zu können, importierst Du zunächst die benötigten Bibliotheken pandas, matplotlib und seaborn. Dies machst Du mit folgendem Code:
    import pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns
  2. Lese den Datensatz in ein DataFrame ein:Du lädst den Datensatz in ein pandas DataFrame. Falls der Dateiname beispielsweise 'data.csv' lautet, verwendest Du folgenden Code:
    df = pd.read_csv('data.csv')
  3. Berechne die Korrelationen zwischen den numerischen Variablen:Verwende die Methode corr() von pandas auf dem DataFrame, um die Korrelationsmatrix zu berechnen:
    corr_matrix = df.corr()
  4. Erstelle ein Korrelationsdiagramm (Heatmap) mit seaborn:Verwende die Funktion heatmap von seaborn, um die Korrelationsmatrix darzustellen:
    plt.figure(figsize=(10, 8))sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', center=0)plt.title('Korrelationsmatrix der numerischen Variablen')plt.show()
  5. Interpretation der Heatmap:Nachdem die Heatmap erstellt ist, kannst Du diese interpretieren:
    • Starke positive Korrelation:Ein hoher positiver Korrelationswert (nahe 1) zeigt, dass zwei Variablen stark positiv korrelieren. Das bedeutet, dass hohe Werte der einen Variable mit hohen Werten der anderen Variable zusammentreffen.
    • Starke negative Korrelation:Ein hoher negativer Korrelationswert (nahe -1) zeigt, dass zwei Variablen stark negativ korrelieren. Das bedeutet, dass hohe Werte der einen Variable mit niedrigen Werten der anderen Variable zusammentreffen.
    • Keine oder schwache Korrelation:Ein Korrelationswert nahe 0 zeigt, dass es keine oder nur eine schwache lineare Beziehung zwischen den Variablen gibt.
    • Signifikante Beziehungen:Durch die Heatmap kannst Du signifikante Beziehungen zwischen den Variablen erkennen. Zum Beispiel könnte eine starke positive Korrelation zwischen 'Menge' und 'Preis' darauf hinweisen, dass höherpreisige Produkte tendenziell in größeren Mengen bestellt werden. Eine starke negative Korrelation zwischen 'Preis' und 'Bewertung' könnte darauf hinweisen, dass teurere Produkte schlechter bewertet werden.
  6. Schlussfolgerungen:Basierend auf den Ergebnissen der Korrelationen kannst Du Hypothesen für weitere Untersuchungen erstellen. Starke Korrelationen, ob positiv oder negativ, zeigen mögliche Zusammenhänge zwischen den Variablen, die vertieft untersucht werden sollten, um kausale Beziehungen zu identifizieren.

Aufgabe 4)

Verteilte Systeme zur Verarbeitung großer Datenmengen

  • Hadoop: Framework zur verteilten Speicherung (HDFS) und Verarbeitung (MapReduce)
  • Spark: Schnelle In-Memory-Verarbeitung, unterstützt u.a. Batch- und Streaming-Daten
  • HDFS: Verteiltes Dateisystem innerhalb von Hadoop
  • MapReduce: Programmiermodell zur Datenverarbeitung in Hadoop
  • RDD (Resilient Distributed Dataset): Zentrales Abstraktionsmodell in Spark, unterstützt Ausfallsicherheit und parallele Operationen
  • Spark SQL: Ermöglicht Abfragen großer Datenmengen ähnlich zu SQL
  • DataFrames/Datasets: Optimierte Datenstrukturen in Spark für benutzerfreundliche und leistungsfähige Datenmanipulation

a)

Beschreibe den strukturellen Aufbau des Hadoop Frameworks und erläutere die Funktionsweise der beiden Hauptbestandteile, HDFS und MapReduce. Was sind die grundlegenden Vorteile der Nutzung von Hadoop für die verteilte Datenverarbeitung?

Lösung:

Verteilte Systeme zur Verarbeitung großer Datenmengen

  • Hadoop: Framework zur verteilten Speicherung (HDFS) und Verarbeitung (MapReduce)
  • Spark: Schnelle In-Memory-Verarbeitung, unterstützt u.a. Batch- und Streaming-Daten
  • HDFS: Verteiltes Dateisystem innerhalb von Hadoop
  • MapReduce: Programmiermodell zur Datenverarbeitung in Hadoop
  • RDD (Resilient Distributed Dataset): Zentrales Abstraktionsmodell in Spark, unterstützt Ausfallsicherheit und parallele Operationen
  • Spark SQL: Ermöglicht Abfragen großer Datenmengen ähnlich zu SQL
  • DataFrames/Datasets: Optimierte Datenstrukturen in Spark für benutzerfreundliche und leistungsfähige Datenmanipulation

Subexercise:

Struktureller Aufbau des Hadoop Frameworks

Hadoop ist ein Framework zur verteilten Speicherung und Verarbeitung großer Datenmengen. Es besteht aus zwei Hauptbestandteilen:

  • HDFS (Hadoop Distributed File System): HDFS ist ein verteiltes Dateisystem, das Daten über mehrere Knoten in einem Cluster speichert. Es teilt die Daten in große Blöcke auf und repliziert diese Blöcke auf mehrere Knoten, um Ausfallsicherheit und Datenverfügbarkeit zu gewährleisten. HDFS besteht aus zwei Hauptkomponenten:
  • NameNode: Verantwortlich für die Verwaltung des Dateisystems und die Metadaten der gespeicherten Dateien. Der NameNode zeichnet auf, welche Blöcke zu welchen Dateien gehören und auf welchen Knoten diese Blöcke gespeichert sind.
  • DataNode: Verwalten die tatsächlichen Datenblöcke. Jeder DataNode ist für das Speichern und Abrufen der Datenblöcke sowie die Durchführung von Lese- und Schreiboperationen verantwortlich.

HDFS sorgt durch Replikation (standardmäßig dreifache Replikation) dafür, dass Daten auch bei Ausfall von Knoten im Cluster verfügbar bleiben.

  • MapReduce: MapReduce ist ein Programmiermodell und eine Software-Bibliothek zur verteilten Verarbeitung großer Datensätze. Es besteht aus zwei Hauptphasen:
  • Map-Phase: In dieser Phase werden die Eingabedaten in kleinere Chunks aufgeteilt, die dann parallel verarbeitet werden. Jeder Chunk wird an eine 'Map'-Funktion übergeben, die die Daten verarbeitet und in eine Zwischenablegung schreibt.
  • Reduce-Phase: In dieser Phase werden die in der Map-Phase erzeugten Zwischenresultate zusammengeführt, um das Endergebnis zu berechnen. Die 'Reduce'-Funktion aggregiert die Daten und generiert die endgültigen Ausgaben.

MapReduce ermöglicht die parallele Verarbeitung großer Datenmengen, indem es die Datenverarbeitung auf viele Maschinen verteilt.

Grundlegende Vorteile der Nutzung von Hadoop für die verteilte Datenverarbeitung:

  • Skalierbarkeit: Hadoop kann effizient auf Tausende von Knoten skaliert werden, um große Datenmengen zu verarbeiten.
  • Fehlertoleranz: Durch Datenreplikation und die Fähigkeit, Tasks auf anderen Knoten neu zu starten, stellt Hadoop sicher, dass Daten auch bei Hardware-Ausfällen verfügbar bleiben.
  • Kosteneffizienz: Da Hadoop auf handelsüblichen Hardware-Komponenten läuft, können Unternehmen kostengünstige Lösungen für die Verarbeitung großer Datenmengen implementieren.
  • Flexibilität: Hadoop unterstützt verschiedene Arten von Daten (strukturierte, semi-strukturierte und unstrukturierte Daten), was es vielseitig und anpassungsfähig macht.
  • Community und Ökosystem: Hadoop hat eine große und aktive Community, die kontinuierlich zur Verbesserung des Frameworks und zu einem umfangreichen Ökosystem an Tools und Erweiterungen beiträgt.

b)

Erkläre das Konzept von Resilient Distributed Datasets (RDD) in Apache Spark und wie es zur Ausfallsicherheit und parallelen Datenverarbeitung beiträgt. Führe ein Python-Beispiel an, welches die Transformation und Aktion auf einem RDD demonstriert. Das Beispiel sollte mindestens eine Transformation und eine Aktion umfassen.

Lösung:

Verteilte Systeme zur Verarbeitung großer Datenmengen

  • Hadoop: Framework zur verteilten Speicherung (HDFS) und Verarbeitung (MapReduce)
  • Spark: Schnelle In-Memory-Verarbeitung, unterstützt u.a. Batch- und Streaming-Daten
  • HDFS: Verteiltes Dateisystem innerhalb von Hadoop
  • MapReduce: Programmiermodell zur Datenverarbeitung in Hadoop
  • RDD (Resilient Distributed Dataset): Zentrales Abstraktionsmodell in Spark, unterstützt Ausfallsicherheit und parallele Operationen
  • Spark SQL: Ermöglicht Abfragen großer Datenmengen ähnlich zu SQL
  • DataFrames/Datasets: Optimierte Datenstrukturen in Spark für benutzerfreundliche und leistungsfähige Datenmanipulation

Subexercise:

Konzept von Resilient Distributed Datasets (RDD) in Apache Spark

Ein RDD (Resilient Distributed Dataset) ist ein unveränderliches verteiltes Datenobjekt, das in Spark für die Datenverarbeitung verwendet wird. RDDs bieten Ausfallsicherheit und effiziente Parallelverarbeitung durch folgende Eigenschaften:

  • Partitionierung: RDDs bestehen aus mehreren Partitionen, die auf verschiedene Knoten im Cluster verteilt werden. Dadurch können Operationen auf RDDs parallel ausgeführt werden.
  • Fehlertoleranz: Spark behält die Lineage (Abstammung) der RDDs bei, d.h., es verfolgt die Transformationen, die zur Erzeugung der RDDs führten. Wenn eine Partition ausfällt, kann Spark diese Partition anhand der Lineage neu berechnen und wiederherstellen.
  • Unveränderlichkeit: RDDs sind unveränderbar. Jede Operation auf einem RDD erzeugt ein neues RDD, wodurch die Wiederherstellung im Fehlerfall erleichtert wird.

Python-Beispiel zur Demonstration von RDD-Transformationen und -Aktionen

Im folgenden Python-Beispiel wird ein Spark-Programm gezeigt, das eine Transformation (map) und eine Aktion (collect) auf einem RDD durchführt:

from pyspark import SparkContextsc = SparkContext("local", "RDD Example")# Erstellen eines RDD aus einer Listedata = [1, 2, 3, 4, 5]rdd = sc.parallelize(data)# Transformation: Verdoppeln jedes Elements im RDDtransformation_rdd = rdd.map(lambda x: x * 2)# Aktion: Sammlung der Ergebnisseresult = transformation_rdd.collect()# Ausgabe der Ergebnisseprint(result)# Beenden des SparkContextsc.stop()

In diesem Beispiel:

  • Transformation: Die map-Funktion wird verwendet, um jede Zahl im RDD zu verdoppeln. Dies ist eine Transformation, die ein neues RDD erzeugt.
  • Aktion: Die collect-Funktion wird verwendet, um alle Elemente des RDD in ein Array auf dem Treiber (lokale Maschine) zu sammeln. Dies ist eine Aktion, die eine Berechnung auf den Daten auslöst und das Ergebnis zurückgibt.

Durch die Verwendung von RDDs kann Spark große Datenmengen effizient und fehlertolerant parallel verarbeiten.

c)

Vergleiche Spark SQL und herkömmliche SQL-Abfragen. Diskutiere, wie Spark SQL Arbeitslasten auf verteilten Systemen optimiert und welche Vorteile DataFrames/Datasets im Gegensatz zu herkömmlichen RDDs bieten. Stelle ein Beispiel in Spark SQL dar, das eine Abfrage auf einem DataFrame ausführt.

Lösung:

Verteilte Systeme zur Verarbeitung großer Datenmengen

  • Hadoop: Framework zur verteilten Speicherung (HDFS) und Verarbeitung (MapReduce)
  • Spark: Schnelle In-Memory-Verarbeitung, unterstützt u.a. Batch- und Streaming-Daten
  • HDFS: Verteiltes Dateisystem innerhalb von Hadoop
  • MapReduce: Programmiermodell zur Datenverarbeitung in Hadoop
  • RDD (Resilient Distributed Dataset): Zentrales Abstraktionsmodell in Spark, unterstützt Ausfallsicherheit und parallele Operationen
  • Spark SQL: Ermöglicht Abfragen großer Datenmengen ähnlich zu SQL
  • DataFrames/Datasets: Optimierte Datenstrukturen in Spark für benutzerfreundliche und leistungsfähige Datenmanipulation

Subexercise:

Vergleich von Spark SQL und herkömmlichen SQL-Abfragen

Spark SQL und herkömmliche SQL-Abfragen ermöglichen beide die Interaktion mit großen Datenmengen auf deklarative Weise. Es gibt jedoch einige wesentliche Unterschiede:

  • Leistung: Spark SQL verwendet optimierte Ausführungspläne und In-Memory-Verarbeitung, was zu einer besseren Leistung im Vergleich zu herkömmlichen SQL-Abfragen auf Festplattenspeicher führt.
  • Integration: Spark SQL kann nahtlos mit anderen Komponenten im Spark-Ökosystem integriert werden, z.B. Spark Streaming und Machine Learning Library (MLlib), was eine vielseitigere Datenverarbeitung ermöglicht.
  • Skalierbarkeit: Spark SQL kann auf verteilten Systemen skaliert werden und große Datenmengen über viele Knoten hinweg effizient verarbeiten. Herkömmliche SQL-Abfragen sind oft auf die Skalierungsgrenzen der zugrunde liegenden Datenbank beschränkt.

Optimierungen in Spark SQL

Spark SQL optimiert Arbeitslasten auf verteilten Systemen durch verschiedene Techniken:

  • Project Tungsten: Eine Aufgabe, die darauf abzielt, die gesamte CPU- und Speicherauslastung zu optimieren. Dies umfasst optimierte Speicherverwaltung und Codegenerierung für Abfragen zur Laufzeit.
  • Catalyst Optimizer: Ein spezieller Optimierer in Spark SQL, der komplexe Abfragen optimiert, indem er logische und physische Ausführungspläne generiert. Der Optimierer nutzt regelbasierte und kostenbasierte Strategien zur Verbesserung der Abfrageleistung.
  • In-Memory-Verarbeitung: Spark SQL speichert Daten im Speicher, um die Latenzzeiten deutlich zu reduzieren und die Leistung zu steigern, besonders bei wiederholten Abfragen.

Vorteile von DataFrames/Datasets im Gegensatz zu herkömmlichen RDDs

  • Benutzerfreundlichkeit: DataFrames und Datasets bieten eine höhere Abstraktion als RDDs. Sie ermöglichen die Verwendung ähnlicher SQL-Abfragen, was die Datenmanipulation intuitiver und zugänglicher macht.
  • Optimierungen: DataFrames und Datasets profitieren von den Optimierungen des Catalyst Optimizers, was zu effizienteren Abfrageausführungen führt.
  • Typensicherheit (nur bei Datasets): Datasets bieten Kompilierzeit-Typensicherheit, was bedeutet, dass viele Fehler frühzeitig erkannt werden können. Dies führt zu robusteren Datenpipelines.

Beispiel einer Spark SQL-Abfrage auf einem DataFrame

Im folgenden Python-Beispiel wird ein Spark SQL-Programm gezeigt, das eine Abfrage auf einem DataFrame ausführt:

from pyspark.sql import SparkSession# Initialisiere SparkSessionspark = SparkSession.builder.appName("Spark SQL Beispiel").getOrCreate()# Beispiel-Daten erstellendata = [(1, "Alice", 29), (2, "Bob", 35), (3, "Cathy", 23)]columns = ["ID", "Name", "Alter"]# DataFrame erstellendf = spark.createDataFrame(data, schema=columns)# Registrierung des DataFrames als temporäre Tabelledf.createOrReplaceTempView("personen")# Abfrage auf dem DataFrame ausführenergebnis = spark.sql("SELECT Name, Alter FROM personen WHERE Alter > 25")# Ergebnisse anzeigenergebnis.show()# Beenden der SparkSessionspark.stop()

In diesem Beispiel:

  • Ein DataFrame wird erstellt und aus Beispieldaten konstruiert.
  • Der DataFrame wird als temporäre Tabelle registriert, sodass darauf SQL-Abfragen ausgeführt werden können.
  • Eine SQL-Abfrage wird ausgeführt, um die Namen und das Alter von Personen zu ermitteln, die älter als 25 Jahre sind.
  • Die Ergebnisse der Abfrage werden angezeigt.

Dies vereinfacht die Datenmanipulation und ermöglicht es Benutzern, mit großen Datenmengen auf eine SQL-ähnliche Weise zu interagieren.

Sign Up

Melde dich kostenlos an, um Zugriff auf das vollständige Dokument zu erhalten

Mit unserer kostenlosen Lernplattform erhältst du Zugang zu Millionen von Dokumenten, Karteikarten und Unterlagen.

Kostenloses Konto erstellen

Du hast bereits ein Konto? Anmelden