Uczenie maszynowe i sztuczne sieci neuronowe/Wybor cech: Różnice pomiędzy wersjami

Z Brain-wiki
 
(Nie pokazano 3 pośrednich wersji utworzonych przez tego samego użytkownika)
Linia 3: Linia 3:
 
W uczeniu maszynowym dopasowywane modele są opisywane przez pewną liczbę parametrów. Regułą jest, że estymując parametry powinniśmy dysponowac zbiorem uczącym którego liczebność przekracza co najmniej kilkukrotnie liczbę parametrów. Przydatne są zatem techniki wybierania optymalnych cech, które są informatywne dla klasyfikacji i jednocześnie nie są redundantne (nie powtarzają tych samych informacji).
 
W uczeniu maszynowym dopasowywane modele są opisywane przez pewną liczbę parametrów. Regułą jest, że estymując parametry powinniśmy dysponowac zbiorem uczącym którego liczebność przekracza co najmniej kilkukrotnie liczbę parametrów. Przydatne są zatem techniki wybierania optymalnych cech, które są informatywne dla klasyfikacji i jednocześnie nie są redundantne (nie powtarzają tych samych informacji).
  
Na tych zajęciach zapoznamy się z dwiema technikami:
+
Na tych zajęciach zapoznamy się z techniką '''rangowanie cech z rekursywną eliminacją''' bazującą na wagach przypisanych cechom przy dopasowaniu modelu.  Najpierw model dopasowywany jest z wykorzystaniem wszystkich cech. Następnie do każdej z cech przypisane są wagi.  Cechy odpowiadające najmniejszym bezwzględnym wartościom współczynników są  usuwane z przykładów w ciągu uczącym. Dopasowanie modelu jest powtarzane dla tak "przyciętego" ciągu uczącego. Np. współczynniki w modelu liniowym: wektor cech <math>X=[x_1,x_2, x_3]^T</math> wektor współczynników <math>A = [a_1, a_2, a_3]</math> i hipoteza <math>h=  A^T X</math>. Jeśli <math>a_2</math> jest znacząco mniejszy niż <math>a_1</math> i <math>a_3</math>, to cechy <math>x_2</math> można usunąć z wektorów w ciągu uczącym, bo nie niosą ważnych informacji, ich obecność nie wpływa bardzo na wartość hipotezy. Oczywiście, żeby to rozumowanie było prawidłowe zakresy zmienności wszystkich cech powinny być porównywalne. (implementacja w http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.RFE.html#sklearn.feature_selection.RFE  
; rangowanie cech z rekursywną eliminacją i kross-walidacją: (Implementacja w http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.RFECV.html#sklearn.feature_selection.RFECV)
+
Proszę zapoznać się z parametrami i atrybutami tej klasy.)
;rangowanie cech z rekursywną eliminacją: bazującą na wagach przypisanych cechom przy dopasowaniu modelu.  Najpierw model dopasowywany jest z wykorzystaniem wszystkich cech. Następnie do każdej z cech przypisane są wagi.  Cechy odpowiadające najmniejszym bezwzględnym wartościom współczynników są  usuwane z przykładów w ciągu uczącym. Dopasowanie modelu jest powtarzane dla tak "przyciętego" ciągu uczącego. Np. współczynniki w modelu liniowym: wektor cech <math>X=[x_1,x_2, x_3]^T</math> wektor współczynników <math>A = [a_1, a_2, a_3]</math> i hipoteza <math>h=  A^T X</math>. Jeśli <math>a_2</math> jest znacząco mniejszy niż <math>a_1</math> i <math>a_3</math>, to cechy <math>x_2</math> można usunąć z wektorów w ciągu uczącym, bo nie niosą ważnych informacji, ich obecność nie wpływa bardzo na wartość hipotezy. Oczywiście, żeby to rozumowanie było prawidłowe zakresy zmienności wszystkich cech powinny być porównywalne. (implementacja w http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.RFE.html#sklearn.feature_selection.RFE)
 
  
 +
=Ćwiczenie=
 +
Spróbujmy zastosować opisana powyżej metodę do wybrania cech dla klasyfikatora SVC i danych z poprzednich zajęć, czyli do zestawu ręcznie pisanych cyfr.
  
 +
Uzupełniamy poniższy kod:
 +
<source lang = python>
 +
# -*- coding: utf-8 -*-
 +
 +
# importujemy biblioteki
 +
from sklearn import svm
 +
from pylab import  show, imshow, subplot, title,cm,axis,matshow,colorbar, plot,figure
 +
import numpy as np
 +
from numpy.random import permutation
 +
from scipy.io import loadmat
 +
from sklearn.metrics import confusion_matrix,  classification_report, f1_score
 +
from sklearn.feature_selection import RFE
 +
 +
# wczytywanie danych
 +
dane = loadmat('cyfry.mat')
 +
m,n = dane['X'].shape #ilość przykładów
 +
 +
# wyłuskujemy dane
 +
X = dane['X']
 +
y = dane['y'].ravel()
 +
 +
#normalizujemy obrazki
 +
for i in range(X.shape[0]):
 +
    X[i,:] = X[i,:]/np.std(X[i,:])
 +
 +
y[np.where(y==10)]=0 # przekodowanie cyfry 0 tak, żeby w wektorze y też odpowiadało jej 0 (w oryginalnym zbiorze danych było 10)
 +
 +
 +
# prezentacja co 50-tej cyfry ze zbioru
 +
for i in range(100):
 +
    subplot(10,10,i+1)
 +
    C = X[50*i,:].reshape(20,20)
 +
    imshow(C.T,cmap=cm.gray)
 +
    axis('off')
 +
    title(str(y[50*i]))
 +
show()
 +
 +
# dzielimy dane na testowe i treningowe w proporcji 1:4
 +
...
 +
 +
# wytwarzamy instancję klasyfikatora SVC z liniowym jądrem i parametrem regularyzacji =1
 +
...
 +
 +
# uczymy klasyfikator na zbiorze treningowym
 +
...
 +
 +
# obliczamy predykcję i miary klasyfikacji dla zbioru testowego
 +
...
 +
 +
# teraz badamy jakość cech
 +
# wytwarzamy instancję obiektu RFE dla naszego modelu, docelową ilością cech będzie 1, krok 5, żeby było widać co się dzieje włączmy verbose = 1
 +
 +
rfe = RFE(...)
 +
# uczymy obiekt rfe
 +
...
 +
 +
# narysujmy rangi
 +
plot(rfe.ranking_) # to co widać to wartość rangi przypisana dla każdego z 400 pixli obrazka. Czym niższa ranga tym bardziej ważny jest dany pixel.
 +
 +
# żeby lepiej sobie wyobrazić jak rozkładają się rangi w różnych rejonach obrazków możemy je przeformatować do rozmiaru obrazka i wyświetlić w skali kolów
 +
figure()
 +
matshow(rfe.ranking_.reshape(20,20))
 +
colorbar()
 +
title("Ranking of pixels with RFE")
 +
show()
 +
 +
# żeby wiedzieć na jakim poziomie odciąć ilość cech dobrze jest posłużyć się miarami jakości predykcji np. F1
 +
# proszę przygotować fragment kodu, który iteracyjnie będzie dopasowywał modele, kolejno do coraz mniejszej liczby optymalnych cech. Dla tak dopasowanych modeli obliczał wybraną miarę i zapamiętywał ją, tak aby po zakończeniu iteracji można było wyświetlić wykres zależności tej miary od ilości cech
 +
...
 +
 +
# po znalezieniu optymalnej liczby cech dopasuj model z tą właśnie ilością cech i wyświetl maskę za pomocą  której wybieramy istotne cechy do klasyfikacji
 +
...
 +
# wyświetl co 50-tą cyfrę wyciętą za pomocą tej maski
 +
...
 +
 +
</source>
 
[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe_cw]]/Wybór cech
 
[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe_cw]]/Wybór cech

