Wiki/fhtw-bif04-ss2018/mle-se/20180307_exercise.md
2018-03-06 16:45:37 +01:00

149 lines
4 KiB
Markdown

## Angabe
### Allgemein:
Implementieren Sie einen Klassifizierer mittels k -Nearest -Neighbor Algorithmus. Sie können dafür Java oder C# als Sprache auswählen und dürfen keine Machine Learning Frameworks ver wenden. Messen Sie jeweils die Zeit für jeweils 1000 , 10.000 oder 100.000 Klas sifizierungen (also ohne Einlesen der Daten, Lernen etc.). Teilen Sie die Daten jeweils in Lern- und Test Daten. Verwenden Sie dafür ein beliebiges Validation Verfahren, erstellen Sie eine Confusion Matrix und berechnen Sie die Accuracy für Ihren Algorithmus. Achten Sie bei der Implementierung, dass Sie konkret dieses Beispiel lösen. Sie müssen keine allgemeine, wiederverwendbare Lösung implementieren, die auch für andere Dat en verwendet werden kann. Abzugeben ist ein einseitiger Bericht im PDF Format mit den gemessenen Zeiten und den Confusion Matri zen. Beim Prüfungsgespräch ist auch der Code zu erklären.
### Variante 1:
Daten zu den Iris -Blumen aus https://archive.ics.uci.edu/ml/datasets/Iris .
### Variante 2:
Daten zur Weinqualität aus https://archive.ics.uci.edu/ml/datasets/Wine+Quality , Rot -, oder Weißwein
### Zusatzaufgabe (Optional):
Erstellen Sie zunächst ein Framework für den kNN Algorithmus und implementieren Sie Klassen, die auch für andere Daten zum Einsatz kommen können.
```python
# Imports
%matplotlib inline
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import urllib.request
import random
```
## Iris Blumen
Attribute Information:
1. sepal length in cm
2. sepal width in cm
3. petal length in cm
4. petal width in cm
5. class:
- Iris Setosa
- Iris Versicolour
- Iris Virginica
```python
# Fetch data
url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/bezdekIris.data'
response = urllib.request.urlopen(url)
respbytes = response.read()
resptext = str(respbytes, 'utf8')
```
```python
resptext
```
```python
# Parse data
lines = resptext.split('\n')
data = [[
float(line.split(',')[0]),
float(line.split(',')[1]),
float(line.split(',')[2]),
float(line.split(',')[3]),
line.split(',')[4]]
for line
in lines
if len(line.split(',')) == len(head)]
```
```python
data_setosa = [row for row in data if row[4] == 'Iris-setosa']
data_versicolor = [row for row in data if row[4] == 'Iris-versicolor']
data_virginica = [row for row in data if row[4] == 'Iris-virginica']
```
* x: Sepal Length
* y: Sepal Width
```python
plt.scatter([x[0] for x in data_setosa], [y[1] for y in data_setosa])
plt.scatter([x[0] for x in data_versicolor], [y[1] for y in data_versicolor])
plt.scatter([x[0] for x in data_virginica], [y[1] for y in data_virginica])
```
* x: Pedal Length
* y: Pedal Width
```python
plt.scatter([x[2] for x in data_setosa], [y[3] for y in data_setosa])
plt.scatter([x[2] for x in data_versicolor], [y[3] for y in data_versicolor])
plt.scatter([x[2] for x in data_virginica], [y[3] for y in data_virginica])
```
```python
TEST_SAMPLE_SIZE = 5
data_setosa = random.sample(data_setosa, len(data_setosa))
data_versicolor = random.sample(data_versicolor, len(data_versicolor))
data_virginica = random.sample(data_virginica, len(data_virginica))
test_sample = data_setosa[:TEST_SAMPLE_SIZE] + data_versicolor[:TEST_SAMPLE_SIZE] + data_virginica[:TEST_SAMPLE_SIZE]
training_sample = data_setosa[TEST_SAMPLE_SIZE:] + data_versicolor[TEST_SAMPLE_SIZE:] + data_virginica[TEST_SAMPLE_SIZE:]
```
## Weinqualität
```python
# Fetch data
url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-white.csv'
response = urllib.request.urlopen(url)
respbytes = response.read()
resptext = str(respbytes, 'utf8')
```
```python
# Parse data
lines = resptext.split('\n')
head = lines[0].replace('"', '').split(';')
data = [[
float(val)
for val
in line.split(';')]
for line
in lines[1:]
if len(line.split(';')) == len(head)]
for i in range(0, len(head)):
print(i, head[i])
```
```python
plt.scatter([x[11] for x in data], [y[0] for y in data])
```