efinf:blcks2017:bigdatab:start

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
efinf:blcks2017:bigdatab:start [2018/03/01 07:51]
Simon Knaus
efinf:blcks2017:bigdatab:start [2018/03/08 07:54] (current)
Simon Knaus
Line 463: Line 463:
   * Klassifikationsgüte für verschiedene $k$ ausrechnen   * Klassifikationsgüte für verschiedene $k$ ausrechnen
   * Konfusionsmatrix berechnen für ein bestimmtes $k$   * Konfusionsmatrix berechnen für ein bestimmtes $k$
 +  * Flaschenhals kNN verstehen: Dimensionen, Anzahl Pixel, Farben, Sortierung
  
 === Tipps === === Tipps ===
   * 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
-<hidden Loesung+  * Bild beschneiden, Graustufen etc. [[http://www.irfanview.de/|IrfanView]] 
-<code python convertimagetopixellist.py>+ 
 +=== Zusatzinfos ===  
 +Sortieren ist kostspielig:  Einfache Sortieralgorithmen ([[https://visualgo.net/bn/sorting|BubbleSort]]) haben eine Komplexität von $\mathcal O(n^2)$, d.h., es werden ca. $n^2$ Operationen benötigt um $n$ Elemente zu sortieren. 
 +<hidden Lösung
 +<code python knn_bilder.py>
  
 import gpanel  #um bilder einzulesen import gpanel  #um bilder einzulesen
Line 585: Line 590:
 </code> </code>
 </hidden> </hidden>
 +====  L7 ====
 +
 +=== Ziele ===
 +  * Jeder kann die zentralen Begriffen erklären / beschreiben (->{{efinf:blcks2017:bigdatab:slides20180306.pdf|Slides}})
 +  * kNN mit Python und Scikit durchführen
 +  * Eigene Ziffer als GIF klassifizieren oder Random Forests durchführen
 +
 +=== Aufträge ===
 +  * Bei installiertem Python 2.7. die notwendigen Module installieren (siehe [[#Zusatzhintergrund Python]])
 +  * kNN in Python durchführen, siehe [[#kNN in Python|knn_scikit.py]]
 +  * Wer soweit durch:
 +    * Eigene Ziffer als GIF klassifizieren mit der Funktion ''getPixelArrayFromFilePath(filepath)''
 +    * Random Forests durchführen und Klassifikationsgüte mit kNN vergleichen
 +    * kNN für verschiedene ''$k$'' und Random Forests für verschieden ''n_estimators'' durchführen. Beides sind sogenannte "Tunig-Parameter", welche die Klassifikationsgüte beinflussen. Frage: Wie könnte ein optimales $k$ bestimmt werden?
 +
 +
 +=== Zusatzhintergrund Python ===
 +Um mit bereits implementierten Methoden von [[http://scikit-learn.org/stable/|scikit]] zu arbeiten, müssen zusätzlich die Module **numpy**, **scipy** und **sklearn** installiert werden. Dies geschieht am besten, auf der Kommandozeile / Konsole mit ''pip''. Vorgänging muss bereits [[https://www.python.org/downloads/release/python-2714/|Python (2.7)]] installiert sein:
 +
 +== Navigation zu PIP ==
 +  * Pfad aus Explorer kopieren, üblicherweise ''C:\Python27\Scripts''
 +  * Im DOS-Prompt (Windows + R -> cmd) zum Verzeichnis navigieren mit ''cd C:\Python27\Scripts''
 +  * Dann ''pip install ...'' und die Modulnamen
 +
 +<code>
 +pip install numpy
 +pip install scipy
 +pip install sklearn
 +pip install imageio
 +</code>
 +
 +Ein wichtiges Konstrukt sind sogenannte numpy-Arrays: Diese sind grundsätzlich der Python (geschachtelten) Liste sehr ähnlich, sind aber im Umang viel praktischer. Mehr Details gibt's z.B. [[http://www.scipy-lectures.org/intro/numpy/array_object.html|hier]] und [[https://docs.scipy.org/doc/numpy-1.13.0/reference/arrays.indexing.html|hier]]. Das wichtigste dabei ist wohl, wie auf Elemente zugegriffen werden kann und wie Teilmengen von diesen gebildet werden können:
 +
 +<code python>
 +data = array([[2,3],[3,4]])
 +#zugriff via Zeile/Spalte:
 +data[0,1]
 +data[1,1]
 +# fuer trainingsdaten
 +trainingdata[0,256] # die Zahl des ersten Bildes
 +trainingdata[4,2] # den Wert des dritten Pixel des 5 Bildes
 +trainingsdata[0,:] # alle Werte inkl. Zahl des ersten Bildes.
 +</code>
 +=== kNN in Python === 
 +Nachher kann relativ einfach mit Python kNN implementiert werden:
 +<code python knn_scikit.py>
 +#!/usr/bin/python
 +# -*- coding: utf-8 -*-
 +from sklearn.neighbors import KNeighborsClassifier
 +from sklearn.metrics import confusion_matrix
 +from numpy import genfromtxt,asarray 
 +from imageio import imread
 +# Trainingdaten einlesen
 + 
 +trainingdata = genfromtxt('C:/temp/digits/digitsdata.csv', delimiter=',')
 + 
 +# Testdaten einlesen
 + 
 +testdata = genfromtxt('C:/temp/digits/digitsdatatest.csv', delimiter=',')
 + 
 +# Trainingsfeatures und -klassen trennen.
 +# Kolonne 0:255: Features, Kolonne 256 Klasse
 +# Fuer Ekrlaerung der Syntax siehe: https://docs.scipy.org/doc/numpy-1.13.0/reference/arrays.indexing.html
 +train_digits_features = trainingdata[:, :-1]
 +train_digits_class = trainingdata[:, -1]
 + 
 +# 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, train_digits_class)
 + 
 +# 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, predicted_class)
 +print(mat_knn)
 +
 +# Aquivalent der Funktion getPixelListFromFilePath
 +def getPixelArrayFromFilePath(filepath):
 +    img = imread(filepath)
 +    return(asarray(((img.flatten()/float(255)*2-1).reshape(1,-1))))
 +
 +
 +
 +getPixelArrayFromFilePath("C:/temp/digits/test/testimg_181710187299_0_.gif")
 +print(knn.predict(getPixelArrayFromFilePath("C:/temp/digits/test/testimg_181710187299_0_.gif")))
 +
 +</code>
 +=== Implementierung von Random Forests ===
 +<code python knn_rf_scikit.py>
 +#!/usr/bin/python
 +# -*- 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('C:/temp/digits/digitsdata.csv', delimiter = ',')
 +
 +# Testdaten einlesen
 +
 +testdata = genfromtxt('C:/temp/digits/digitsdatatest.csv', delimiter = ',')
 +
 +# Trainingsfeatures und -klassen trennen.
 +# Kolonne 0:255: Features, Kolonne 256 Klasse
 +# Fuer Ekrlaerung der Syntax siehe:
 +# https://docs.scipy.org/doc/numpy-1.13.0/reference/arrays.indexing.html
 +train_digits_features = trainingdata[: , : -1]
 +train_digits_class = trainingdata[: , -1]
 +
 +# 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, train_digits_class)
 +
 +# Vorhersage
 +predicted_class_knn = knn.predict(test_digits_features)
 +
 +# Konfusionsmatrix
 +mat_knn = confusion_matrix(test_digits_class, predicted_class_knn)
 +print(mat_knn)# Güte
 +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, train_digits_class)
 +predicted_class_rf = rf.predict(test_digits_features)
 +
 +mat_rf = confusion_matrix(test_digits_class, predicted_class_rf)
 +print(mat_rf)
 +
 +# Güte
 +guete_rf = sum(mat_rf.diagonal()) / float(sum(mat_rf))
 +print "Guete rf:", guete_rf
 +</code>
 +
 +
  
 <!-- <!--
Line 684: Line 872:
  
 </code> </code>
 +
  
 ==== L7 ====  ==== L7 ==== 
Line 768: Line 957:
 print "Guete rf:", guete_rf print "Guete rf:", guete_rf
 </code> </code>
 +
 ==== L8 ====  ==== L8 ==== 
 Prüfung und ANN Prüfung und ANN
---> + 
-<!--+
 === Evaluation === === Evaluation ===
-  * {{efinf:blcks2017:bigdata:exam.zip|Daten für die Prüfung}}. Die Daten sind im üblichen Format. Anstelle der Ziffer steht an der letzten Stelle eine '-99'.+  * {{efinf:blcks2017:bigdatab:exam.zip|Daten für die Prüfung}}. Die Daten sind im üblichen Format. Anstelle der Ziffer steht an der letzten Stelle eine '-99'.
   * [[https://forms.office.com/Pages/ResponsePage.aspx?id=vUGvXYwzEUOxsOEpmInDS12XSwf-80xHjgGMQjpEmz9UMzhYQTZIRTdSS0hRTVpPVlJUNzJOQzU3My4u|Formular zur Abgabe der Testcases]]   * [[https://forms.office.com/Pages/ResponsePage.aspx?id=vUGvXYwzEUOxsOEpmInDS12XSwf-80xHjgGMQjpEmz9UMzhYQTZIRTdSS0hRTVpPVlJUNzJOQzU3My4u|Formular zur Abgabe der Testcases]]
  
Line 783: Line 973:
 === Feedback === === Feedback ===
 https://forms.office.com/Pages/ResponsePage.aspx?id=vUGvXYwzEUOxsOEpmInDS12XSwf-80xHjgGMQjpEmz9UQzJGV1gxMkFHRFJVNDdWWkc4RDMwU1Q4Mi4u https://forms.office.com/Pages/ResponsePage.aspx?id=vUGvXYwzEUOxsOEpmInDS12XSwf-80xHjgGMQjpEmz9UQzJGV1gxMkFHRFJVNDdWWkc4RDMwU1Q4Mi4u
--->+
  • efinf/blcks2017/bigdatab/start.1519887066.txt.gz
  • Last modified: 2018/03/01 07:51
  • by Simon Knaus