SI/L/z3
From WikiZMSI
[edytuj]
Na zajęciach
Napisz w języku Python program realizujący NBC w wersji dyskretnej do klasyfikacji danych ze zbioru "wine" (rozpoznawanie wina na podstawie składu chemicznego).
- Z repozytorium UCI pobierz zbiór danych o nazwie "wine" i zapoznaj się z nim. Zwróć uwagę, która ze zmiennych jest zmienną decyzyjną.
- Wczytaj dane z pobranego pliku tekstowego wine.data do macierzy numpy (wykorzystaj funkcję numpy.genfromtxt) i rozdziel tę macierz na dwie macierze: X (o wymiarze 178 x 13) i y (178 x 1 - etykiety klas).
- Podziel dane na cześć uczącą i testową (możesz wykorzystać funkcję train_test_split z pakietu sklearn.model_selection).
- Napisz funkcję do dyskretyzacji danych ciągłych. Argumentem funkcji powinna być zadana liczba koszyków (równoszerokich przedziałów) oraz minima i maksima referencyjne.
- Napisz klasę reprezentującą naiwny klasyfikator Bayesa w wariancie ze zmiennymi dyskretnymi. Klasę przygotuj zgodnie z ideą biblioteki scikit-learn - m.in.: wykonaj dziedziczenie po klasach BaseEstimator i ClassifierMixin (z pakietu sklearn.base), przygotuj metody fit (uczenie) i predict (klasyfikowanie) oraz pomocniczo predict_proba. Zastanów się i zaplanuj wg własnego uznania wygodne struktury danych do przechowywania: rozkładu a priori klas (struktura jednowymiarowa) i wszystkich rozkładów warunkowych dla poszczególnych cech i klas (struktura trójwymiarowa) - mogą to być tablice, listy, słowniki lub odpowiednie połączenia tych struktur. Pamiętaj, że do tego celu potrzebne będzie ustalenie dyskretnych dziedzin zmiennych, tj. wykrycie unikalnych wartości (np. z wykorzystaniem funkcji numpy.unique). Przemyśl, czy informacje o dziedzinach należy zdobywać na poziomie funkcji fit na podstawie danych uczących, czy też lepiej przekazać je klasyfikatorowi już podczas konstrukcji.
- Uwaga: na etapie prac podczas zajęć laboratoryjnych, obliczanie odpowiedzi klasyfikatora (w metodach predict_proba, predict) może być realizowane zgodnie z definicyjnym wzorem stanowiącym iloczyn prawdopodobieństw (bez zabiegu logarytmowania).
- Wyznacz dokładność otrzymanego klasyfikatora na zbiorach uczącym i testowym.
- Wprowadź parametr pozwalający na włączenie poprawki LaPlace'a (np. w konstruktorze). Powtórz obliczenia - uczenie i pomiary dokładności.
[edytuj]
Do domu
- Opracuj NBC dla wybranego przez Ciebie zbioru danych (innego niż "wine"). Zbiór powinien zawierać przynajmniej 1000 przykładów opisanych przynajmniej 20 cechami (zmiennymi).
- Zgodnie z naturą tego zbioru (dane dyskretne / ciągłe) opracuj odpowiedni dla niego naiwny klasyfikator bayesowski. Przeprowadź eksperymenty, raportując otrzymaną dokładność testową. W przypadku dyskretnym sprawdź, jaki wpływ na dokładność mają poprawka LaPlace’a oraz wybór liczby przedziałów podczas dyskretyzacji zmiennych ciągłych.
- Zmodyfikuj opracowane implementacje NBC zapewniając bezpieczeństwo numeryczne obliczeń z wykorzystaniem zabiegu logarytmowania. Wskazówka dla wariantu dyskretnego: w wybranych przez Ciebie strukturach danych możesz od razu przechowywać logarytmy prawdopodobieństw zamiast prawdopodobieństw (zmiana na poziomie funkcji fit); później, w trakcie obliczania odpowiedzi klasyfikatora (funkcje predict_proba i / lub predict) wystarczy odpowiednie sumowanie. Spróbuj zaaranżować sytuację niebezpieczną numerycznie (np. rozmnażając sztucznie liczbę cech (kolumn) w zbiorze danych). Porównaj działanie poprzednich implementacji niebezpiecznych numerycznie z nowymi (bezpiecznymi).