Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Both sides previous revision Poprzednia wersja
Nowa wersja
Poprzednia wersja
pl:miw:miw08_rbs_ml [2008/06/16 11:56]
miw
pl:miw:miw08_rbs_ml [2019/06/27 15:50] (aktualna)
Linia 1: Linia 1:
 ====== Opis ====== ====== Opis ======
 +__**Projekt zakończony**__
 +
 Krzysztof Morcinek, <​krzysztof.morcinek@gmail.com>​ Krzysztof Morcinek, <​krzysztof.morcinek@gmail.com>​
  
 Uczenie maszynowe w RBS, jako metoda rozbudowy/​rozszerzania istniejącego systemu o nowe reguły, modyfikacja reguł, przykłady. Uczenie maszynowe w RBS, jako metoda rozbudowy/​rozszerzania istniejącego systemu o nowe reguły, modyfikacja reguł, przykłady.
  
 +[[:​pl:​miw:​miw08_rbs_ml:​historia | Historia spotkań ]]
  
  
Linia 13: Linia 16:
  
  
-====== Spotkania ====== 
  
  
Linia 22: Linia 24:
  
  
-===== 080311 ===== 
  
  
-===== 080401 ===== 
-  * jak metodami uczenia maszynowego //​automatycznie//​ budować model ARD? 
-  * jak uczenie maszynowe może prowadzić do rozbudowy bazy reguł? 
- 
- 
- 
- 
- 
- 
- 
- 
- 
-===== 080520 ===== 
-  * Zaimplementować uczenie maszynowe dla [[hekate:​hekate_case_thermostat|Termostatu]]. 
-    * Zastosowano algorytm ID3, lecz wtedy tworzy sie zbyt wiele gałęzi. ​ 
-    * Pójście w stronę C4.5 na początku następuje agregacja (wartości są uporządkowane) i zmiana atrybutów porządkowych na inne o mniejszej ilości możliwych wartości. 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
-===== 080527 ===== 
- 
- 
-  * Pytania: 
-    * Czy jako zbiór uczący może być cała dziedzina, czyli 'dni x godziny x miesiące'?​ 
-    * Czy musimy obsługiwać przekłamane przykłady uczące i braki (brak któregoś atrybutu)? 
- 
-  * Testy: 
-    * Losowy zbiór uczący składający sie z 150 przykładów 
-    * Dziedzina składa się z 2016 przypadków 
-    * Najpierw algorytm buduje drzewo z 150 przykładów zbioru uczącego, następnie pozostałe 1866 są testowane w zbudowanym drzewie 
- 
-  * Testy algorytmu ID3 
-    * [[ http://​student.agh.edu.pl/​~morcinek/​AGH/​MIW/​No_aggregate.gif |Przykładowe drzewo]] które nie zostało w pełni wygenerowane ponieważ program graphviz nie poradził sobie. Było to związane z tym, że atrybuty początkowe zawierały zbyt wiele wartości i każda z nich była w każdym wyniku testu opierającego się o ten atrybut. Czasochłonne i pamięciochłonne było też konstruowanie i przechowywanie w pamięci takiego drzewa. Ilość liści takiego drzewa wynosi 7 (dni) x 24 (godziny) x 12 (miesięcy) = 2016. 
-    * Wykonano 20 testów. 
-    * Średnia skuteczność wynosiła 55.3% 
-    * Poprawnie sklasyfikowane przykłady testowe wahały się od 904 do 1111 
- 
- 
- 
- 
- 
- 
- 
- 
- 
-===== 080610===== 
- 
- 
-  * Testy(przeprowadzane jak przy ID3) algorytmu ID3 uzupełnionego o występujące w C4.5 agregowanie wartości porządkowych i zmianę atrybutów na prostsze 
-  
-  * Wyniki: 
-    * [[ :​pl:​miw:​miw08_rbs_ml:​tree1 |Przykładowe drzewo 1]] oraz [[:​pl:​miw:​miw08_rbs_ml:​aggregate1 |Aggregate1.txt]] odwzorowujący atrybuty początkowe na te atrybuty po agregacji 
-    * [[ :​pl:​miw:​miw08_rbs_ml:​tree2 |Przykładowe drzewo 2]] oraz [[:​pl:​miw:​miw08_rbs_ml:​aggregate2 |Aggregate2.txt]] odwzorowujący atrybuty początkowe na te atrybuty po agregacji 
-    * Wykonano 20 testów 
-    * Średnia skuteczność wynosiła 91.2% 
-    * Poprawnie sklasyfikowane przykłady testowe wahały się od 1488 do 1866 
-    * Wyniki uzyskane ulepszonym algorytmem ID3 są lepsze ponieważ już przed rozpoczęciem budowy drzewa zamieniamy wielowartościowe atrybuty na prostsze (mniejsza ilość wartości). Korzystam ze zbioru uczącego się zawierającego 7,4% przykładów (150 / 2016). Zwykły algorytm ID3 dobrze dopasuje każdy ze 150 przykładów,​ lecz zabraknie mu ogólności dla przykładów spoza tego zbioru. Agregacja pozwala nam podzielić wartości zbyt licznych atrybutów i przejść na prostsze biorąc pod uwagę przyrost informacji (entropię). Najbardziej pożądane jest tak podzielić wartości aby w danym zbiorze występowała przewaga jednych pojęć docelowych (np jednego, kilku) nad pozostałymi (najlepiej żeby ich nie było). ​ 
  
  
Linia 108: Linia 41:
   * Używane pliki:   * Używane pliki:
     * [[ pl:​miw:​miw08_rbs_ml:​attrchangecollection | attrchangecollection.java]]     * [[ pl:​miw:​miw08_rbs_ml:​attrchangecollection | attrchangecollection.java]]
-    * [[ pl:​miw:​miw08_rbs_ml:​ | .java]]+    * [[ pl:​miw:​miw08_rbs_ml:​attributchange ​attributchange.java]]
     * [[ pl:​miw:​miw08_rbs_ml:​days | days.java]]     * [[ pl:​miw:​miw08_rbs_ml:​days | days.java]]
     * [[ pl:​miw:​miw08_rbs_ml:​decisiontree | decisiontree.java]]     * [[ pl:​miw:​miw08_rbs_ml:​decisiontree | decisiontree.java]]
Linia 119: Linia 52:
     * [[ pl:​miw:​miw08_rbs_ml:​thermostat | thermostat.java]]     * [[ pl:​miw:​miw08_rbs_ml:​thermostat | thermostat.java]]
     * [[ pl:​miw:​miw08_rbs_ml:​writefile | writefile.java]]     * [[ pl:​miw:​miw08_rbs_ml:​writefile | writefile.java]]
- 
-  * [[http://​student.agh.edu.pl/​~morcinek/​AGH/​MIW|Aktualna implementacja w języku C#]] 
  
   * ID3 opis mojej implementacji: ​   * ID3 opis mojej implementacji: ​
-    * Do zbioru uczącego będziemy się odwoływać poprzez indeksy, do funkcji ​BuildTree() przekażemy listę indeksów opisujących przykłady na podstawie których będzie generowany węzeł. Funkcja ​BuildTree() pobiera jeszcze zbiór niewykorzystanych testów oraz etykietę większościową dla danego drzewa, a zwraca liść lub węzeł.+    * Do zbioru uczącego będziemy się odwoływać poprzez indeksy, do funkcji ​buildTree() przekażemy listę indeksów opisujących przykłady na podstawie których będzie generowany węzeł. Funkcja ​buildTree() pobiera jeszcze zbiór niewykorzystanych testów oraz etykietę większościową dla danego drzewa, a zwraca liść lub węzeł.
     * Sprawdzamy Kryterium Stopu - wtedy zwracany jest liść z przypisaną mu etykietą, kryteria:     * Sprawdzamy Kryterium Stopu - wtedy zwracany jest liść z przypisaną mu etykietą, kryteria:
       * Brak przykładów       * Brak przykładów
Linia 131: Linia 62:
     * Tworzymy węzeł i przypisujemy do niego wybrany test i kategorię większościową     * Tworzymy węzeł i przypisujemy do niego wybrany test i kategorię większościową
     * W węźle tworzymy słownik w którym każdemu rezultatowi '​r'​ wybranego testu odpowie węzeł do którego rezultat prowadzi. Nowy węzeł tworzymy poprzez wywołanie rekurencyjnej funkcji buildTree(),​ do której przekażemy zbiór przykładów spełniających rezultat '​r',​ kategorę większościową dla tego zbioru oraz zbiór testów pomniejszony o właśnie użyty test.     * W węźle tworzymy słownik w którym każdemu rezultatowi '​r'​ wybranego testu odpowie węzeł do którego rezultat prowadzi. Nowy węzeł tworzymy poprzez wywołanie rekurencyjnej funkcji buildTree(),​ do której przekażemy zbiór przykładów spełniających rezultat '​r',​ kategorę większościową dla tego zbioru oraz zbiór testów pomniejszony o właśnie użyty test.
 +
   * C4.5 opis mojej implementacji:​   * C4.5 opis mojej implementacji:​
     * Problemem poprzedniego algorytmu była zbyt duża ilość wartości, które mogłyby być pogrupowane. Rozwiązaniem jest np. agregacja atrybutów porządkowych. Godziny, dni tygodnia oraz miesiące nadają się do tego doskonale. ​     * Problemem poprzedniego algorytmu była zbyt duża ilość wartości, które mogłyby być pogrupowane. Rozwiązaniem jest np. agregacja atrybutów porządkowych. Godziny, dni tygodnia oraz miesiące nadają się do tego doskonale. ​
Linia 138: Linia 70:
     * Najważniejszym parametrem jest tutaj próg entropii (m_entropyTreshhold). Określa od jakiej różnicy informacji oraz entropii występującej w podzielonym zbiorze, próg podziału będzie zaakceptowany.     * Najważniejszym parametrem jest tutaj próg entropii (m_entropyTreshhold). Określa od jakiej różnicy informacji oraz entropii występującej w podzielonym zbiorze, próg podziału będzie zaakceptowany.
  
-====== Sprawozdanie ====== 
  
  
  
 +====== Testy praktyczne ======
  
  
 +  * Metodologia testów:
 +    * Losowy zbiór uczący składający sie z 150 przykładów
 +    * Dziedzina składa się z 2016 przypadków
 +    * Najpierw algorytm buduje drzewo z 150 przykładów zbioru uczącego, następnie pozostałe 1866 są testowane w zbudowanym drzewie. Często wykorzystywane w literaturze,​ aby nie sprawdzać tym czym uczyliśmy.
 +    * Wykonujemy 20 testów.
  
 +  * Testy algorytmu ID3
 +    * [[:​pl:​miw:​miw08_rbs_ml:​no_aggregate | Przykładowe drzewo ]] które nie zostało w pełni wygenerowane ponieważ program graphviz nie poradził sobie. Było to związane z tym, że atrybuty początkowe zawierały zbyt wiele wartości i każda z nich była w każdym wyniku testu opierającego się o ten atrybut. Czasochłonne i pamięciochłonne było też konstruowanie i przechowywanie w pamięci takiego drzewa. Ilość liści takiego drzewa wynosi 7 (dni) x 24 (godziny) x 12 (miesięcy) = 2016.
 +    * Średnia skuteczność wynosiła 55.3%
 +    * Poprawnie sklasyfikowane przykłady testowe wahały się od 904 do 1111
 +
 +  * Testy algorytmu ID3 uzupełnionego o występujące w C4.5 agregowanie wartości porządkowych i zmianę atrybutów na prostsze:
 +    * [[ :​pl:​miw:​miw08_rbs_ml:​tree1 |Przykładowe drzewo 1]] oraz [[:​pl:​miw:​miw08_rbs_ml:​aggregate1 |Aggregate1.txt]] odwzorowujący atrybuty początkowe na te atrybuty po agregacji
 +    * [[ :​pl:​miw:​miw08_rbs_ml:​tree2 |Przykładowe drzewo 2]] oraz [[:​pl:​miw:​miw08_rbs_ml:​aggregate2 |Aggregate2.txt]] odwzorowujący atrybuty początkowe na te atrybuty po agregacji
 +    * Średnia skuteczność wynosiła 91.2%
 +    * Poprawnie sklasyfikowane przykłady testowe wahały się od 1488 do 1866 (czyli wszystkie rozpoznane prawidłowo)
 +    * Wyniki uzyskane ulepszonym algorytmem ID3 są lepsze ponieważ już przed rozpoczęciem budowy drzewa zamieniamy wielowartościowe atrybuty na prostsze (mniejsza ilość wartości). Korzystam ze zbioru uczącego się zawierającego 7,4% przykładów (150 / 2016). Zwykły algorytm ID3 dobrze dopasuje każdy ze 150 przykładów,​ lecz zabraknie mu ogólności dla przykładów spoza tego zbioru. Agregacja pozwala nam podzielić wartości zbyt licznych atrybutów i przejść na prostsze biorąc pod uwagę przyrost informacji (entropię). Najbardziej pożądane jest tak podzielić wartości aby w danym zbiorze występowała przewaga jednych pojęć docelowych (np jednego, kilku) nad pozostałymi (najlepiej żeby ich nie było). ​
  
  
  
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +====== Sprawozdanie ======
 +
 +  * Przedstawione problemy to jak metodami uczenia maszynowego //​automatycznie//​ budować model ARD?
 +  * Postanowiłem to rozwiązać podczas implementowania uczenia maszynowego dla [[hekate:​hekate_case_thermostat|Termostatu]].
 +  * Projekt powstawał etapami na bazię książki "​Systemy uczące się" Pawła Cichosza. Najpierw skonstruowany został algorytm ID3 w języku C#. Następnie wobec wymienionych poniżej wad, rozszerzony został o przekształcanie atrybutów (a dokładnie Dyskretyzacje zstępującą). Na koniec musiał całość przerobić na Javę.
  
  
 ====== Materiały ====== ====== Materiały ======
 +**Głównie:​**
 +
 +Książka Systemy uczące sie. Cichosz P., WNT, Warszawa, 2000, zwłaszcza cały rozdział 3. Indukcja drzew decyzyjnych. oraz 7. Przekształcanie atrybutów.
 +
 +[[wp>​ID3_algorithm]] [[wp>​C4.5_algorithm]] [[wp>​Decision_tree]] ​ [[http://​pl.wikipedia.org/​wiki/​Drzewo_decyzyjne|Drzewo decyzyjne na Wikipedii]]
 +
 +Mniej:
 +
 [[http://​idss.cs.put.poznan.pl/​~stefanowski/​mlteaching.html|Wiele linków o ML z Politechniki Poznańskiej]] ​ [[http://​idss.cs.put.poznan.pl/​~stefanowski/​mlteaching.html|Wiele linków o ML z Politechniki Poznańskiej]] ​
  
Linia 160: Linia 131:
  
  
-Książka Systemy uczące sie. Cichosz P., WNT, Warszawa, 2000, zwłaszcza cały rozdział 3. Indukcja drzew decyzyjnych. oraz 7. Przekształcanie atrybutów. 
- 
-[[wp>​ID3_algorithm]] [[wp>​C4.5_algorithm]] [[wp>​Decision_tree]] ​ [[http://​pl.wikipedia.org/​wiki/​Drzewo_decyzyjne|Drzewo decyzyjne na Wikipedii]] 
  
  
pl/miw/miw08_rbs_ml.1213610163.txt.gz · ostatnio zmienione: 2019/06/27 15:58 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0