kurse:ef05a-2021:classificationtrees

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
kurse:ef05a-2021:classificationtrees [2022/03/16 08:03] – [Filtern] Simon Knauskurse:ef05a-2021:classificationtrees [2022/03/16 08:05] (current) Simon Knaus
Line 1: Line 1:
 +====== Klassifikationsbäume ======
 +==== Beispiel Code: Klassifikation ====
 +[[https://github.com/ivo-bloechliger/kaien/blob/main/decisiontree/classification.py|Beispiel auf Github]]
 +==== Beispiel Code: Feature Importance ====
 +[[https://github.com/ivo-bloechliger/kaien/blob/main/decisiontree/importance.py|Beispiel auf Github]]
 +==== Baumtiefe ====
 +Trainiert (berechnet) man den Baum auf den Trainingsdaten, kann er beliebig genau werden und alle Buchstaben richtig klassifizieren. Bedinung: Der Baum muss tief genug sein, dass in jeder Endzelle (Blatt) des Baumes genau eine Beobachtung ist.
 +
 +Problem: Dieser perfekte Baum funktioniert sehr schlecht für neue Daten (Testdaten). Um das zu lösen werden die Daten in Evaluations-Daten (<<Pseudo-Test>>-Daten) und Trainingsdaten unterteilt und da die optimale Baumtiefen ''max_depth'' bestimmt. 
 +
 +=== Idee ===
 +Erstelle eine Schlaufe, in der du über die Baumtiefe iterierst. In jeder Iteration, das heisst, für jede Baumtiefe, trainierst du einen Baum (''fit(X[training,:],y[training]'') und evaluierst diesen Baum auf den Evaluationsdaten (''predict(X[evaluation,:])''). 
 +
 +Diese Vorhersagen $\hat y$ (''yhat'') vergleichst du dann mit den bekannten $y$-Werten (''y[evaluation]''). Daraus kann der Prozentsatz korrekt Klassifzierter berechnet werden: 
 +
 +''sum(yhat==y[evaluation])/len(yhat)'' ((In Python können Bool'sche Werte summiert werden: ''True'' ist $1$ und ''False'' ist $0$))
 +
 +==== Filtern =====
 +
 +numpy-Array können mit Boolschen-Arrays indiziert werden:
 +<code python>
 +import numpy as np
 +
 +src_path = "../data/kennzahlen.csv"
 +keydata =  np.loadtxt(fname = src_path, delimiter = ',', skiprows=1)
 +#So werden nur die Zeilen verwendet, welche in der 1. Spalte den Wert 49 haben
 +filteredkeydata = keydata[keydata[:,0]==49,:]
 +print(filteredkeydata)
 +</code>
 +Diese Idee kann mit ''and'' und ''or'' oder ''>'' und ''<'' kombiniert werden: Damit können z.B. nur Kleinbuchstaben (siehe [[https://de.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange#ASCII-Tabelle|ASCII-Tabelle]]) oder nur Daten eines Nutzers verwendet werden.
 +