Uczenie maszynowe i sztuczne sieci neuronowe/SVM2

Z Brain-wiki

Uczenie_maszynowe_i_sztuczne_sieci_neuronowe_cw/SVM2

W tym ćwiczeniu zapoznamy się z klasyfikację za pomocą SVM, w przypadku gdy trzeba wybrać spośród więcej niż 2 klas. Opisane poniżej podejście można wykorzystać dla dowolnych klasyfikatorów binarnych, które chcemy zastosować w przypadku wieloklasowym. Załóżmy, że mamy problem z podziałem na N_klas. Generalnie w takiej sytuacji możliwe są dwa podejścia:

one-versus-one ('ovo')
tworzonych jest N_klas * (N_klas -1)/2 klasyfikatorów i każdy trenowany jest dla rozróżniania innej pary klas. Każdy z klasyfikatorów "głosuje" za jedną z dwóch klas. Wygrywa klasa, która uzyska najwięcej głosów.
one-versus-rest 
tworzonych jest N_klas klasyfikatorów, każdy trenowany jest do rozróżniania danej klasy od wszystkich pozostałych. Wygrywa ten, który daje najwyższy poziom ufności co do swojej decyzji.

Czasem (np. w scikit-learn) dodawana jest jeszcze znormalizowana suma poziomów ufności - zmniejsza to szansę na powstawanie sytuacji, kiedy więcej niż jedna klasa ma taki sam wynik głosowania.

Probem, którym się zajmiemy to rozpoznawanie ręcznie pisanych cyfr. Pierwszą rzeczą z jaką musimy sobie poradzić to reprezentacja cyfr tak aby dało się z nich zbudować ciąg uczący.

W surowej postaci dostalibyśmy obrazek, tzn. macierz pikseli [math] n \times m[/math]. W naszym przypadku pierwotne obrazki były skanowane i rozdzielane na poszczególne cyfry przez otaczanie każdej cyfry pudełkiem centrowanym na środku masy piksli, a nastepnie znormalizowane do rozmiarów [math]20 \times 20 [/math].

Dane z których będziemy korzystać stanowią obrazek przetworzony do formatu jednowymiarowego przez ułżenie kolejnych wierszy. Dane te pochodzą z bazy danych ręcznie pisanych cyfr MNIST (http://yann.lecun.com/exdb/mnist/).

W pliku: cyfry.mat jest dostępna wersja matlabowa tych danych. Proszę zapisać wskazywany plik w katalogu roboczym. Poniższy kod umożliwia zapoznanie się z tym zbiorem danych.

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt
import numpy as np
from sklearn.metrics import classification_report, confusion_matrix, f1_score
from sklearn import tree
from sklearn.cross_validation import train_test_split
from scipy.io import loadmat


###############################################################################
# podglądanie obrazków cyfr
# funkcja pomocnicza 
#
def plot_gallery(images, titles, h, w, n_row=3, n_col=4):
    plt.figure(figsize=(1.8 * n_col, 2.4 * n_row))
    plt.subplots_adjust(bottom=0, left=.01, right=.99, top=.90, hspace=.05)
    for i in range(n_row * n_col):
        plt.subplot(n_row, n_col, i + 1)
        plt.imshow(images[i].reshape((h, w)).T, cmap=plt.cm.gray)
        plt.title(titles[i], size=12)
        plt.xticks(())
        plt.yticks(())


###############################################################################
# wczytywanie danych
dane = loadmat('cyfry.mat')
#przepisanie danych do osobnych tablic:
X = dane['X']
y = dane['y']
for i in range(X.shape[0]):
    X[i,:] = X[i,:]/np.std(X[i,:])
y[np.where(y==10)]=0 # przekodoeanie cyfry 0 tak, żeby w wektorze y też odpowiadąło jej 0 (w oryginalnym zbiorze danych było 10)

# wysokość i szerokość obrazka z cyfrą 
h = 20
w = 20

###############################################################################
# Wypisz dane o zbiorze cyfr 
print("dane zawierają %d cyfr po %d pixli" % (X.shape[0], X.shape[1]))

# Pokaż kilka przykładowych cyfr:
plot_gallery(X[0:5000:200,:], y[0:5000:200], h, w, n_row=5, n_col=5)
plt.show()

Dalszą część rozwiązania proszę zaimplementować w oparciu o dokumentację: http://scikit-learn.org/stable/modules/svm.html

Należy wykonać następujące kroki:

  • podzielić zbiór na dane testowe i treningowe w proporcji 5:1, można użyć: http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.train_test_split.html, lub napisać własny kod do dzielenia
  • stworzyć instancję klasyfikatora SVC, można tu wybrać różne funkcje jądra i parametr regularyzacji
  • nauczyć klasyfikator na danych treningowych
  • zbadań macierz pomyłek (confusion matrix) i raport klasyfikacji dla różnych funkcji jądrowych i różnych parametrów regularyzacji

Uczenie_maszynowe_i_sztuczne_sieci_neuronowe_cw/SVM2