====== Laboratorium 2 - Concept Learning ======
Literatura: Tom M. Mitchell, //Machine Learning//, [[http://www.cs.cmu.edu/afs/cs.cmu.edu/project/theo-20/www/mlbook/ch2.pdf|Rozdział 2]].
Pliki do pobrania: {{:pl:dydaktyka:ml:concept-learning.zip|Contcept Learning}}
===== Lista i opis plików =====
Pliki oznaczone znakiem wykrzyknika (:!:) należy wypełnić własnym kodem
* //ex1.m// - skrypt pomagajacy przejśc przez pierwszą część laboratoium
* :!: //consistent.m// - funkcja sprawdzająca zgodność hipotezy ze zbiorem treningowym
* //satisfies// - funkcja sprawdzająca czy hipoteza jest prawdziwa dla danego elementu ze zbioru uczącego
* :!: //findS.m// - funkcja implementująca algorytm findS
* :!: //listAllHypothesis.m// - funkcja generująca wszystkie możliwe hipotezy dla danego zbioru treningowego
* :!: //listThenEliminate.m// - funkcja implementująca algorytm List-Then-Eliminate
* //vs.pl// - plik z programem do drugiej części laboratorium
* //animals.pl loandata.pl shapes.pl taxonomy.pl// - pliki z danymi do drugiej części laboratorium
===== Zbiór danych =====
Załóżmy, że mamy następujący zbiór danych:
^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|
Opisuje on dni ocenione przez pływaka pod względem tego czy sprzyjamy one treningowi, czy nie. Pierwsze cztery kolumny zawierają dane na temat poszczególnych parametrów pogodowych dnia, natomiast kolumna //EnjoySport// przechowuje ocenę pływaka.
Każdy z parametrów może przyjmować następujące wartości, które w Octave zapiszemy za pomocą liczb:
Sky = [1,2,3]; %['Sunny','Rainy','Cloudy'];
AirTemp = [1,2]; %['Warm','Cold'];
Humidity =[1,2]; %['Normal','High'];
Wind = [1,2]; %['Strong','Weak'];
Water = [1,2]; %['Warm','Cool'];
Forecast =[1,2]; %['Same','Change'];
Enjoy = [0,1]; %['No','Yes'];
Analogicznie, zbiór danych treningowych będzie zatem wyglądał tak:
%Sky, AirTemp, Humidity, Wind, Water, Forecast
X = [1,1,1,1,1,1;
1,1,2,1,1,1;
2,2,2,1,1,2;
1,1,2,1,2,2]
%Enjoy
C = [1;1;0;1];
**Uwaga** Ostatnią kolumnę tabeli (//Enjoy//) przechowujemy w osobnej macierzy C.
===== Hipoteza =====
Zakładamy, że dla każdego atrybutu funkcja hipotezy $h$ będzie opisana za pomocą
* $0$ - oznaczającego, że żadna wartość nie jest akceptowana
* $Inf$ - oznaczającego, że każda wartość jest akceptowalna dla tego atrybutu (ekwiwalen $?$ z //Mitchela//)
* konkretnej wartości danego atrybutu np. //Warm//, wskazując że tylko ta wartość jest akceptowalna dla tego atrybutu.
Na przykład hipoteza opisująca sytuację, ze pływak uważa jedynie zimne dni z dużą wilgotnością (//AirTemp = Cold//,//Humidity = High//) za odpowiednie do treningu wyglądałaby następująco:
h = [Inf,2,2,Inf,Inf,Inf]
===== Find-S =====
Zaimplementuj algorytm Find-S, w pliku //findS.m//. Algorytm wygląda następująco:
- Initialize $h$ to the most specific hypothesis in $H$
- For each positive training instance $x$
- For each attribute constraint $a_i$ in $h$
- If the constraint $a_i$ is satisfied by $x$, then do nothing
- Else replace $a_i$ in $h$ by the next more general constraint that is satisfied by $x$
- Return $h$
**Uwaga** Zwróć uwagę, że //the most specific hypothesis in H// to w przypadku naszej notacji: h=[0,0,0,0,0,0]; Wykorzystaj funkcję //zeros//, tak aby algorytm działał dla innych danych wejściowych (o innych wymiarach).
===== List-Then-Eliminate =====
Jednym z ograniczeń algorytm Find-S jest to, że podaje on wyłącznie jedno rozwiązanie, podczas gdy hipotez, które są prawdziwe dla naszego zbioru uczącego $D$ jest więcej. Te hipotezy określa się mianem tzw. //version-spaces//. Definiujemy ją następująco:
$$VS_{H,D} = {h \in H | Consistent(h,D)}$$
To że funkcja jest zgodna ze zbiorem uczącym (//consistent//) oznacza, że:
$$ Consistent(h,D) = (\forall \in D) h(x) = c(x)$$
==== Consistent ====
Zaimplementuj funkcję //consistent// w pliku //consistent.m//
Pamietaj, ze hipoteza h jest spójna/zgodna ze zbiorem treningowym X i wartosciami C, wtedy i tylko wtedy gdy dla każdego elementu ze zbioru X zachodzi własność:
$h(x) = c(x)$
==== ListAllHypothesis ====
Zaimplementuj funkcję //listAllHypothesis// w pliku //listAllHypothesis.m//
**Zastanów się** Jaki rozmiar będzie miała przestrzeń wszystkich hipotez dla naszego przykładu?
==== ListThenEliminate ====
Zaimplementuj w pliku //listThenEliminate.m// algorytm wyszukujący //version-space// dla naszego zbioru uczącego.
Algorytm można opisać następująco:
- List all possible hypotheses based on attribute domains and assign it to $H$
- Remove from $H$ all hypotheses that are not consistant with $D$, where $D$ is a training set
- Output the list of hypotheses
===== Version Space i Prolog=====
W Octave programowanie tego typu zagadnień jest nieefektywne i trudne.
Znacznie łatwiej poruszać się w problematyce uczenia pojęć używając języka Prolog.
Wykorzystując pliki:
* animals.pl
* loandata.pl
* shapes.pl
* taxonomy.pl
* vs.pl
Prześledź i przeanalizuj działanie programu opisanego poniżej.
==== Używanie VS w trybie interaktywnym ====
?- ['vs'].
?- ['taxonomy'].
**Uwaga** Każde polecenie (łącznie z wprowadzonymi danymi) musi być zakończone znakiem kropki! "p" oznacza pozytywny przykład, "n" oznacza negatywny.
?- vs.
Type the first positive example:
| [red,square].
G-set: [[color, shape]]
S-set: [[red, square]]
Generate next example (y/n) ? n.
Type the example:
| [blue,rectangle].
Classification of the example ? [p/n] p.
G-set: [[color, shape]]
S-set: [[mono, 4-sided]]
Generate next example (y/n) ? n.
Type the example:
| [pink, triangle].
Classification of the example ? [p/n] n.
G-set: [[color, 4-sided], [mono, shape]]
S-set: [[mono, 4-sided]]
Generate next example (y/n) ? y.
Next example: [orange, rectangle]
Classification of the example ? [p/n] p.
The consistent generalization is:
[color, 4-sided]
==== Używanie VS w trybie wsadowym (przykłady są dostarczone w pliku)====
?- ['shapes'].
**Uwaga** Pliki //vs.pl// oraz //taxonomy.pl// muszą zostać również załadowane!
Pierwszy przykład jest uznawany jako pozytywny ("p"). Wszystkie pozostałe uznawane są za negatywne ("n"). To znaczy, aby nauczyć program jakiegoś pojęcia, przykład z tego pojęcia musi znaleźć się jako pierwszy w pliku.
?- batch.
+[red, square]
G-set: [[color, shape]]
S-set: [[red, square]]
+[blue, rectangle]
G-set: [[color, shape]]
S-set: [[mono, 4-sided]]
-[pink, triangle]
G-set: [[color, 4-sided], [mono, shape]]
S-set: [[mono, 4-sided]]
-[blue, ellipse]
G-set: [[color, 4-sided], [mono, polygon]]
S-set: [[mono, 4-sided]]
+[orange, square]
G-set: [[color, 4-sided]]
S-set: [[color, 4-sided]]
The consistent generalization is:
[color, 4-sided]
**Uwaga!** Pojęcie zostało nauczone po przeczytaniu ostatniego przykładu z pliku //shapes.pl//. Nie zawsze tak musi być. Dopuszczalne są dwie możliwości:
- Pojęcie zostaje nauczone przez końcem pliku W tym przypadku algorytm zatrzymuje się, mimo, ze może być więcej przykładów w pliku (pozytywne i negatywne) które są zgodne ("consistent") z pojęciem
- Algorytm osiąga przykład, który nie może zostać wcielony do //version space//. To znaczy - nie ma spójnych hipotez z dostarczonym zbiorem danych.
Poniżej przedstawiona została sytuacja pierwsza.
?- ['loandata'].
?- batch.
+[yes, comp, f, no]
G-set: [[?, ?, ?, ?]]
S-set: [[yes, comp, f, no]]
-[no, comp, f, yes]
G-set: [[?, ?, ?, no], [yes, ?, ?, ?]]
S-set: [[yes, comp, f, no]]
+[yes, comp, m, no]
G-set: [[?, ?, ?, no], [yes, ?, ?, ?]]
S-set: [[yes, comp, ?, no]]
+[yes, car, f, yes]
G-set: [[yes, ?, ?, ?]]
S-set: [[yes, ?, ?, ?]]
The consistent generalization is:
[yes, ?, ?, ?]
**Uwaga** =[yes, car, f, yes] nie jest ostatnim przykładem w pliku //lonedata.pl//
==== Niespójny zbiór danych (Wersja interaktywna)) ====
?- vs.
Type the first positive example:
| [red,square].
G-set: [[color, shape]]
S-set: [[red, square]]
Generate next example (y/n) ? y.
Next example: [red, triangle]
Classification of the example ? [p/n] n.
G-set: [[color, 4-sided]]
S-set: [[red, square]]
Generate next example (y/n) ? y.
Next example: [red, rectangle]
Classification of the example ? [p/n] p.
G-set: [[color, 4-sided]]
S-set: [[red, 4-sided]]
Generate next example (y/n) ? n.
Type the example:
| [blue,triangle].
Classification of the example ? [p/n] p.
There is no consistent concept description in this language !
**Uwaga** Przykład [blue,triangle] jest przykładem pozytywnym spoza //version space//. Ten przykład nie może być zawarty w pojęciu ponieważ w tym języku opisu pojęć nie dopuszczamy rozłącznych pojęć.
==== Niespójne hipotezy (Wersja wsadowa) ====
Przestaw 3 przykłady //neg// na początek pliku //shapes.pl// a anstępnie załaduj go.
Dzieki temu VS nauczy się teraz pojęć "neg".
?- ['shapes'].
?- batch.
+[pink, triangle]
G-set: [[color, shape]]
S-set: [[pink, triangle]]
-[red, square]
G-set: [[color, 3-sided], [poly, shape]]
S-set: [[pink, triangle]]
-[blue, rectangle]
+[blue, ellipse]
G-set: []
S-set: []
There is no consistent concept description in this language !
**Uwaga** Po -[blue, rectangle] G oraz S nie są pokazywane.
Dzieje się tak, ponieważ ograniczenia nie zmieniają się po przetworzeniu tego przykaldu.
==== Częściowe uczenie pojęć ====
?- ['animals'].
?- batch.
+[hair, t, t, land, f, f]
G-set: [[?, ?, ?, ?, ?, ?]]
S-set: [[hair, t, t, land, f, f]]
+[none, t, t, sea, f, f]
G-set: [[?, ?, ?, ?, ?, ?]]
S-set: [[?, t, t, ?, f, f]]
+[hair, t, t, sea, t, f]
G-set: [[?, ?, ?, ?, ?, ?]]
S-set: [[?, t, t, ?, ?, f]]
+[hair, t, t, air, f, f]
-[scales, f, f, sea, t, t]
G-set: [[?, ?, ?, ?, ?, f], [?, ?, t, ?, ?, ?], [?, t, ?, ?, ?, ?]]
S-set: [[?, t, t, ?, ?, f]]
-[scales, f, f, land, t, f]
G-set: [[?, ?, t, ?, ?, ?], [?, t, ?, ?, ?, ?]]
S-set: [[?, t, t, ?, ?, f]]
-[scales, f, f, sea, t, f]
-[feathers, f, t, air, t, f]
G-set: [[?, t, ?, ?, ?, ?]]
S-set: [[?, t, t, ?, ?, f]]
-[feathers, f, t, land, t, f]
-[none, f, f, land, t, f]
No more examples.
**Uwaga** Po przetworzeniu wszystkich przykładów zbiory G i S nie są zbieżne. W związku z tym otrzymujemy częściowo nauczone pojęcie i brak większej ilości przykładów do tego, aby osiągnąć jedną spójną hipotezę.
===== Ćwiczenie do domu =====
Generowanie wszystkich możliwych hipotez dla danego zbioru uczącego jest wysoce niewydajne w przypadku danych, których atrybuty moga przyjmować wiele wartości.
Algorytm //Candidate-Elimination// podaje wszystkie możliwe hipotezy pasujące do danego zbioru uczącego za pomocą dolnego G (najbardziej ogólnego ograniczenia zgodnego ze zbiorem uczącym) i górnego ograniczenia S (najbardziej szczegółowego ograniczenia zgodnego ze zbiorem uczącym):
{{:pl:dydaktyka:ml:cea.png|}}
Spróbuj zaimplementować algorytm //Candidate-Elimination// w Octave, bazując na instrukcjach: [[http://ai.ia.agh.edu.pl/wiki/_media/pl:prolog:prolog_lab:ml:zmv-ml-ch4.pdf|Instrukcje]]
===== Uwagi =====
* Wzór określający //consistent// nie był dla wszystkich jasny
* Trzeba omówić działanie algorytmu //Find-S//, tłumacząc dokładnie co to jest hipoteza i jakie wartości mogą przyjmować jej parametry (co oznacza //more general value//)
* Nie wystarcza czasu żeby zrobić część z Prologu