Uczenie maszynowe i sztuczne sieci neuronowe/Wybor cech
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
...