Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
efinf:blcks2017:bigdatab:start [2018/03/01 08:33] Simon Knaus |
efinf:blcks2017:bigdatab:start [2018/03/08 07:54] (current) Simon Knaus |
||
---|---|---|---|
Line 468: | Line 468: | ||
* Algorithmus mit weniger Trainingsdaten / Testdaten testen. Laufzeit!! | * Algorithmus mit weniger Trainingsdaten / Testdaten testen. Laufzeit!! | ||
* Klassifikationsgüte allenfalls mit eigener Schlaufe über verschiedene $k$ automatisiert ausrechnen | * Klassifikationsgüte allenfalls mit eigener Schlaufe über verschiedene $k$ automatisiert ausrechnen | ||
+ | * Bild beschneiden, | ||
=== Zusatzinfos === | === Zusatzinfos === | ||
Line 592: | Line 593: | ||
=== Ziele === | === Ziele === | ||
+ | * Jeder kann die zentralen Begriffen erklären / beschreiben (-> | ||
* kNN mit Python und Scikit durchführen | * kNN mit Python und Scikit durchführen | ||
- | * Jeder kann die zentralen Begriffen erklären / beschreiben (-> | + | * Eigene Ziffer als GIF klassifizieren oder Random Forests durchführen |
+ | === Aufträge === | ||
+ | * Bei installiertem Python 2.7. die notwendigen Module installieren (siehe [[# | ||
+ | * kNN in Python durchführen, | ||
+ | * Wer soweit durch: | ||
+ | * Eigene Ziffer als GIF klassifizieren mit der Funktion '' | ||
+ | * Random Forests durchführen und Klassifikationsgüte mit kNN vergleichen | ||
+ | * kNN für verschiedene '' | ||
=== Zusatzhintergrund Python === | === Zusatzhintergrund Python === | ||
- | Um mit bereits implementierten Methoden von [[http:// | + | Um mit bereits implementierten Methoden von [[http:// |
== Navigation zu PIP == | == Navigation zu PIP == | ||
Line 604: | Line 613: | ||
* Im DOS-Prompt (Windows + R -> cmd) zum Verzeichnis navigieren mit '' | * Im DOS-Prompt (Windows + R -> cmd) zum Verzeichnis navigieren mit '' | ||
* Dann '' | * Dann '' | ||
+ | |||
+ | < | ||
+ | pip install numpy | ||
+ | pip install scipy | ||
+ | pip install sklearn | ||
+ | pip install imageio | ||
+ | </ | ||
+ | |||
+ | Ein wichtiges Konstrukt sind sogenannte numpy-Arrays: | ||
+ | |||
+ | <code python> | ||
+ | data = array([[2, | ||
+ | #zugriff via Zeile/ | ||
+ | data[0,1] | ||
+ | data[1,1] | ||
+ | # fuer trainingsdaten | ||
+ | trainingdata[0, | ||
+ | trainingdata[4, | ||
+ | trainingsdata[0,: | ||
+ | </ | ||
+ | === kNN in Python === | ||
+ | Nachher kann relativ einfach mit Python kNN implementiert werden: | ||
+ | <code python knn_scikit.py> | ||
+ | # | ||
+ | # -*- coding: utf-8 -*- | ||
+ | from sklearn.neighbors import KNeighborsClassifier | ||
+ | from sklearn.metrics import confusion_matrix | ||
+ | from numpy import genfromtxt, | ||
+ | from imageio import imread | ||
+ | # Trainingdaten einlesen | ||
+ | |||
+ | trainingdata = genfromtxt(' | ||
+ | |||
+ | # Testdaten einlesen | ||
+ | |||
+ | testdata = genfromtxt(' | ||
+ | |||
+ | # Trainingsfeatures und -klassen trennen. | ||
+ | # Kolonne 0:255: Features, Kolonne 256 Klasse | ||
+ | # Fuer Ekrlaerung der Syntax siehe: https:// | ||
+ | train_digits_features = trainingdata[:, | ||
+ | train_digits_class = trainingdata[:, | ||
+ | |||
+ | # Testfeatures und -klassen trennen. | ||
+ | test_digits_features = testdata[:, :-1] | ||
+ | test_digits_class = testdata[:, -1] | ||
+ | |||
+ | # kNN initilisieren mit 5 Nachbarn | ||
+ | knn = KNeighborsClassifier(n_neighbors=5) | ||
+ | |||
+ | # kNN traininieren | ||
+ | knn.fit(train_digits_features, | ||
+ | |||
+ | # Vorhersage | ||
+ | predicted_class = knn.predict(test_digits_features) | ||
+ | |||
+ | # Wahre Test digits ausgeben | ||
+ | print(test_digits_class) | ||
+ | |||
+ | # Predicted Test digits ausgeben | ||
+ | print(predicted_class) | ||
+ | |||
+ | ## Vergleichen und Klassifikationsguete berechnen. | ||
+ | ## Differenz muss = 0 sein wenn richtig klassifziert. Boolsche Variablen koennen summiert werden. | ||
+ | |||
+ | print sum(predicted_class - test_digits_class == 0) / float(len(predicted_class)) | ||
+ | |||
+ | ## Konfusionsmatrix berechnen | ||
+ | mat_knn = confusion_matrix(test_digits_class, | ||
+ | print(mat_knn) | ||
+ | |||
+ | # Aquivalent der Funktion getPixelListFromFilePath | ||
+ | def getPixelArrayFromFilePath(filepath): | ||
+ | img = imread(filepath) | ||
+ | return(asarray(((img.flatten()/ | ||
+ | |||
+ | |||
+ | |||
+ | getPixelArrayFromFilePath(" | ||
+ | print(knn.predict(getPixelArrayFromFilePath(" | ||
+ | |||
+ | </ | ||
+ | === Implementierung von Random Forests === | ||
+ | <code python knn_rf_scikit.py> | ||
+ | # | ||
+ | # -*- coding: utf-8 -*- | ||
+ | |||
+ | from sklearn.neighbors import KNeighborsClassifier | ||
+ | from numpy import genfromtxt, asarray, sum | ||
+ | from sklearn.metrics import confusion_matrix | ||
+ | from sklearn.ensemble import RandomForestClassifier | ||
+ | |||
+ | ####################################################################### | ||
+ | # | ||
+ | # Daten einlesen. Für Random Forests (rf) und k-Nearest-Neighbors (knn) | ||
+ | # | ||
+ | ####################################################################### | ||
+ | |||
+ | |||
+ | # Trainingdaten einlesen | ||
+ | |||
+ | trainingdata = genfromtxt(' | ||
+ | |||
+ | # Testdaten einlesen | ||
+ | |||
+ | testdata = genfromtxt(' | ||
+ | |||
+ | # Trainingsfeatures und -klassen trennen. | ||
+ | # Kolonne 0:255: Features, Kolonne 256 Klasse | ||
+ | # Fuer Ekrlaerung der Syntax siehe: | ||
+ | # https:// | ||
+ | train_digits_features = trainingdata[: | ||
+ | train_digits_class = trainingdata[: | ||
+ | |||
+ | # Testfeatures und - klassen trennen. | ||
+ | test_digits_features = testdata[: , : -1] | ||
+ | test_digits_class = testdata[: , -1] | ||
+ | |||
+ | ####################################################################### | ||
+ | # | ||
+ | # kNN trainieren, vorhersagen und evaluieren. | ||
+ | # | ||
+ | ####################################################################### | ||
+ | |||
+ | |||
+ | #kNN initilisieren mit 10 Nachbarn | ||
+ | knn = KNeighborsClassifier(n_neighbors = 10) | ||
+ | |||
+ | # kNN traininieren | ||
+ | knn.fit(train_digits_features, | ||
+ | |||
+ | # Vorhersage | ||
+ | predicted_class_knn = knn.predict(test_digits_features) | ||
+ | |||
+ | # Konfusionsmatrix | ||
+ | mat_knn = confusion_matrix(test_digits_class, | ||
+ | print(mat_knn)# | ||
+ | guete_knn = sum(mat_knn.diagonal()) / float(sum(mat_knn)) | ||
+ | print "Guete kNN:", guete_knn | ||
+ | |||
+ | |||
+ | ####################################################################### | ||
+ | # | ||
+ | # Random Forests trainieren, vorhersagen und evaluieren. | ||
+ | # | ||
+ | ####################################################################### | ||
+ | |||
+ | rf = RandomForestClassifier(n_estimators = 200, random_state = 17) | ||
+ | rf.fit(train_digits_features, | ||
+ | predicted_class_rf = rf.predict(test_digits_features) | ||
+ | |||
+ | mat_rf = confusion_matrix(test_digits_class, | ||
+ | print(mat_rf) | ||
+ | |||
+ | # Güte | ||
+ | guete_rf = sum(mat_rf.diagonal()) / float(sum(mat_rf)) | ||
+ | print "Guete rf:", guete_rf | ||
+ | </ | ||
+ | |||
Line 704: | Line 872: | ||
</ | </ | ||
+ | |||
==== L7 ==== | ==== L7 ==== | ||
Line 788: | Line 957: | ||
print "Guete rf:", guete_rf | print "Guete rf:", guete_rf | ||
</ | </ | ||
+ | |||
==== L8 ==== | ==== L8 ==== | ||
Prüfung und ANN | Prüfung und ANN | ||
- | --> | + | |
- | <!-- | + | |
=== Evaluation === | === Evaluation === | ||
- | * {{efinf: | + | * {{efinf: |
* [[https:// | * [[https:// | ||
Line 803: | Line 973: | ||
=== Feedback === | === Feedback === | ||
https:// | https:// | ||
- | --> | + |