FAQ4: Maskininlärning

  1. Fråga: kan man utgå från att endast två klasser finns i Uppgift1, när predikatet classes skall definieras?

    Svar: Nej, det kan ju finnas fler klasser, även om det inte är fallet i den aktuella träningsmängden.

  2. Fråga: Vad står de olika argumenten i decision_tree(Es,As,D,T) för?

    Svar: Predikatet decision_tree(Es,As,D,T) tar som indata en lista med exempel Es, en lista med attribut As och en defaultklass D och konstruerar ett beslutsträd T.

    Elementen i Es antas vara representerade på följande sätt:

    E = (c,[(A1,V1), ..., (An,Vn)]) där c är en klass och (Ai,Vi), 1<=i<=n, är ett par där Ai är ett attribut och Vi är ett värde.

    Beslutsträdet T representeras på följande sätt:

    T = class(c), där c är en klass, eller

    T = (A, [(V1,T1), ..., (Vn,Tn)]) där A är ett attribut, V1, ..., Vn är de möjliga värdena på attributet A, och där T1, ..., Tn är beslutsträd.

    T.ex. (gäster,[(inga,class(nej)),(några,class(ja)),(fullsatt,(väntetid[...]))]) representerar ett beslutsträd där roten med attributet gäster har ett subträd för varje värde på attributet, och där de två första subträden endast innehåller klasser medan det tredje har attributet väntetid i roten.

  3. Fråga: Hur beräknas egentligen den kvarvarande informationen för ett attribut?

    Svar: Här hittar du ett program som gör det.

  4. Fråga: Hur kommer anropen av classes/2, best_attribute/5 och classify/3 se ut?

    Svar: T.ex. ?- classes([(pos,[(a1,1),(a2,2)]),(neg,[(a1,3),(a2,3)]),(pos,[(a1,3),(a2,2)])],C).
    C = [(pos,2),(neg,1)]
    och ?- Es = [(pos,[(a1,1),(a2,2)]),(neg,[(a1,3),(a2,3)]),(pos,[(a1,3),(a2,2)])],
    best_attribute(Es,[a1,a2],A,AsRest,VEs). skall binda A till ett av attributen (det mest informativa av a1 och a2,
    antag att det är a2), AsRest blir en lista med attribut som inte har valts (dvs. [a1]),
    och VEs blir en lista med lika många element som a2 har möjliga värden (låt säga att a2 kan anta värdena 1,2 och 3), t.ex. [(1,[]),(2,[(pos,[(a1,1),(a2,2)]),(pos,[(a1,3),(a2,2)])]),(3,[(neg,[(a1,3),(a2,3)])])].
    Ett anrop av classify/3 skulle kunna se ut på följande sätt:
    ?- classify([(a1,3),(a2,3)],(a2,[(1,class(pos)),(2,class(pos)),(3,class(neg))]),C).
    C=neg

  5. Fråga: Hur skapar man listan Es av exempelmängden (från en fil) så att programmet kan köra?

    Svar: Ett sätt är att ladda in filen, t.ex. med ['Träningsexempel.pl'], och sedan samla upp exemplena i en lista med findall,
    t.ex. med findall((Class,Attributes), example(Class,Attributes), Es). För ytterligare detaljer se nästa fråga.

  6. Fråga: Exempelpredikaten i test och träningsmängden är skrivna på exakt samma form. Hur skall vi få vårt program att skilja på dessa mängder om vi vill lösa uppgiften under samma körning av SICStus? En lösning (i vårt tycke inte så snygg) vore att döpa om exemplen i testmängden till t ex exempel2(Class, Attribute) och på så sätt särskilja dem åt. Är detta en godkänd lösning?

    Svar: Det är absolut godkänt! Ett alternativt sätt är helt enkelt att först ladda in den ena filen, bygga trädet, och sedan ladda in den andra (SICStus kommer då att fråga om den ursprungliga definitionen av example/2 skall ersättas, varpå man kan svara 'y'), och sedan klassificera exemplena. Det vill säga, den övergripande frågan kommer se ut på följande sätt:
    ?- ['Träningsexempel.pl'],
    findall((Class,Attributes), example(Class,Attributes),TrainingExamples),
    classes(TrainingExamples,[(DefaultClass,_)|_]),
    findall(Attribute,attribute(Attribute,_),AllAttributes),
    decision_tree(TrainingExamples,AllAttributes,DefaultClass,Tree),
    ['Testexempel.pl'],
    findall((Class,Attributes), example(Class,Attributes),TestExamples),
    test_classification(TestExamples,Tree).


Om din aktuella frågeställning inte finns med så kan hjälp erhållas från tony@dsv.su.se eller i FirstClass (underkonferensen AI Handledning i konferensen AI).