====== LAB: Uczenie nadzorowane ====== Celem ćwiczeń jest zapoznanie się ze sposobami nabywania wiedzy przez inteligentnych agentów. W ramach tego laboratorium uwaga zostanie skupiona na uczeniu nadzorowanym. Kolejne laboratorium uzupełni temat o metody uczenia nienadzorowanego. Laboratorium zostało przygotowane w oparciu o materiały z kursów: [[https://www.cs.waikato.ac.nz/ml/weka/courses.html|Data Mining with Weka]], [[https://www.cs.waikato.ac.nz/ml/weka/courses.html|More Data Mining with Weka]] i [[https://www.coursera.org/learn/machine-learning|Machine Learning]] oraz w oparciu o materiały udostępniane z podręcznikiem [[http://artint.info/|Artificial Intelligence: Foundations of Computational Agents]]. Na dzisiejszym (i kolejnych) laboratorium korzystamy z narzędzia Weka. Jeżeli pracujesz na własnym laptopie, [[http://www.cs.waikato.ac.nz/ml/weka/downloading.html|ściągnij je przed zajęciami]]. ===== - Do przygotowania ===== * **[ArtInt]** [[https://artint.info/2e/html/ArtInt2e.Ch7.html|Chapter 7: Supervised Machine Learning]] * **[AIMA]** Chapter 18: Learning from Examples * [[https://en.wikipedia.org/wiki/All_models_are_wrong|All models are wrong...]] * [[http://fgiasson.com/blog/index.php/2017/03/10/a-machine-learning-workflow/|ML workflow]] ===== - Wprowadzenie [10 minut] ===== Czy znasz odpowiedzi na poniższe **pytania**? - Czym różnią się uczenie nadzorowane, nienadzorowane i reinforcement learning? - Czym różni się regresja od klasyfikacji? - Co to jest regresja liniowa? - Co to jest drzewo decyzyjne? - Co to jest sieć neuronowa? - Na czym polega problem nadmiernego dopasowania (ang. overfitting)? - Jak sobie radzić z tym problemem w przypadku regresji liniowej? - Jak sobie radzić z tym problemem w przypadku drzewa decyzyjnego? - Jak sobie radzić z tym problemem w przypadku sieci neuronowych? - Na czym polega walidacja krzyżowa (ang. cross validation)? {{:pl:dydaktyka:psi:labs:machinelearning-whattheythink.png?600|}} \\ ([[https://pythonprogramming.net/machine-learning-python-sklearn-intro/|źródło]]) ==== Weka ==== [[http://www.cs.waikato.ac.nz/~ml/weka/|Weka]], to narzędzie opensource do data miningu. Uruchom je wykonując w konsoli polecenie: $ weka Jeśli program nie jest zainstalowany, ściągnij go ze strony [[http://www.cs.waikato.ac.nz/~ml/weka/|Weka]] i uruchom: $ java -jar weka.jar Jeżeli jesteś w laboratorium C2 208/216 uruchom wekę wpisując w terminalu: $ /usr/local/java-7-oracle/jre1.7.0_79/bin/java -jar /usr/share/java/weka.jar - Pobierz paczkę plików z danymi: {{:pl:dydaktyka:psi:data.tar.gz|}} - Otwórz w swoim ulubionym edytorze pliki o nazwach ''swimming.arff'' oraz ''cpu.arff'' i poznaj strukturę plików uczących dla weki z danymi symbolicznymi. - Uruchom Wekę i kliknij w przycisk **Explorer** - Otwórz w Wece plik ''swimming.arff'' i przeanalizuj pierwszą zakładkę GUI, a następnie odpowiedz na pytania poniżej: \\ {{.:weka-preprocess.png?600|}} **Pytania** - Jaki jest rozmiar zbioru uczącego? - Ile atrybutów występuje w zbiorze uczącym? - Ile jest instancji jest pozytywnych (//Enjoy=yes//) a ile negatywnych? - Który z atrybutów najlepiej rozdziela dane? ;) - Ile elementów ze zbioru danych ma atrybut wilgotność (//humidity//) ustawioną jako //high//? ===== - Regresja liniowa [15 minut] ===== ==== Ceny mieszkań i domów ==== - Mamy zbiór uczący (cena mieszkań w zależności od powierzchni): \\ {{.:regresja-mieszkania.png?500|}} - Chcemy znaleźć wielomian n-tego stopnia, który najlepiej dopasuje się do tych danych (na rysunku jest to funkcja liniowa ''y = ax + b''): \\ {{.:regresja-mieszkania2.png?500|}} - Wielomian posłuży nam później do przewidywania kolejnych elementów (ceny kolejnych mieszkań, których do tej pory nie braliśmy pod uwagę) Sprawdziłem parametry i ceny domów w mojej okolicy i umieściłem je w tej tabelce (dane wzięte z tradycyjnego przykładu do regresji liniowej, przygotowanego w warunkach amerykańskich, stąd taka ilość sypialni). Na tej podstawie chcę przygotować model regresji liniowej i oszacować cenę mojego domu. Jak to zrobić? ^ Rozmiar domu ^ Rozmiar działki ^ Liczba sypialni ^ Granitowe elementy w kuchni ^ Ulepszone łazienki? ^ Cena sprzedaży ^ | 3529 | 9191 | 6 | 0 | 0 | 205.000 | | 3247 | 10061 | 5 | 1 | 1 | 224.900 | | 4032 | 10150 | 5 | 0 | 1 | 197.900 | | 2397 | 14156 | 4 | 1 | 0 | 189.900 | | 2200 | 9600 | 4 | 0 | 1 | 195.000 | | 3536 | 19994 | 6 | 1 | 1 | 325.000 | | 2983 | 9365 | 5 | 0 | 1 | 230.000 | | 3198 | 9669 | 5 | 1 | 1 | ???? | - Na początek tworzymy odpowiedni plik Weki zgodnie z formatem, z którym się zaznajomiliśmy w poprzednim punkcie - Wskazówka 1: możemy potraktować wszystkie atrybuty jako typ ''numeric'' - Wskazówka 2: wartość nieznaną możemy w pliku ''.arff'' zapisać jako znak zapytania (''?'') - Wskazówka 3: jeżeli nie chcesz tworzyć pliku samodzielnie, możesz ściągnąć go stąd: {{:pl:dydaktyka:psi:domy.arff.zip|}} - Wczytujemy go w Wece i przeglądamy, aby upewnić się, że jest poprawny - Przechodzimy do zakładki **Classify** i wybieramy klasyfikator **LinearRegression** - Upewnij się, że w oknie Test options zaznaczona jest opcja **Use training set**. Uwaga! Nie powinniśmy korzystać z tej formy testowania - dlaczego? Tutaj jesteśmy zmuszeni, z uwagi na niewielki zbiór uczący... - Wciskamy **Start** i zapoznajemy się z wynikami. Czy je rozumiesz? - **Pytanie:** Jaka jest cena naszego domu? (ostatni wiersz w tabeli powyżej) - wyświetlanie predykcji możemy włączyć klikając na "More options" i zaznaczając opcję "Output predictions" ==== Zadania ==== Zadania do wykonania w Wece, na danych z paczki ściągniętej w punkcie [[#weka|Weka]]: - Wczytaj pliki ''cpu.arff'' i ''cpu.with.vendor.arff'' zawierające informacje o procesorach (nie da się tego zrobić równocześnie w jednej instancji Weki) - Czym te zbiory danych się różnią? - Na obydwu zbiorach uruchom klasyfikator **LinearRegression**. W test options wybierz **Cross-validation: 10 Folds** (co to oznacza?) - Porównaj wyniki: jaka jest różnica w skuteczności klasyfikatora? jaka jest różnica w złożoności i czytelności wyuczonego modelu? - Wczytaj plik ''iris.arff'' zawierający informacje o trzech gatunkach Irysów - Uruchom klasyfikator **LinearRegression**. Co się dzieje? Dlaczego? - W zakładce **Preprocess** wybierz z listy filtr **MakeIndicator** i uruchom go z domyślnymi ustawieniami. Co się zmieniło? - Ponownie uruchom klasyfikator **LinearRegression**. Które atrybuty okazały się istotne, a które zostały odrzucone przy uczeniu modelu? ===== - Drzewa decyzyjne [20 minut] ===== //Drzewo decyzyjne to graficzna metoda wspomagania procesu decyzyjnego, stosowana w teorii decyzji. Algorytm drzew decyzyjnych jest również stosowany w uczeniu maszynowym do pozyskiwania wiedzy na podstawie przykładów.// ==== Przykład drzewa decyzyjnego ==== Przykładowe drzewo decyzyjne (dla danych z pliku ''weather.nominal.arff'') zostało przedstawione poniżej: {{.:dt.png|Drzewo decyzyjne}} **Pytanie:** Jak Twoim zdaniem wyglądałoby drzewo decyzyjne dla zestawu danych poniżej (podejmujemy decyzję Enjoy = yes/no na podstawie pozostałych parametrów)? Narysuj je na kartce. ^Sky^AirTemp^Humidity^Wind^Water^Forecast^Enjoy^ |sunny|warm|normal|strong|warm|same|yes| |sunny|warm|high|strong|warm|same|yes| |rainy|cold|high|strong|warm|change|no| |sunny|warm|high|strong|cool|change|yes| |cloudy|warm|normal|weak|warm|same| yes| |cloudy|cold|high|weak|cool|same|no| ==== Lubiane programy TV ==== Poniżej znajduje się zbiór uczący dotyczący lubianych programów telewizyjnych w zależności od ich czterech właściwości: ^ Przykład ^ Komedia ^ Lekarze ^ Prawnicy ^ Broń ^ Lubiany? ^ | e1 | fałsz | prawda | fałsz | fałsz | fałsz | | e2 | prawda | fałsz | prawda | fałsz | prawda | | e3 | fałsz | fałsz | prawda | prawda | prawda | | e4 | fałsz | fałsz | prawda | fałsz | fałsz | | e5 | fałsz | fałsz | fałsz | prawda | fałsz | | e6 | prawda | fałsz | fałsz | prawda | fałsz | | e7 | prawda | fałsz | fałsz | fałsz | prawda | | e8 | fałsz | prawda | prawda | prawda | prawda | | e9 | fałsz | prawda | prawda | fałsz | fałsz | | e10 | prawda | prawda | prawda | fałsz | prawda | | e11 | prawda | prawda | fałsz | prawda | fałsz | | e12 | fałsz | fałsz | fałsz | fałsz | fałsz | | e13 | prawda | prawda | fałsz | fałsz | prawda | - Ściągnij plik: {{.:dtree-4.4.0.jar|Decision Tree Learning Applet}}, a następnie uruchom go w konsoli: $ java -jar dtree-4.4.0.jar - Załaduj przykładowy zbiór danych (przedstawiony powyżej): File -> Load Sample Dataset -> __Likes TV__. W zakładce **Create** pojawiła się informacja o załadowanym przykładzie. - Przejdź do zakładki **Solve**. Tutaj będziemy tworzyć i ewaluować drzewo decyzyjne. Jak się poruszać po narzędziu? Najważniejsze pozycje z menu: * Step -> automatyczne stworzenie jednego podziału w drzewie decyzyjnym * Auto Create -> automatyczne stworzenie całego drzewa (szybkość można edytować w menu Decision Tree Options -> Auto Create Speed; warunki przerwania tworzenia kolejnych podziałów można ustalić w Decision Tree Options -> Stopping Conditions) * Reset Graph -> usunięcie stworzonego drzewa * Show Plot -> wykres błędów (suma kwadratów / suma różnic) w zależności od liczby podziałów * Split Node -> kliknij węzeł, aby stworzyć podział na podstawie zadanego atrybutu * Test -> przetestuj drzewo zbiorem danych testowych * Test New Ex. -> przetestuj drzewo dowolnym przykładem Załadowany przykładowy plik zawiera dokładnie takie same dane jak te umieszczone w poprzednim punkcie. Korzystając z programu możesz teraz sprawdzić poprawność swoich rozwiązań na cztery pytania z poprzedniego punktu (rada: przydatne może się okazać menu Decision Tree Options -> Stopping Conditions) Wspierając się programem odpowiedz na **poniższe pytania**: - Jakie jest najmniejsze drzewo, które poprawnie klasyfikuje wszystkie przykłady? Czy wybieranie na każdym etapie decyzji, która daje największe //information gain// daje nam w rezultacie drzewo, które reprezentuje taką samą funkcję? - Podaj dwa przykłady, które nie pojawiają się w zbiorze uczącym i ustal w jaki sposób zostaną sklasyfikowane zgodnie z najmniejszym możliwym drzewem. Wyjaśnij na tych przykładach jaka tendencyjność (ang. bias) zakodowana jest drzewie. ==== Drzewa w Wece (w miarę możliwości czasowych) ==== - Wczytaj plik ''swimming.arff'' ze zbioru danych. - Kliknij w zakładkę **Clasify**. - Za pomocą przycisku **Choose** wybierz klasyfikator J48((W Wece znajduje się kilka klasyfikatorów do budowania drzew decyzyjnych. Ten jest implementacją [[wp>C4.5_algorithm|Algorytmu C4.5]].)). - Upewnij się, że w oknie //Test options// zaznaczona jest opcja //Use training set//. Uwaga! **Nie** powinniśmy korzystać z tej formy testowania - dlaczego? Tutaj jesteśmy zmuszeni, z uwagi na niewielki zbiór uczący... - Kliknij w przycisk **Start** i zapoznaj się z uzyskanymi wynikami. - Następnie zwizualizuj drzewo tak jak to pokazano poniżej: \\ {{.:weka-visualize-tree.png?600|}} - **Pytanie:** Czy drzewo wygląda tak jak je narysowałeś(aś) w sekcji [[#przyklad_drzewa_decyzyjnego|Przykład drzewa decyzyjnego]]? ===== - Sieci neuronowe [15 minut] ===== ==== Perceptron ==== Podstawową jednostką budującą sieć neuronową jest perceptron (neuron): [[https://pl.wikipedia.org/wiki/Plik:Neuron_McCullocha-Pittsa.svg|{{:pl:dydaktyka:psi:neuron_mccullocha-pittsa.png?400}}]] W najpopularniejszej wersji, przedstawionej na rysunku: - neuron przyjmuje jakieś wartości na wejściach (+ wartość 1, która pozwala nam dodać jakąś stałą), - mnoży te wartości przez wagi, - sumuje je ze sobą - i na koniec ustala wartość wyjściową na podstawie funkcji aktywacji. **Zadanie 1:** Stwórzmy trzy takie proste neurony (na kartce, w programie graficznym, etc)! Wytyczne: * dwa wejścia binarne ''x1'' i ''x2'' + stała 1 * funkcja aktywacji: * dla sumy >= 0 generuje wyjście = 1 * dla sumy < 0 generuje wyjście = 0 * trzy neurony powinny reprezentować trzy operacje logiczne: **x1 OR x2**, **x1 AND x2**, **x1 XOR x2** ==== Sieć perceptronów ==== Mając takie perceptrony możemy je połączyć ze sobą tworząc sieć neuronową (szczegóły w materiałach do dzisiejszych zajęć), która może reprezentować bardziej skomplikowane zależności. **Zadanie 2:** Otwórz narzędzie [[http://playground.tensorflow.org/#activation=tanh&batchSize=10&dataset=circle®Dataset=reg-plane&learningRate=0.3®ularizationRate=0&noise=0&networkShape=4,2&seed=0.22436&showTestData=false&discretize=false&percTrainData=50&x=true&y=true&xTimesY=false&xSquared=false&ySquared=false&cosX=false&sinX=false&cosY=false&sinY=false&collectStats=false&problem=classification&initZero=false&hideText=false®ularizationRate_hide=true®ularization_hide=true&problem_hide=true&percTrainData_hide=true&batchSize_hide=true|http://playground.tensorflow.org/]] pozwalające na oglądanie procesu uczenia sieci neuronowej rozpoznającej dwa rodzaje (kolory) punktów w dwuwymiarowej przestrzeni. - Możesz: (a) zmienić funkcję aktywacji (Activation), liczbę warstw ukrytych i liczbę neuronów w każdej z nich, (b) wybrać jakie parametry będą dostępne na wejściu (x1, x2 reprezentują współrzędne), (c) dodać szum (noise), co sprawi, że dane będą mniej poukładane i przez to trudniejsze do rozgraniczenia. - Dla każdego z 4 dostępnych zbiorów danych spróbuj wyuczyć sieć neuronową, która **NIE MA** warstw ukrytych. Wypróbuj różne kombinacje parametrów wejściowych. Dla którego zbioru się nie udało? Dlaczego? - Zbuduj sieć mającą więcej warstw ukrytych (narzędzie pozwala na 6 warstw). Ile warstw będzie w porządku? Ile neuronów powinno być w każdej z warstw? - Poeksperymentuj z różnymi ustawieniami, zaobserwuj jakich wzorców uczą się neurony warstw ukrytych (możesz najechać kursorem na dany neuron i wtedy jego wzorzec zostaje powiększony) i spróbuj stworzyć sieć neuronową, która najlepiej klasyfikuje punkty ułożone w spiralę. **Zadanie 3:** zagraj w kalambury z siecią neuronową: [[https://quickdraw.withgoogle.com/#|Quick, Draw!]] * W ramach eksperymentów spróbuj rysować INNE rzeczy niż to co jest zadane - czy sieć rozpoznaje to co rysujesz? * Po zakończeniu rozgrywki (6 haseł do narysowania) pojawia się podsumowanie - możesz kliknąć w każdy narysowany przez siebie obrazek i porównać go do tych, na których sieć została wyuczona. Czy Twój obrazek jest podobny? ===== - Poprawność klasyfikacji [10 minut] ===== **Pytania:** - Załaduj plik ''credit-g.arff'' do Weki. Zawiera on dane uczące dla systemu, który na podstawie atrybutów zawartych w pliku powinien określać czy dany zestaw wartości atrybutów wskazuje na wiarygodnego klienta banku, czy też nie - czy można przyznać mu kredyt, czy jest to ryzykowne. - Przejdź do zakładki **Classify** i wybierz algorytm J48. - W obszarze //Test options// wybierz opcje //Percentage split// z wartością 66% Oznacza to, ze 66% danych posłuży do uczenia, a 34% do walidacji. Jakie to ma znaczenie? - Uruchom algorytm. Ile procent przypadków zostało poprawnie zaklasyfikowanych? Czy to dobry wynik? - Zmień klasyfikator na //ZeroR// z gałęzi //rules//. Jakie są wyniki? - Wybierz trzy inne klasyfikatory i je wypróbuj. Jakie dają wyniki? - Przejdź do zakładki **Preprocess** i zobacz jak wygląda rozkład atrybutu określającego czy danych zestaw jest //dobry// czy //zły//. Jaka byłaby skuteczność algorytmu który niezależnie od wartości atrybutów "strzelałby" że użytkownik jest wiarygodny? - Dlaczego przed przystąpieniem do klasyfikacji, warto wcześniej przyjrzeć się danym? :-P ===== Chcesz wiedzieć więcej? ===== * [[https://www.youtube.com/watch?v=Cw5PKV9Rj3o|Film pokazujący działanie prawdziwego neuronu w mózgu]]: do komórki nerwowej w pierwszorzędowej korze wzrokowej kota (V1; odpowiednik pierwszej warstwy ukrytej w sieci przetwarzającej bodźce wzrokowe) podpięto elektrodę, która zbiera aktywność neuronu w zależności od pokazywanego na ekranie bodźca. Aktywność elektryczna jest przetworzona na dźwięk (neuron generuje sygnał na wyjściu kiedy pojawiają się "trzaśnięcia"). Podobnie jak pierwsza warstwa ukryta w sieci neuronowej, tak i tutaj neuron reaguje na proste kształty, by następnie przekazać informację do kolejnych warstw, które będą reagowały na bardziej konkretne układy (np. neuron rozpoznający twarz prowadzącego zajęcia). * {{https://depot.ceon.pl/bitstream/handle/123456789/7318/leksykon%20sieci%20neuronowych%20-%20r.tadeusiewicz%2C%20m.szaleniec.pdf?sequence=1&isAllowed=y|Leksykon Sieci Neuronowych by Tadeusiewicz i Szaleniec}} ==== Machine Learning ogólnie ==== * [[https://www.kdnuggets.com/2018/04/10-machine-learning-algorithms-data-scientist.html|Ten Machine Learning Algorithms You Should Know to Become a Data Scientist]] (z linkami do bibliotek i tutoriali) * [[https://www.lenwood.cc/2014/05/13/12-free-data-mining-books/|14 Free (as in beer) Data Mining Books]] * [[http://www.kdnuggets.com/2017/05/guerrilla-guide-machine-learning-python.html|The Guerrilla Guide to Machine Learning with Python]] ("a complete course for the quick study hacker with no time (or patience) to spare") * Kursy z uczenia maszynowego na Coursera.org: * [[https://www.coursera.org/learn/machine-learning]] - **podstawy matematyczne**, zadania programistyczne (budowanie metod od podstaw; Octave/Matlab), świetny wykładowca! * [[https://www.coursera.org/specializations/machine-learning]] - **podstawy praktyczne**: przegląd przez różne metody i przykłady ich zastosowań w rzeczywistości, zadania programistyczne (Python, wykorzystanie gotowych bibliotek do uczenia maszynowego) * [[https://www.kdnuggets.com/2018/03/what-machine-learning-isnt.html|What Machine Learning Isn’t]] * [[https://www.naftaliharris.com/blog/visualizing-k-means-clustering/|visualizing-k-means-clustering]] * [[https://towardsdatascience.com/the-5-clustering-algorithms-data-scientists-need-to-know-a36d136ef68|the-5-clustering-algorithms-data-scientists-need-to-know-a36d136ef68]] * Deep Learning: * [[https://github.com/afshinea/stanford-cs-230-deep-learning|Deep Learning Cheat Sheets]] * [[https://www.kdnuggets.com/2018/11/deep-learning-performance-cheat-sheet.html|Deep Learning Performance Cheat Sheet]] * Konkursy na najlepszy algorytm predykcyjny: * [[https://www.kaggle.com/]] * [[https://www.dataquest.io/blog/kaggle-getting-started/|Getting Started with Kaggle: House Prices Competition]] * [[https://www.topcoder.com/challenges/?filter[tracks][data_science]=true]] * Narzędzia: * [[https://www.cs.waikato.ac.nz/ml/weka/courses.html|Kursy Weki]]: jak korzystać z narzędzia, jakie ma możliwości, jak rozumieć wyniki? * [[https://www.learndatasci.com/tutorials/predicting-housing-prices-linear-regression-using-python-pandas-statsmodels/|Predicting Housing Prices with Linear Regression using Python, pandas, and statsmodels]] * Use cases: * [[https://medium.com/s/story/spotifys-discover-weekly-how-machine-learning-finds-your-new-music-19a41ab76efe|How Does Spotify Know You So Well?]]