Aktualna wersja na dzień 15:24, 25 kwi 2017

Uczenie_maszynowe_i_sztuczne_sieci_neuronowe_cw/Wybór cech

Wstęp

W uczeniu maszynowym dopasowywane modele są opisywane przez pewną liczbę parametrów. Regułą jest, że estymując parametry powinniśmy dysponowac zbiorem uczącym którego liczebność przekracza co najmniej kilkukrotnie liczbę parametrów. Przydatne są zatem techniki wybierania optymalnych cech, które są informatywne dla klasyfikacji i jednocześnie nie są redundantne (nie powtarzają tych samych informacji).

Na tych zajęciach zapoznamy się z techniką rangowanie cech z rekursywną eliminacją bazującą na wagach przypisanych cechom przy dopasowaniu modelu. Najpierw model dopasowywany jest z wykorzystaniem wszystkich cech. Następnie do każdej z cech przypisane są wagi. Cechy odpowiadające najmniejszym bezwzględnym wartościom współczynników są usuwane z przykładów w ciągu uczącym. Dopasowanie modelu jest powtarzane dla tak "przyciętego" ciągu uczącego. Np. współczynniki w modelu liniowym: wektor cech [math]X=[x_1,x_2, x_3]^T[/math] wektor współczynników [math]A = [a_1, a_2, a_3][/math] i hipoteza [math]h= A^T X[/math]. Jeśli [math]a_2[/math] jest znacząco mniejszy niż [math]a_1[/math] i [math]a_3[/math], to cechy [math]x_2[/math] można usunąć z wektorów w ciągu uczącym, bo nie niosą ważnych informacji, ich obecność nie wpływa bardzo na wartość hipotezy. Oczywiście, żeby to rozumowanie było prawidłowe zakresy zmienności wszystkich cech powinny być porównywalne. (implementacja w http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.RFE.html#sklearn.feature_selection.RFE Proszę zapoznać się z parametrami i atrybutami tej klasy.)

Ćwiczenie

Spróbujmy zastosować opisana powyżej metodę do wybrania cech dla klasyfikatora SVC i danych z poprzednich zajęć, czyli do zestawu ręcznie pisanych cyfr.

Uzupełniamy poniższy kod:

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

# importujemy biblioteki 
from sklearn import svm
from pylab import  show, imshow, subplot, title,cm,axis,matshow,colorbar, plot,figure
import numpy as np
from numpy.random import permutation
from scipy.io import loadmat
from sklearn.metrics import confusion_matrix,  classification_report, f1_score
from sklearn.feature_selection import RFE

# wczytywanie danych
dane = loadmat('cyfry.mat')
m,n = dane['X'].shape #ilość przykładów 

# wyłuskujemy dane
X = dane['X']
y = dane['y'].ravel()

#normalizujemy obrazki
for i in range(X.shape[0]):
    X[i,:] = X[i,:]/np.std(X[i,:])

y[np.where(y==10)]=0 # przekodowanie cyfry 0 tak, żeby w wektorze y też odpowiadało jej 0 (w oryginalnym zbiorze danych było 10)


# prezentacja co 50-tej cyfry ze zbioru
for i in range(100):
    subplot(10,10,i+1)
    C = X[50*i,:].reshape(20,20)
    imshow(C.T,cmap=cm.gray)
    axis('off')
    title(str(y[50*i]))
show()

# dzielimy dane na testowe i treningowe w proporcji 1:4
...

# wytwarzamy instancję klasyfikatora SVC z liniowym jądrem i parametrem regularyzacji =1
...

# uczymy klasyfikator na zbiorze treningowym
...

# obliczamy predykcję i miary klasyfikacji dla zbioru testowego
...

# teraz badamy jakość cech
# wytwarzamy instancję obiektu RFE dla naszego modelu, docelową ilością cech będzie 1, krok 5, żeby było widać co się dzieje włączmy verbose = 1

rfe = RFE(...)
# uczymy obiekt rfe
...

# narysujmy rangi 
plot(rfe.ranking_) # to co widać to wartość rangi przypisana dla każdego z 400 pixli obrazka. Czym niższa ranga tym bardziej ważny jest dany pixel. 

# żeby lepiej sobie wyobrazić jak rozkładają się rangi w różnych rejonach obrazków możemy je przeformatować do rozmiaru obrazka i wyświetlić w skali kolów
figure()
matshow(rfe.ranking_.reshape(20,20))
colorbar()
title("Ranking of pixels with RFE")
show()

# żeby wiedzieć na jakim poziomie odciąć ilość cech dobrze jest posłużyć się miarami jakości predykcji np. F1
# proszę przygotować fragment kodu, który iteracyjnie będzie dopasowywał modele, kolejno do coraz mniejszej liczby optymalnych cech. Dla tak dopasowanych modeli obliczał wybraną miarę i zapamiętywał ją, tak aby po zakończeniu iteracji można było wyświetlić wykres zależności tej miary od ilości cech
...

# po znalezieniu optymalnej liczby cech dopasuj model z tą właśnie ilością cech i wyświetl maskę za pomocą  której wybieramy istotne cechy do klasyfikacji
...
# wyświetl co 50-tą cyfrę wyciętą za pomocą tej maski
...

Uczenie_maszynowe_i_sztuczne_sieci_neuronowe_cw/Wybór cech