# ---
# jupyter:
#   jupytext:
#     text_representation:
#       extension: .py
#       format_name: light
#       format_version: '1.5'
#       jupytext_version: 1.14.4
#   kernelspec:
#     display_name: Python 3
#     language: python
#     name: python3
# ---

# +
# default_exp radom_forest
# -

# # codecentric.AI Bootcamp - Random Forests
#
# ## Aufgaben
#
# Hier findet ihr eine Reihe von Übungsaufgaben zu Random Forests.
#
# Folge den Aufgaben und ergänze die ___ in den Code-Abschnitten.
#
# Die folgenden Pakete werden geladen:

#hide
from nbdev.showdoc import *

# %matplotlib inline

#export
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# ### Aufgabe 1: Datensätze aus Scikit-learn laden
#
# Für die nachfolgenden Übungsaufgaben wollen wir zwei Datensätze verwenden, einen für Klassifikationsmodelle und einen anderen für Regressionsmodelle.
#
# - Importiere die Funktion zum Laden des `iris` Datensatzes.
# - Importiere die Funktion zum Laden des `boston` Datensatzes.

#export
# Irisdaten für Klassifikation
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import confusion_matrix

# - Lade den `iris` Datensatz ohne weitere Argumente anzugeben und gucke dir die Beschreibung an.

#export
data_iris = load_iris()
print(data_iris.DESCR)

# - Lade den `iris` Datensatz so, dass du zwei einzelne Objekte zurück bekommst: einen für die Featurewerte und einen für die Antwortvariable.

#export
features_iris, target_iris = load_iris(return_X_y=True)

# ### Aufgabe 2: Daten mit Scikit-learn in Trainings- und Testsets aufteilen
#
# Nun wollen wir die beiden Datensätze, die wir geladen haben, in Trainings- und Testsets aufteilen.
#
# - Importiere die entsprechene Funktion für das Aufteilen der Datensätze aus Scikit-learn.
#
# - Teile die Feature und Targets des `iris` Datensatzes in zwei Sets ein: 80% der Daten sollen in das Trainingsset, 20% in das Testset. 
# - Stratifiziere die Aufteilung anhand der Antwortvariablen.

# +
#export

X_train_iris, X_test_iris, y_train_iris, y_test_iris = train_test_split(
    features_iris,
    target_iris,
    test_size=0.2,
    stratify=target_iris,
    random_state = 42)
# -

# ### Aufgabe 3: Klassifikation mit Random Forests in Scikit-learn
#
# Nun sind unsere `iris` Daten bereit für das Trainieren von Modellen.
#
# - Importiere den Random Forest Klassifikationsalgorithmus.
# - Definiere den Random Forest Algorithmus mit den folgenden Hyperparametern: 200 Bäume mit maximaler Tiefe von 3. maximaler Anzahl in Betracht zu ziehender Feature von 3 und aktiviere Out-Of-Bag Sampling.
# - Trainiere das so definierte Modell auf den `iris` Trainingsdaten.

# +
#export

rf_model_class = RandomForestClassifier(
    n_estimators=200, 
    max_depth=3,
    max_features=3,
    bootstrap=True,
    random_state = 42)
rf_model_class.fit(X_train_iris, y_train_iris)
# -

# - Importiere die Funktion zur Erstellung von Kreuzmatrizen aus Scikit-learn.
# - Nutze das Random Forest Klassifikationsmodell um Vorhersagen auf den Testdaten zu machen.
# - Vergleiche die vorhergesagten Klassen mit den tatsächlichen Klassen des Testsets, indem du die Kreuzmatrix ausgeben lässt.

# +
#export

y_pred_rf_class = rf_model_class.predict(X_test_iris)

print(confusion_matrix(y_test_iris, y_pred_rf_class, labels=np.unique(y_test_iris)))

StarcoderdataJupyterScriptsDedupFiltered