====== Spam filter - krok 3 ======
Vytvořte sadu tříd a funkcí potřebných k posouzení kvality filtru.
[[.unit_testing|Testy]] ke kroku 3:
* samostatně {{test3_quality.zip|}} nebo
* společně se všemi předchozími testy {{test3_all.zip|}}.
===== Příprava =====
Prostudujte si:
* V článku [[http://en.wikipedia.org/wiki/Special:Search/Binary_Classification|Binary Classification]] najděte a pochopte význam zkratek TP, FP, TN, FN.
Na kus papíru napište:
* co podle vás tyto zkratky znamenají pro problém filtrování spamu
* co budeme potřebovat, abychom tyto statistiky mohli napočítat
===== Matice záměn =====
Úkol:
* V modulu ''confmat.py'' vytvořte třídu ''BinaryConfusionMatrix''.
* Třída bude obalovat čtveřici statistik TP, TN, FP, FN nutných pro hodnocení filtru.
* Při vytváření třídy bude nutné specifikovat parametry ''pos_tag'' a ''neg_tag'', tedy jaké hodnoty se mají považovat za pozitivní a jaké za negativní (bude tedy použitelná obecně, nikoli jen pro kódy 'SPAM' a 'OK').
* Při testování spam filtru bude ''pos_tag="SPAM"'' a ''neg_tag="OK"''
* Po vytvoření instance budou všechny čtyři hodnoty nastaveny na 0.
* Třída bude mít metodu ''as_dict()'', která vrátí matici záměn ve formě slovníku s položkami ''tp, tn, fp, fn''.
* Třída bude mít metodu ''update(truth, prediction)'', která zvýší hodnotu příslušného čítače (TP, TN, FP, nebo FN) o 1 na základě porovnání hodnot proměnných ''truth'' a ''prediction'' s hodnotami ''pos_tag'' a ''neg_tag''. Bude-li hodnota některého z parametrů ''truth'' nebo ''prediction'' různá od ''pos_tag'' i ''neg_tag'', metoda vyhodí výjimku ''ValueError''.
* Třída bude mít metodu ''compute_from_dicts(truth_dict, pred_dict)'', která napočítá statistiky TP, TN, FP a FN ze dvou slovníků: v prvním bude správná klasifikace emailů, ve druhém klasifikace emailů predikovaná filtrem.
K čemu nám to bude:
* Třída ''BinaryConfusionMatrix'' bude tvořit základ pro hodnocení úspěšnosti filtru.
* Třídu bude možno používat následujícim způsobem:
>>> cm1 = BinaryConfusionMatrix(pos_tag=True, neg_tag=False)
>>> cm1.as_dict()
{'tp': 0, 'tn': 0, 'fp': 0, 'fn': 0}
>>> cm1.update(True, True)
>>> cm1.as_dict()
{'tp': 1, 'tn': 0, 'fp': 0, 'fn': 0}
>>> truth_dict = {'em1': 'SPAM', 'em2': 'SPAM', 'em3': 'OK', 'em4':'OK'}
>>> pred_dict = {'em1': 'SPAM', 'em2': 'OK', 'em3': 'OK', 'em4':'SPAM'}
>>> cm2 = BinaryConfusionMatrix(pos_tag='SPAM', neg_tag='OK')
>>> cm2.compute_from_dicts(truth_dict, pred_dict)
>>> cm2.as_dict()
{'tp': 1, 'tn': 1, 'fp': 1, 'fn': 1}
Třída tedy bude mit alespoň 3 veřejné metody: ''as_dict()'', ''update()'' a ''compute_from_dicts()''.
^ as_dict() ^ Vrátí matici záměn ve formě slovníku. ^
^ Vstup: | Nic. |
^ Výstup: | Slovník obsahující klíče tp, tn, fp, fn a jejich hodnoty. |
^ Efekty: | Nic. |
^ update(truth, pred) ^ Zvyš hodnotu jednoho ze 4 čítačů podle hodnot ''truth'' a ''pred''. ^
^ Vstup: | Skutečná a predikovaná třída. |
^ Výstup: | Nic. |
^ Efekty: | Zvýšení hodnoty jednoho z čítačů TP, TN, FP, FN, nebo výjimka ''ValueError''. |
^ compute_from_dicts(truth_dict, pred_dict) ^ Napočítej celou matici záměn na základě hodnot uložených ve slovnících. ^
^ Vstup: | Slovníky obsahující skutečné a predikované třídy pro množinu objektů (emailů). |
^ Výstup: | Nic. |
^ Efekty: | Prvky matice se nastaví na počty pozorovaných TP, TN, FP, FN. |
**Pozn.**: Můžete očekávat, že slovníky budou mít stejnou množinu klíčů. Rozmyslete si ale, jak byste chtěli, aby se metoda chovala v případě, že bychom jí předali slovníky s různými množinami klíčů.
>{{page>..:..:internal:cviceni:spam:krok3#binaryconfusionmatrix&editbtn}}
===== Funkce ''quality_score()'' =====
Úkol:
* Vytvořte funkci ''quality_score(tp, tn, fp, fn)'' v modulu ''quality.py''.
* Funkce spočte skóre kvality z předaných hodnot matice záměn (viz [[courses:b4b33rph:cviceni:spam:specifikace#mira_kvality_filtru|Spam filter: Specifikace]]).
^ ''quality_score(tp, tn, fp, fn) '' Vypočti skóre kvality pro danou matici záměn. ^^
^ Vstupy | Čtveřice hodnot TP, TN, FP, FN. |
^ Výstupy | Číslo mezi 0 a 1 udávající naši míru kvality predikce. |
>{{page>..:..:internal:cviceni:spam:krok3#quality_score&editbtn}}
===== Funkce ''compute_quality_for_corpus()'' =====
Náseldující specifikace pro funkci ''compute_quality_for_corpus()'' jsou povinné a musíte jim vyhovět!
Úkol:
* V modulu ''quality.py'' vytvořte funkci ''compute_quality_for_corpus(corpus_dir)'', která ohodnotí kvalitu predikcí (filtru) na základě údajů v souborech ''!truth.txt'' a ''!prediction.txt'' v zadaném korpusu.
* Skutečnou i predikovanou klasifikaci umíte načíst ve formě slovníků pomocí ''read_classification_from_file()''.
* Matici záměn pro daný korpus z načtených slovníků umíte vytvořit pomocí metody ''compute_from_dicts()'' třídy ''BinaryConfusionMatrix''.
* Skóre kvality z prvků matice záměn umíte spočítat funkcí ''quality_score()''.
K čemu nám to bude:
* Funkce bude sloužit k hodnocení úspěšnosti filtru.
* unit test k této funkci přepokládá nastavení ''pos_tag="SPAM"'' a ''neg_tag="OK"'', které odpovídá finálnímu spam filtru.
^ ''compute_quality_for_corpus(corpus_dir)'' ^ Vypočti kvalitu predikcí v korpusu. ^
^ Vstupy | Adresář ohodnoceného korpusu (obsahující soubory ''!truth.txt'' a ''!prediction.txt''). |
^ Výstupy | Číslo mezi 0 a 1 udávající naši míru kvality predikce. |
>{{page>..:..:internal:cviceni:spam:krok3#compute_quality_for_corpus&editbtn}}