Skip to content
Snippets Groups Projects
Commit c15e9f02 authored by andyg's avatar andyg
Browse files

Removed inline command

parent f1e906cf
No related branches found
No related tags found
No related merge requests found
%% Cell type:markdown id: tags:
# Daten und Entscheidungsbäume - So macht das ein Computer
%% Cell type:code id: tags:
``` python
!jupyter nbextension enable --py hide_code
```
%% Cell type:code id: tags:
``` python
#from dectrees_interactive_tools import ClassificationTree as ct
from PyTree import ClassificationTree as ct
import pandas as pd
import numpy as np
from ipywidgets import interact, interactive, fixed, interact_manual, Layout, HBox
import ipywidgets as widgets
```
%% Cell type:markdown id: tags:
<div class="panel panel-success">
<div class="panel-heading">
<b> Erklärungstext - Von Datenkarten zu Datentabellen im Computer</b>
</div>
<div class="panel-body">
Der Computer arbeitet mit Datentabellen statt mit Datenkarten. Alle Informationen der Karten befinden sich in einer einzigen Tabelle. <p><p>
Unten siehst Du den Apfel und das Popcorn als Datenarte und darunter als Datentabelle.
<p><p>
Die Daten der Tabelle muss ein Mensch eintragen, damit der Computer damit weiterarbeiten kann.
</div>
%% Cell type:markdown id: tags:
<td>
<img src="Bilder\Apfel.png" alt="Drawing" style="width: 300px; float: left;" hspace=40 />
<img src="Bilder\Popcorn.png" alt="Drawing" style="width: 300px; float: left;" hspace=40/>
</td>
%% Cell type:markdown id: tags:
<td>
<img src="Bilder\Datentabelle.png" alt="Drawing" style="width: 530px; float: left;" hspace=40 />
</td>
%% Cell type:markdown id: tags:
<div class="panel panel-info">
<div class="panel-heading">
<b>Aufgabe - Wie lauten die richtigen Angaben?</b>
</div>
<div class="panel-body">
Leider ist beim Übertragen der Daten in die Tabelle etwas schief gelaufen. Ein Wert wurde falsch eingetragen. Findest du heraus, welcher Wert das ist?
<p><p>
Schaue dir die Tabelle und die Datenkarten genau an und vergleiche.
<p><p>
Wähle unten aus, bei welchem Lebensmittel und welchem Merkmal der Fehler passiert ist!
</div>
</div>
%% Cell type:code id: tags:
``` python
def antwort(Lebensmittel, Merkmal):
if (Lebensmittel == 'Apfel') & (Merkmal == 'Eiweiß'):
print('Gut gemacht!')
else:
print('Leider falsch, probier es noch einmal!')
antwort_widget = interactive(antwort,{'manual': True, 'manual_name': 'Antwort überprüfen'}, Lebensmittel = ['Apfel', 'Popcorn'], Merkmal = ['Energie', 'Fett', 'gesättigte Fettsäuren', 'Kohlenhydrate', 'Zucker', 'Eiweiß', 'Salz'])
display(antwort_widget)
```
%% Cell type:markdown id: tags:
# Daten importieren
%% Cell type:markdown id: tags:
<div class="panel panel-success">
<div class="panel-heading">
<b> Eklärungstext - Daten importieren </b>
</div>
<div class="panel-body">
Den kompletten Datensatz ohne Fehler kannst du jetzt importieren, indem du auf "Lade Daten" klickst.
</div>
%% Cell type:code id: tags:
``` python
df_lebensmittel = pd.read_csv('Daten/Trainingsdaten.csv', sep = ';').set_index('Name')
def read_csv():
display(df_lebensmittel)
daten_widget = interactive(read_csv,{'manual': True, 'manual_name': 'Lade Daten'})
display(daten_widget)
```
%% Cell type:markdown id: tags:
# Daten labeln
%% Cell type:markdown id: tags:
<div class="panel panel-success">
<div class="panel-heading">
<b> Eklärungtext - Was ist eher empfehlenswert und was eher nicht? </b>
</div>
<div class="panel-body">
Der Computer "weiß" noch nicht, welches Lebensmittel "eher empfehlenswert" und welches "eher nicht empfehlenswert" ist. Das musst Du ihm jetzt beibringen.<p><p>
Im Unterricht hast Du dazu farbige Büroklammern an die Karten geheftet. Für den Computer muss es in die Datentabelle geschrieben werden.
</div>
%% Cell type:markdown id: tags:
<td>
<img src="Bilder\Apfel_label.png" alt="Drawing" style="width: 300px; float: left;" hspace=40 />
<img src="Bilder\Popcorn_label.png" alt="Drawing" style="width: 300px; float: left;" hspace=40/>
</td>
%% Cell type:markdown id: tags:
<div class="panel panel-info">
<div class="panel-heading">
<b>Aufgabe - Die Datentabelle ergänzen</b>
</div>
<div class="panel-body">
Wähle für jedes Lebensmittel aus, ob der Computer es als <b>"eher empfehlenswert"</b> oder als <b>"eher nicht empfehlenswert"</b> labeln soll. Du kannst es auch <b>"beiseite legen"</b>, dann wird es aus der Datentabelle gelöscht.
<p><p>
Am Ende siehst Du, dass die Datentabelle eine weitere Spalte "Label" hat.
</div>
</div>
%% Cell type:code id: tags:
``` python
def label_data(Apfel, Banane, Haselnussschnitte, Chips, Pommes, Nudeln, Erbsen, Eisbergsalat, Frikadelle,
Brotscheibe, Popcorn, Vanilleeis, Marmorkuchen, ChickenNuggets, Erdbeerjoghurt, Salatgurke,
Brokkoli, Schokomüsli, Waffel, Kartoffel, Vollmilchschokolade, Mayonaise, Putenbrustfilet,
Avocado, Gummibärchen, Knäckebrot, Haferflocken, Himbeermarmelade, Salzstangen, Räucherlachs,
Spiegelei, Zwieback, Salamischeibe, Bratwurst, Butter, Senf, Walnüsse, Datteln, Champignons,
SchwarzwälderSchinken):
df = daten_widget.result
df['Etikett'] = [Apfel, Banane, Haselnussschnitte, Chips, Pommes, Nudeln, Erbsen, Eisbergsalat, Frikadelle,
Brotscheibe, Popcorn, Vanilleeis, Marmorkuchen, ChickenNuggets, Erdbeerjoghurt, Salatgurke,
Brokkoli, Schokomüsli, Waffel, Kartoffel, Vollmilchschokolade, Mayonaise, Putenbrustfilet,
Avocado, Gummibärchen, Knäckebrot, Haferflocken, Himbeermarmelade, Salzstangen, Räucherlachs,
Spiegelei, Zwieback, Salamischeibe, Bratwurst, Butter, Senf, Walnüsse, Datteln, Champignons,
SchwarzwälderSchinken]
return Apfel
label_widget = interactive(label_data,{'manual': True, 'manual_name': 'Label festlegen'},
Apfel = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
Banane = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
Haselnussschnitte = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
Chips = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
Pommes = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
Nudeln = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
Erbsen = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
Eisbergsalat = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
Frikadelle = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
Brotscheibe = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
Popcorn = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
Vanilleeis = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
Marmorkuchen = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
ChickenNuggets = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
Erdbeerjoghurt = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
Salatgurke = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
Brokkoli = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
Schokomüsli = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
Waffel = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
Kartoffel = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
Vollmilchschokolade = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
Mayonaise = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
Putenbrustfilet = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
Avocado = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
Gummibärchen = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
Knäckebrot = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
Haferflocken = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
Himbeermarmelade = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
Salzstangen = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
Räucherlachs = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
Spiegelei = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
Zwieback = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
Salamischeibe = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
Bratwurst = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
Butter = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
Senf = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
Walnüsse = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
Datteln = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
Champignons = ['beiseite legen', 'eher empf.', 'eher nicht empf.'],
SchwarzwälderSchinken = ['beiseite legen', 'eher empf.', 'eher nicht empf.'])
#label_widget
```
%% Cell type:code id: tags:
``` python
liste= ['Apfel', 'Banane', 'Haselnussschnitte', 'Chips', 'Pommes', 'Nudeln', 'Erbsen', 'Eisbergsalat', 'Frikadelle',
'Brotscheibe', 'Popcorn', 'Vanilleeis', 'Marmorkuchen', 'Chicken Nuggets', 'Erdbeerjoghurt', 'Salatgurke',
'Brokkoli', 'Schokomüsli', 'Waffel', 'Kartoffel', 'Vollmilchschokolade', 'Mayonaise', 'Putenbrustfilet',
'Avocado', 'Gummibärchen', 'Knäckebrot', 'Haferflocken', 'Himbeermarmelade', 'Salzstangen', 'Räucherlachs',
'Spiegelei', 'Zwieback', 'Salamischeibe', 'Bratwurst', 'Butter', 'Senf', 'Walnüsse', 'Datteln', 'Champignons',
'Schwarzwälder Schinken']
results=[]
for i in liste:
results.append('beiseite legen')
```
%% Cell type:code id: tags:
``` python
import ipywidgets as widgets
import numpy
def radiobuttons(name, index, option1, option2, option3):
output_radio_selected = widgets.Text()
radio1 = widgets.RadioButtons(options=[option1])
radio2 = widgets.RadioButtons(options=[option2])
radio3 = widgets.RadioButtons(options=[option3])
selected_option = None
radio1.index = None
radio2.index = None
radio3.index = None
def radio1_observer(sender):
radio2.unobserve(radio2_observer, names=['value'])
radio2.index = None
radio3.unobserve(radio3_observer, names=['value'])
radio3.index = None
global selected_option1
output_radio_selected.value = radio1.value
selected_option1 = output_radio_selected.value
selected_option = selected_option1
#print(name + ' selected option set to: ' + selected_option)
results[index] = selected_option
radio2.observe(radio2_observer, names=['value'])
radio3.observe(radio3_observer, names=['value'])
def radio2_observer(sender):
radio1.unobserve(radio1_observer, names=['value'])
radio1.index = None
radio3.unobserve(radio3_observer, names=['value'])
radio3.index = None
global selected_option2
output_radio_selected.value = radio2.value
selected_option2 = output_radio_selected.value
selected_option = selected_option2
#print(name + ' selected option set to: ' + selected_option)
results[index] = selected_option
radio1.observe(radio1_observer, names=['value'])
radio3.observe(radio3_observer, names=['value'])
def radio3_observer(sender):
radio1.unobserve(radio1_observer, names=['value'])
radio1.index = None
radio2.unobserve(radio2_observer, names=['value'])
radio2.index = None
global selected_option3
output_radio_selected.value = radio3.value
selected_option3 = output_radio_selected.value
selected_option = selected_option3
#print(name + ' selected option set to: ' + selected_option)
results[index] = selected_option
radio1.observe(radio1_observer, names=['value'])
radio2.observe(radio2_observer, names=['value'])
radio1.observe(radio1_observer, names=['value'])
radio2.observe(radio2_observer, names=['value'])
radio3.observe(radio3_observer, names=['value'])
label = widgets.Label(name, layout={'width': '170px'})
return [widgets.HBox([label, radio1, radio2, radio3]), selected_option]
```
%% Cell type:code id: tags:
``` python
j = 0
for i in liste:
display(radiobuttons(i, j, 'eher empfehlenswert','eher nicht empfehlenswert','beiseite legen')[0])
j+=1
```
%% Cell type:code id: tags:
``` python
def fill_in_label(label_list):
df_lebensmittel_label = df_lebensmittel.copy()
df_lebensmittel_label['Label'] = label_list
df_lebensmittel_label_alle = df_lebensmittel_label.copy()
df_lebensmittel_label = df_lebensmittel_label[df_lebensmittel_label['Label']!='beiseite legen']
display(df_lebensmittel_label)
return df_lebensmittel_label, df_lebensmittel_label_alle
label_widget = interactive(fill_in_label,{'manual': True, 'manual_name': 'Label eintragen'},label_list = fixed(results))
display(label_widget)
label_widget.result = df_lebensmittel, df_lebensmittel
```
%% Cell type:markdown id: tags:
# Daten sortieren
%% Cell type:markdown id: tags:
<div class="panel panel-success">
<div class="panel-heading">
<b> Eklärungstext </b>
</div>
<div class="panel-body">
Vielleicht erinnerst du dich daran, wie mühsam das <b>Sortieren</b> der Datenkarten für ein Merkmal war. Der Computer kann das viel schneller.
</div>
%% Cell type:markdown id: tags:
<div class="panel panel-info">
<div class="panel-heading">
<b>Aufgabe - Die Datentabelle sortieren</b>
</div>
<div class="panel-body">
Wähle ein Merkmal aus, nach dem die Datentabelle sortiert werden soll.
<p><p>
Welches Lebensmittel steht nun in der Datentabelle ganz oben?
</div>
</div>
%% Cell type:code id: tags:
``` python
def sort_data(Merkmal):
try:
df_lebensmittel_label = label_widget.result[0].copy()
df_lebensmittel_label = df_lebensmittel_label[df_lebensmittel_label['Label']!='beiseite legen']
display(df_lebensmittel_label.sort_values(Merkmal))
return df_lebensmittel_label.sort_values(Merkmal)
except:
print('FEHLER')
print('Die Label sind noch nicht korrekt eingetragen.')
print('Wähle die Label oben aus und bestätige mit dem Button: "Label Eintragen"')
sort_widget = interactive(sort_data,{'manual': True, 'manual_name': 'Sortiere Daten'}, Merkmal = df_lebensmittel.columns)
sort_widget
```
%% Cell type:markdown id: tags:
# Eine Entscheidungsregel aufstellen
%% Cell type:markdown id: tags:
<div class="panel panel-success">
<div class="panel-heading">
<b> Eklärungtext - Schwellenwerte ausprobieren</b>
</div>
<div class="panel-body">
Im Unterricht hast Du als nächstes einen Schwellenwert gesucht, der die sortierten Daten möglichst gut in "eher empfehlenswert" und in "eher nicht empfehlenswert" trennt. Du kannst hier verschiedene Schwellenwerte ausprobieren.
<p><p>
<b> Tipp</b> <p>
Nimm das Merkmal, nach dem Du die Datentabelle gerade sortiert hast und probier verschiedene Schwellenwerte aus.
<p></p>
<b>Hinweis</b><p>
Wenn du <b>automatisch</b> anklickst wird der ausgesuchte Schwellwert ignoriert und der Computer sucht automatisch den besten Schwellwert für das ausgewählte Merkmal. Dann wird auch eine Tabelle angezeigt, in der du ablesen kannst, welche Schwellwerte der Computer untersucht hat. Es ist faszinierend wie Schnell der Computer den besten Schwellwert findet.
</div>
%% Cell type:markdown id: tags:
<div class="panel panel-info">
<div class="panel-heading">
<b>Aufgabe - Was siehst Du jetzt?</b>
</div>
<div class="panel-body">
Wie viele Lebensmittel werden mit Deinem Schwellenwert richtig klassifiziert? <p>
Wie viele werden falsch klassifiziert?<p>
Probier noch einmal einen anderen Schwellenwert aus und vergleiche, welcher besser ist!
</div>
</div>
%% Cell type:code id: tags:
``` python
def datensplit(Schwellwert, automatisch):
Kriterium = 'misclassification_error'
Zielvariable = 'Label'
try:
df_lebensmittel_label = label_widget.result[0].copy()
df_lebensmittel_label = df_lebensmittel_label[df_lebensmittel_label['Label']!='beiseite legen']
tree = ct.DecisionTree(data = df_lebensmittel_label, target = Zielvariable, crit = Kriterium)
if automatisch:
doc = tree.manual_split(attribute = merkmal_widget.result, doc = True)
else:
tree.manual_split(attribute = merkmal_widget.result, threshold = Schwellwert, doc = True)
tree.print_tree()
display(tree.tree_graph)
if automatisch:
df_uebersicht = pd.DataFrame()
df_uebersicht['Merkmal'] = doc['Attribute']
df_uebersicht['Schwellwert'] = doc['Threshold']
df_uebersicht['Fehlklassifikationen'] = (min(tree.tree_nodes[1].subset['Label'].value_counts().sort_index().tolist()) - doc['Criterion'] * len(df_lebensmittel_label)).astype(int)
display(df_uebersicht)
print('Korrekt Klassifikationen:',int((tree.prediction_accuracy(df_lebensmittel_label))*len(tree.tree_nodes[1].subset)),' \n')
print('Fehlklassifikationen',int((1-(tree.prediction_accuracy(df_lebensmittel_label)))*len(tree.tree_nodes[1].subset)),' \n')
return tree
except:
print('FEHLER')
print('Die Label sind noch nicht korrekt eingetragen.')
print('Wähle die Label oben aus und bestätige mit dem Button: "Label Eintragen"')
def merkmal(Merkmal):
split_widget = interactive(datensplit,{'manual': True, 'manual_name': 'Erstelle Split'}, Schwellwert = (label_widget.result[0][Merkmal].value_counts().sort_index().index.min()+0.1,label_widget.result[0][Merkmal].value_counts().sort_index().index.max()-0.1,0.1),automatisch = False)
display(split_widget)
return Merkmal
merkmal_widget = interactive(merkmal, Merkmal = df_lebensmittel.columns)
merkmal_widget
```
%% Cell type:markdown id: tags:
# Entscheidungsbaum automatisch erstellen lassen
%% Cell type:markdown id: tags:
<div class="panel panel-success">
<div class="panel-heading">
<b> Eklärungtext </b>
</div>
<div class="panel-body">
Jetzt übernimmt der Computer die ganze Arbeit. Das sortieren und auswählen der Schwellwerte passiert ganz automatisch, indem der Computer als Möglichkeiten testet.
</div>
%% Cell type:markdown id: tags:
<div class="panel panel-info">
<div class="panel-heading">
<b>Aufgabe - Die Anzahl der Stufen verändern</b>
</div>
<div class="panel-body">
Las automatisch einen Entscheidungsbaum erstellen. Du kannst dem Computer dabei noch sagen, wie viele Stufen der Entscheidungsbaum haben soll. <p><p>
Probier mal aus, wie der Baum aussieht, wenn Du verschiedene Tiefen einstellst.
</div>
</div>
%% Cell type:code id: tags:
``` python
def grow_tree( Max_Stufen):
try:
Kriterium = 'misclassification_error'
Zielvariable = 'Label'
df_lebensmittel_label = label_widget.result[0].copy()
df_lebensmittel_label = df_lebensmittel_label[df_lebensmittel_label['Label']!='beiseite legen']
tree = ct.DecisionTree(data = df_lebensmittel_label, target = Zielvariable, crit = Kriterium)
tree.grow_tree(max_depth = Max_Stufen-1)
tree.print_tree()
display(tree.tree_graph)
print('Korrekt Klassifikationen:',int((tree.prediction_accuracy(df_lebensmittel_label))*len(tree.tree_nodes[1].subset)),' \n')
print('Fehlklassifikationen',int(round((1-(tree.prediction_accuracy(df_lebensmittel_label)))*len(tree.tree_nodes[1].subset),2)),' \n')
print ('\n Super, du hast den Computer einen Entscheidungsbaum erstellen lassen!')
return tree
except:
print('FEHLER')
print('Die Label sind noch nicht korrekt eingetragen.')
print('Wähle die Label oben aus und bestätige mit dem Button: "Label Eintragen"')
tree_widget = interactive(grow_tree,{'manual': True, 'manual_name': 'Erstelle Baum'}, Max_Stufen=(1,6,1) )
tree_widget
```
%% Cell type:markdown id: tags:
# Testdaten
%% Cell type:markdown id: tags:
<div class="panel panel-success">
<div class="panel-heading">
<b> Eklärungtext - Ist der Baum gut? </b>
</div>
<div class="panel-body">
Hier kannst du den Entscheidungsbaum anwenden und testen. Wähle dazu ein Lebensmittel aus, das durch den Entscheidungsbaum klassifiziert werden soll.
</div>
%% Cell type:code id: tags:
``` python
def test(Lebensmittel):
try:
df_lebensmittel_label = label_widget.result[1].copy()
print('Nährwerte von ' + Lebensmittel)
display(df_lebensmittel_label.loc[Lebensmittel])
try:
print('Der Entscheidungsbaum klassifiziert das Lebensmittel ' + Lebensmittel + ' als:')
display(tree_widget.result.query(df_lebensmittel_label.loc[Lebensmittel]))
except:
print('FEHLER')
print('Es wurde noch kein Entscheidungsbaum erstellt')
print('Wähle lass weiter oben automatisch einen Entscheidungsbaum erstellen.')
#print('Korrekt Klassifikationen:',int((tree.prediction_accuracy(df_lebensmittel_label))*len(tree.tree_nodes[1].subset)),' \n')
#print('Fehlklassifikationen',int((1-(tree.prediction_accuracy(df_lebensmittel_label)))*len(tree.tree_nodes[1].subset)),' \n')
#return tree
except:
print('FEHLER')
print('Die Label sind noch nicht korrekt eingetragen.')
print('Wähle die Label oben aus und bestätige mit dem Button: "Label Eintragen"')
test_widget = interactive(test,{'manual': True, 'manual_name': 'Klassifiziere'}, Lebensmittel=df_lebensmittel.index)
test_widget
```
%% Cell type:code id: tags:
``` python
```
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment