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/06 12:08]
Simon Knaus
efinf:blcks2017:bigdatab:start [2018/03/08 07:54] (current)
Simon Knaus
Line 593: Line 593:
  
 === Ziele === === Ziele ===
 +  * Jeder kann die zentralen Begriffen erklären / beschreiben (->{{efinf:blcks2017:bigdatab:slides20180306.pdf|Slides}})
   * kNN mit Python und Scikit durchführen   * kNN mit Python und Scikit durchführen
-  * Jeder kann die zentralen Begriffen erklären / beschreiben (->Slides)+  * 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?
  
  
Line 611: Line 619:
 pip install sklearn pip install sklearn
 pip install imageio 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> </code>
  
Line 713: Line 872:
  
 </code> </code>
 +
  
 ==== L7 ====  ==== L7 ==== 
Line 797: 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 812: 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.1520334487.txt.gz
  • Last modified: 2018/03/06 12:08
  • by Simon Knaus