Uczenie maszynowe i sztuczne sieci neuronowe/SVM2: Różnice pomiędzy wersjami
(Utworzono nową stronę "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ęce...") |
m |
||
Linia 4: | Linia 4: | ||
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''. | 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: | 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-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. 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. | + | ;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. | 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. |
Wersja z 17:14, 21 mar 2018
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