ADIUM/L/z2p
From WikiZMSI
[edytuj]
Na zajęciach
- Przygotuj dla danych olivetti jako klasę decyzyjną nową kolumnę wskazującą, czy dana osoba ma na twarzy okulary. Plik z indeksami tych osób (olivetti_glasses.txt) można wczytać następującym poleceniem: glasses = np.genfromtxt('olivetti_glasses.txt', delimiter=',') .astype(int)
- Przygotuj dane do rozpoznawania okularów (wraz z podziałem na część uczącą i testową) używając jako cechy wejściowe 50 pierwszych składowych głównych (z PCA).
- Rozpocznij implementację klasy reprezentującej drzewo decyzyjne (CART) - implementację oprzyj na schemacie z pakietu scikit-learn tzn. niech powstająca klasa rozserza klasy BaseEstimator oraz ClassifierMixin i zawiera w szczególności metody fit oraz predict. Sugestia: zbudowane drzewo decyzyjne można przechować w formie tablicy numpy, gdzie wierszami będą pisane węzły drzewa, a kolumnami istotne informacje: indeks węzła rodzica, nr zmiennej rozcięcia, wartość rozcięcia, indeksy węzłów dzieci (lewe, prawe), odpowiedź węzła (gdy liść), głębokość węzła.
- Zaimplementuj trzy funkcje nieczystości (błąd klasyfikacji, entropia, indeks Giniego) oraz posiłkową funkcję, która znajdzie warunkowy rozkład prawdopodobieństwa klas w ramach danego zbioru indeksów przykładów uczących.
- Zaimplementuj rekurencyjną funkcję budującą drzewo. Funkcja ta będzie wywoływana z poziomu funkcji fit.
- Do konstruktora klasy dodaj dwa dodatkowe parametry (opcjonalne) pozwalające na wcześniejsze zatrzymywanie rekurencji na podstawie: głębokości drzewa, procentowej zawartości przykładów w danym węźle.
- Dodaj możliwość przycinania drzewa poprzez przeglądanie i ocenianie poddrzew pełnego drzewa. Ocena powinna się odbywać wg funkcji: błąd uczący + liczba liści * kara za liść. Odpowiednia procedura rekurencyjna do tego celu może stanowić drugi etap w ramach funkcji fit (po budowie pełnego drzewa). Przeglądane poddrzewa i ich oceny można rejestrować w słowniku (mapie haszującej). W ramach zajęć należy zaprogramować wariant przeglądający wyczerpująco wszystkie możliwe ukorzenione poddrzewa (exhaustive subtrees).
[edytuj]
Do domu
- Dodaj wariant przycinania drzewa oparty na zachłannym przeglądaniu poddrzew (greedy subtrees) - oszczędniejszy obliczeniowo niż przeglądanie wyczerpujące.
- Zaimplementuj (jako dodatkową procedurę) algorytm przycinania z automatycznym doborem kary za każdy liść oparty na krzyżowej walidacji.
- Uporządkuj odpowiednio parametry konstruktora, tak aby użytkownik miał możliwość wyboru każdego z trzech wariantów przycinania polegającego na przeglądaniu poddrzew: (1) przeglądanie wyczerupujące z ustaloną karą, (2) przeglądanie zachłanne z ustaloną karą, (3) przeglądanie (wyczerpujące lub zachłanne) z doborem kary spośród zbioru możliwych wartości. Sugestia: dla oszczędności obliczeniowej w przypadku wariantu (3) warto w słowniku poddrzew rejestrować pary wartości - (błąd uczący, liczba liści) - zamiast gotowych ocen. Ostateczne wartości ocen można obliczyć później.
- Przeprowadź zestaw eksperymentów i przygotuj sprawozdanie na tema uczenia drzewa decyzyjnego (rozpoznawanie okularów w danych Olivetti) badając wpływ na dokładność testową następujących elementów: liczby użytych cech, funkcji nieczystości, ograniczania drzewa (głębokość, procent przykładów w węźle, przycinanie).