Tento dokument popisuje použití modelu pro klasifikaci bugů v interní bugzille (produkt Profinit_ITS) do více než dvou kategorií na principu naivního Bayesova klasifikátoru. Model vytěžuje text bugu, bayesovskými příznaky jsou jednotlivá slova, kategorie odpovídají komponentám produktu.

Základní myšlenka

Součástí každého bugu je slovní popis obsahu bugu. Kategorie bugů se mezi sebou liší tím, na jakou oblast jsou zaměřené, a tedy i použitým slovníkem. Výskyt určitých konkrétních slov může proto silně svědčit pro příslušnost k určité kategorii.

Metodika modelování

Použitá modifikace modelu naivního Bayesova klasifikátoru

Předpokládejme, že máme celkem r kategorií bugů. Označíme je \(C_1, C_2, \ldots, C_r\). Tradiční naivní Bayesův klasifikátor pro klasifikaci v rámci těchto kategorií používá Bayesův vzorec:

\({P(C_i|X_1, X_2, ..., X_k)} = \frac{P(X_1|C_i) \cdot P(X_2|C_i) \cdot \ldots \cdot P(X_k|C_i) \cdot P(C_i)}{P(X_1, X_2, \ldots, X_k)}\)

za předpokladu, že jevy \(X_i\) jsou vzájemně podmíněně nezávislé v rámci každé kategorie \(C_i\).

Apriorní pravděpodobnost \(P(C_i)\) odhadujeme z dat jako relativní četnost bugů kategorie \(C_i\) ze všech bugů. Korekční poměry \(P(X_j|C_i)\) odhadujeme z dat (bugů z kategorie \(C_i\)) jako podíl relativních četností opravený o tzv. Laplaceovu korekci.

V našem případě jsou jevy \(X_i\) reprezentovány výskytem jednotlivých slov v textu bugu. Je zřejmé, že to nebudou nezávislé jevy. Naivní Bayesův klasifikátor sice v praxi funguje dobře i při porušení předpokladu nezávislosti, zde ale každý bug obsahuje jiný počet slov. Tento problém lze řešit tím, že ve výše uvedeném vzorci na pravé straně alternativně namísto prostého součinu korekčních poměrů \(P(X_j|C_i)\) použijeme geometrický průměr těchto korekčních koeficientů (apriorní pravděpodobnosti do průměru nezahrnujeme):

\({P(C_i|X_1, X_2, ..., X_k)} = \frac{\sqrt[k]{P(X_1|C_i) \cdot P(X_2|C_i) \cdot \ldots \cdot P(X_k|C_i)} \cdot P(C_i)}{P(X_1, X_2, \ldots, X_k)}\)

Postup učení modelu a klasifikace:

  1. Na trénovací množině spočítáme vektor apriorních pravděpodobností a tabulku korekčních poměrů pro všechny kategorie a všechna slova (množinu slov lze omezit pomocí parametrů, např. jen slova s délkou v určitém rozmezí nebo slova s relativní četností výskytu nad určitým limitem).
  2. V klasifikovaném bugu rozdělíme text na jednotlivá slova.
  3. Každé slovo se pokusíme vyhledat v tabulce korekčních poměrů. V příznivém případě si zaznamenáme jeho korekční poměry pro jednotlivé kategorie.
  4. Pro každou kategorii \(C_i\) spočítáme čitatel zlomku na pravé straně Bayesova vzorce – vynásobíme mezi sebou korekční poměry za jednotlivá slova (případně z nich spočítáme geometrický průměr) a výsledek ještě vynásobíme apriorní pravděpodobností.
  5. Bug klasifikujeme do kategorie, pro niž je čitatel zlomku z předchozího bodu nejvyšší (má nejvyšší aposteriorní pravděpodobnost).
  6. Vedle první volby klasifikace (kategorie s nejvyšší aposteriorní pravděpodobností) ještě ke každému bugu zjistíme trojici kategorií s nejvyšší aposteriorní pravděpodobností (top3).

Vstupní data

Data pocházejí z bugzilly, produkt Profinit_ITS.

U každého bugu využijeme jen zařazení do komponenty (pro nás komponenta=kategorie) a text popisu bugu.

bugs = fread(file = "../../zdroje/bugs_Profinit_ITS_full.csv")

# cisteni - vypusteni bugu s divnym id (neni ctyrmistne nebo petimistne cislo)
bugs = bugs[between(nchar(bug_id), 4, 5)]

# ponechani jen relevantnich poli
bugs = bugs[, .(bug_id, thetext, name)]

Ukázka dat

Data obsahují údaje (řádky) za celkem 16 319 bugů.
Následující tabulka uvádí vzorek bugů v datech. Texty bugů jsou ve výpisu ořezány na max. 200 znaků.

Bugy – ukázka
name text
Pozadavky

Prosím povolit.

Díky moc, Mirek.

Pro povolení synchronizace zařízení s emailem PROFINIT založ prosím bug v interní BugZille. Pamatuj přitom na to, že je povolené mít synchronizované jen jedno za
Prava_Bugzilla_Interni

Ahoj,

prosím o práva do Interní Bugzilly na produkt DAG_TRADPO pro Ondřej Vojta

Prosím DM Michala Podzimka o schválení.

Díky.
Pozadavky

Ahoj,

tiskárna na recepci nám hlásí "“vyměňte nádobku na odpadní toner”".

Děkuji moc, Nikol
Pozadavky Prosím o zrušení samostatné schránky a zajištění, aby pošta zaslaná na tuto adresu chodila do schránky (Gmail). Obsah mailboxu
Pozadavky Dnes mi byl proveden reset hesla do VPN/Profisu. Ticket zadávám zpětně.
Licence_SW

Ahoj,

Chtěl bych požádat o licenci na Total Commander pro sebe a Lucku Vytlačilovou (kontext ČSOBP).
Nastup_vystup_lidi

Obecne informace Nastup: 1.9.2016 Jmeno: Marián Prijmeni: Krlička
Zeme: CZ Notebook od Profinitu: ano

Zridit vsechny pristupy: Ano (!Pouzijte, pokud bude mit uzivatel notebook od Profinit
Pozadavky

Ahoj,

prosím o reset hesla do domény.

Díky, D
Prava_SVN_Externi

Ahoj, prosim o read pravo do https://svn-externi.profinit.eu/svn/Sazka/ESB/

Je to v ramci prirpavy pro O2 na projekt CRoads

Lubor
VM_Servers

hostname: VM-SVAT-O2 IP: 193.85.191.169 DNS: N/A vCPU: 2 vRAM: 4 GB vHDD: 100 GB Os: CentOS 7 Net: DmzDevNet1 FW: outside -> tcp/80, tcp/8080

Pozadavek: bug 33352
Prava_SVN_Externi Prosim o pristup do externi SVN, konkretne do https://svn-externi.profinit.eu/svn/GEMoney/LiferayPortal/
Pozadavky

vyreseno s KBenesem. Poprosil jsme o vypnuti notifikace na confluence pro upravu termínu skoleni 2017.

Díky Karle,

H.
Pozadavky

Ahoj kluci,

chtěla bych poprosit o zřízení přístupu na SVN Komerční banky pro mojí maličkost. Díky Magda
Pozadavky Prosím o pridelenie licencie na MS Project. Potrebujem k tvorbe projektových plánov pro KB. Ďakujem.
Licence_SW

Ahoj,

potreboval bych licenci MS Project - potrebuji ho pro planovani prace v Cardif.

Diky. Oleg
Nastup_vystup_lidi

Obecne informace Nástup:1.10.2012 Jmeno:Lucie Prijmeni:Pazderová Pozice: Externista EE Zeme: CZ Notebook od Profinitu: ne

Zridit vsechny pristupy: Ne (!Pouzijte, pokud bude mit uzivatel n
Pozadavky Zapomněl své heslo do PC, prosím o reset. (Tento požadavek již vyřešil Najman Patrik (díky), zadávám jej zpětně)
Prava_EMail
Pozadavky

Ahoj,

potreboval by som zriadiť prístup do externej svn (čítanie a zápis):

https://svn-externi.profinit.eu/svn/sporitelna/CIC/NDM/MB/

Alex
VM_Servers

hostname: VM-PCCS-N2 IP: 172.16.200.49 vCPU: 2 vRAM: 6 GB vHDD: 55 GB Os: CentOS 6.4 64bit Net: devNet sda1 - 12 GB swap - 3 GB sdb1 - 40 GB

Pristup ma Pavel v mailu. P.
Prava_Bugzilla_Externi

Ahoj,

Prosím o zřízení přístupu do externí Bugzilly - produkt "“CSSZ - AAA vyvoj”"

pro uživatele

Pavel Šmejkal - Michal Chlupáč -

Hesla prosí
Nastup_vystup_lidi

Ahoj, Petr uz u nas na kontrole ntb byl, bude nutne aby dorazil jeste jednou kvuli nastaveni dalsich pristupu?

diky L.

Prechod z EE na EI


Incidenty

Porucha klavesnice na KVM. - Nereaguje na vstupni informace. - Pripojene servery: Gandalf, ACS, Marvin, Balicky-interni

Srv. Balicky-interni vyadava varovni akusticky signal.
Pozadavky Ahoj, v rámci projektu upgrade Magic úzce spolupracujeme s pracovníky ČAH/LP (formálně spadají pod naše vedení) - chtěl bych se zeptat, zda je možnost jim nějak zpřístupnit vývojový server vm-lp-ma
Pozadavky_na_HW Ahoj, zadam o schvaleni nakupu 17ks ntb nastupy/vymeny, soucasne zasoby jsou skoro u konce. P.
Pozadavky

Ahoj kluci,

mohl by nám to někdo přijít prosím vyměnit?

Díky Ivet :)
Prava_Bugzilla_Externi

Ahoj,

prosim o zalozeni kompotenty Ukoly do ext. BGZ v produktu Sberbank DWH:

Nazev: Úkoly Popis: Operativní úkoly projektu a požadavky na součinnost Default Assignee: Vaclav Faltus Default C
Pozadavky

Ahoj, potřeboval bych udělat účty v externí bugzille pro lidi z KB:

Michal Trnka - Lenka Milenovská -

A nastavit jim přístup do projektu KB_ITDS_EXT
Prava_SVN_Interni

Ahoj,

potřeboval bych přiřadit práva zápisu do struktury na interní SVN: https://svn-interni.profinit.lan/svn/ALD

Důvodem je participace na supportu v ALD.

Díky.

Tom
Licence_SW

Ahoj,

prosím o licenciu Enterprise Architect ve verzii Corporate, pre potreby projektu CutOver migrácie v TO2.

Radku, prosím o schválenie.

Dík, M.

Kategorie pro klasifikaci

V datech je celkem 40 kategorií. Rozdělení kategorií podle četností uvádí následující graf.

Pro klasifikaci vybereme vždy jen určitou množinu kategorií, zbylé zahrneme do společné kategorie Ostatní:

  1. prvních pět nejpočetnějších kategorií,
  2. všechny kategorie seřazené podle četnosti sestupně až po vyčerpání nejméně 90 % všech případů.
Kategorie – názvy
Pozadavky
Pozadavky_na_HW
Nastup_vystup_lidi
Prava_SVN_Externi
Prava_EMail
Incidenty
Prava_Bugzilla_Externi
Prava_File_System
Licence_SW
Prava_Confluence
Profis
Prava_GIT
VM_Servers
Prava_SVN_Interni
Ostatni

Preprocessing dat

Texty popisu bugu jsou upraveny takto:

  • je odstraněna diakritika,
  • nealfanumerické znaky jsou nahrazeny mezerami,
  • všechna písmena jsou převedena na malá,
  • posloupnost dvou nebo více mezer je nahrazena jedinou mezerou,
  • mezery na začátku a na konci textového pole jsou odstraněny.

Další explorace

Clusterování kategorií podle slovníku

Protože kategorií je hodně, může se stát, že některé kategorie nepůjde podle pouhého slovníku od sebe rozlišit. Podíváme se, jak se k sobě jednotlivé kategorie shlukují, použijeme klasické hierarchické shlukování. Jako metriku vzdálenosti dvou kategorií použijeme zobecněnou Jaccardovu vzdálenost:

Mějme slova \(S_1, S_2, \ldots, S_n\). Spočteme jejich relativní četnosti v kategorii A \(p_1, p_2, \ldots,p_n\) a v kategorii B \(q_1, q_2, \ldots,q_n\). Potom zobecněná Jaccardova podobnost kategorií A a B je

\(JSim(A,B) = \frac{\sum_i{min(p_i, q_i)}}{\sum_i{max(p_i, q_i)}}\)

a zobecněná Jaccardova vzdálenost kategorií A a B je \(JDist(A,B) = 1-JSim(A,B)\).

Použijeme slova, která mají délku mezi 2 a 1000 znaků a která se aspoň v jedné kategorii vyskytují s relativní četností aspoň 0.002.

Ze shlukování je vidět, že nejpodobnější si jsou kategorie Pozadavky a Ostatni. Znamenalo by to, že v kategorii Pozadavky jsou často bugy, které se nedají zařadit do některé ze 14 specifikovaných kategorií. Dále je zřejmé, že ke zmíněným kategoriím jsou blízké Incidenty a Pozadavky_na_HW. U těchto kategorií tak můžeme očekávat největší překryv slovníků, a tedy nejhorší fungování klasifikace.
Zcela specifická je kategorie Nastup_vystup_lidi.

Modelování

Projdeme krok za krokem proces učení modelu.

Parametry

Použijeme tyto hodnoty parametrů:

  • minimální délka slova (znaky): 2
  • maximální délka slova (znaky): 1000
  • minimální relativní četnost slova v některé kategorii: 0.002
  • koeficient Laplaceovy korekce: 1
  • geometrický průměr korekčních koeficientů namísto součinu: ne

Vypočteme vektor apriorních pravděpodobností a tabulku korekčních koeficientů.

Apriorní prpsti kategorií
kategorie prpst_prior
Pozadavky 0.360
Pozadavky_na_HW 0.080
Nastup_vystup_lidi 0.061
Prava_SVN_Externi 0.052
Prava_EMail 0.048
Incidenty 0.044
Prava_Bugzilla_Externi 0.041
Prava_File_System 0.040
Licence_SW 0.038
Prava_Confluence 0.035
Profis 0.033
Prava_GIT 0.031
VM_Servers 0.023
Prava_SVN_Interni 0.020
Ostatni 0.094
Nejčastější slova kategorie Pozadavky
name rel_01 rel_02 rel_03 rel_04 rel_05 rel_06
ahoj 0.666 0.630 0.204 0.599 0.592 0.570
prosim 0.627 0.462 0.259 0.798 0.731 0.601
diky 0.475 0.421 0.071 0.458 0.481 0.425
na 0.440 0.512 0.494 0.397 0.355 0.453
pro 0.328 0.262 0.505 0.529 0.246 0.399
do 0.314 0.177 0.297 0.647 0.332 0.405
dekuji 0.250 0.232 0.167 0.216 0.211 0.198
se 0.240 0.252 0.473 0.068 0.186 0.190
to 0.210 0.178 0.011 0.080 0.172 0.191
je 0.188 0.238 0.015 0.083 0.188 0.183
Nejčastější slova kategorie Pozadavky_na_HW
name rel_01 rel_02 rel_03 rel_04 rel_05 rel_06
ahoj 0.666 0.630 0.204 0.599 0.592 0.570
na 0.440 0.512 0.494 0.397 0.355 0.453
prosim 0.627 0.462 0.259 0.798 0.731 0.601
diky 0.475 0.421 0.071 0.458 0.481 0.425
bych 0.134 0.278 0.003 0.085 0.102 0.101
pro 0.328 0.262 0.505 0.529 0.246 0.399
se 0.240 0.252 0.473 0.068 0.186 0.190
je 0.188 0.238 0.015 0.083 0.188 0.183
dekuji 0.250 0.232 0.167 0.216 0.211 0.198
notebooku 0.029 0.205 0.113 0.001 0.008 0.012
Nejčastější slova kategorie Nastup_vystup_lidi
name rel_01 rel_02 rel_03 rel_04 rel_05 rel_06
pristupy 0.037 0.002 0.804 0.033 0.008 0.020
email 0.030 0.004 0.798 0.016 0.066 0.019
profinit 0.176 0.030 0.794 0.705 0.281 0.204
od 0.050 0.066 0.792 0.024 0.025 0.051
bugzilla 0.035 0.010 0.789 0.166 0.008 0.048
eu 0.095 0.014 0.789 0.543 0.215 0.121
jmeno 0.013 0.004 0.789 0.014 0.006 0.009
svn 0.038 0.005 0.789 0.934 0.003 0.064
confluence 0.043 0.002 0.788 0.018 0.013 0.087
cz 0.053 0.047 0.788 0.172 0.021 0.081

Ukázka klasifikace

Klasifikaci předvedeme na bugu s textem:
ahoj potrebuju nastavit tiskarny sedim v nultem patre u michala petrika diky pepa.
Budeme klasifikovat podle případu a), tj. pět kategorií + kategorie Ostatni.

  1. Text rozdělíme na slova a ponecháme jen slova s delkou v povolenem rozmezi: ahoj, potrebuju, nastavit, tiskarny, sedim, nultem, patre, michala, petrika, diky, pepa
  2. Vyhledám postupně všechna slova v tabulce korekčních koeficientů, některá slova v ní nebudou (zejména proto, že jsou příliš řídká)
name rel_01 rel_02 rel_03 rel_04 rel_05 rel_06
ahoj 0.666 0.630 0.204 0.599 0.592 0.570
diky 0.475 0.421 0.071 0.458 0.481 0.425
michala 0.020 0.013 0.028 0.024 0.005 0.030
nastavit 0.025 0.005 0.001 0.016 0.019 0.020
patre 0.011 0.015 0.001 0.001 0.001 0.003
pepa 0.003 0.008 0.001 0.002 0.005 0.002
petrika 0.002 0.001 0.001 0.001 0.001 0.004
potrebuju 0.009 0.005 0.001 0.013 0.006 0.007
sedim 0.002 0.009 0.001 0.001 0.001 0.001
tiskarny 0.009 0.005 0.001 0.001 0.001 0.002
  1. Spočítám po sloupcích součin korekčních koeficientů, tím mi vznikne vektor součinů. Ten pak po jednotlivých položkách vynásobím vektorem apriorních pravděpodobností.
kategorie prpst_posterior
Pozadavky 3.985e-19
Pozadavky_na_HW 3.584e-20
Nastup_vystup_lidi 2.448e-26
Prava_SVN_Externi 3.185e-22
Prava_EMail 1.017e-22
Ostatni 2.029e-20
  1. Zmíněný bug bude klasifikován do kategorie č. 1 (Pozadavky), neboť tato kategorie má nejvyšší hodnotu celkového součinu (čitatele zlomku na pravé straně Bayesova vzorce). Z tabulky můžu zjistit k bugu i top3 kategorie (tři kategorie s nejvyšším celkovým součinem).

Vyhodnocení modelu

Vyhodnocení klasifikačních schopností modelu provedu pomocí cross-validace:

  • Rozdělím data na několik stejných částí (10).
  • Postupně každou část oddělím jako testovací množinu a na zbytku naučím model.
  • Pomocí naučeného modelu testovací množinu oklasifikuji.
  • Shodu klasifikace se skutečností vyhodnotím pomocí vhodných metrik.

Jako vhodné metriky přicházejí v úvahu:

  • accuracy (podíl bugů klasifikovaných do správné kategorie)
  • accuracy v top3 (podíl bugů, u nichž některá z kategorií top3 odpovídá správné kategorii)
  • podíl true positives pro jednotlivé kategorie (jaký podíl z bugů v dané kategorii byl skutečně do této kategorie i klasifikován)
  • podíl true positives v top3 pro jednotlivé kategorie (to samé, ale pro shodu správné kategorie s některou v top3)

Parametrizace modelu je stejná jako výše.

5 nejpočetnějších kategorií + Ostatni

Použijeme pět nejpočetnějších kategorií a zbytek zahrneme do kategorie Ostatni – tato kategorie je tedy o něco větší než ta, kterou jsme se zabývali v kapitole Clusterování kategorií podle slovníku.
Při pouhých šesti kategoriích budeme pro klasifikaci sledovat jen jedinou (nejlepší nabídnutou) kategorii, nemá smysl sledovat nabídku tří nejvhodnějších.

Skutečná a klasifikovaná kategorie – abs. četnosti
kateg_skut Pozadavky Pozadavky_na_HW Nastup_vystup_lidi Prava_SVN_Externi Prava_EMail Ostatni
Pozadavky 2617 872 145 217 536 1480
Pozadavky_na_HW 47 1191 4 1 2 68
Nastup_vystup_lidi 36 3 943 1 1 11
Prava_SVN_Externi 7 0 0 797 0 41
Prava_EMail 70 1 1 16 638 65
Ostatni 799 387 32 681 227 4382
Klasifikace podle skutečné kategorie – rel. četnosti (%)
kateg_skut Pozadavky Pozadavky_na_HW Nastup_vystup_lidi Prava_SVN_Externi Prava_EMail Ostatni
Pozadavky 44.6 14.9 2.5 3.7 9.1 25.2
Pozadavky_na_HW 3.6 90.7 0.3 0.1 0.2 5.2
Nastup_vystup_lidi 3.6 0.3 94.8 0.1 0.1 1.1
Prava_SVN_Externi 0.8 0.0 0.0 94.3 0.0 4.9
Prava_EMail 8.8 0.1 0.1 2.0 80.7 8.2
Ostatni 12.3 5.9 0.5 10.5 3.5 67.3

Hodnota metriky accuracy je 0.648.

Z tabulek a grafů vyplývá, že bugy patřící do jiných kategorií než Pozadavky a Ostatni jsou klasifikovány s vysokou přesností (okolo 90 %). V kategoriích Pozadavky a Ostatni je přesnost klasifikace mnohem nižší. V kategorii Pozadavky je to vlastně příznivý výsledek, protože tato kategorie obsahuje mnoho bugů, které ve skutečnosti patří jinam, jen to autor bugu při založení z nějakého důvodu neudělal. Kategorie Ostatni pak zahrnuje velmi mnoho různých málo početných kategorií, z nichž některé jsou blízké početným kategoriím (Incidenty a Pozadavky_na_HW, Prava_SVN_Interni a Prava_SVN_Externi apod.).

Pokud se omezíme jen na jiné kategorie než Pozadavky a Ostatni, je upravená metrika accuracy rovna 0.905.

Podíváme se ještě, do jakých kategorií jsou klasifikovány bugy patřící do kategorií Pozadavky, resp. Ostatni.

Nejpočetnější kategorie vyčerpávající 90 % + Ostatni

Skutečná a klasifikovaná kategorie – abs. četnosti
kateg_skut Pozadavky Pozadavky_na_HW Nastup_vystup_lidi Prava_SVN_Externi Prava_EMail Incidenty Prava_Bugzilla_Externi Prava_File_System Licence_SW Prava_Confluence Profis Prava_GIT VM_Servers Prava_SVN_Interni Ostatni
Pozadavky 1015 441 124 75 343 1567 628 314 80 87 344 226 292 194 137
Pozadavky_na_HW 62 984 5 1 3 176 10 2 6 0 7 1 32 11 13
Nastup_vystup_lidi 30 1 943 1 2 4 8 1 0 0 5 0 0 0 0
Prava_SVN_Externi 6 0 0 702 0 26 69 0 0 1 5 5 0 30 1
Prava_EMail 44 1 2 4 549 107 30 4 6 2 18 9 1 4 10
Incidenty 18 26 1 2 7 617 8 5 1 1 9 1 7 5 7
Prava_Bugzilla_Externi 7 0 0 33 0 23 598 0 0 0 6 0 0 2 1
Prava_File_System 18 2 0 2 1 37 6 533 3 6 13 2 0 21 1
Licence_SW 17 1 0 2 2 68 7 4 481 1 2 2 7 3 21
Prava_Confluence 9 0 1 7 0 31 14 7 1 468 16 11 1 11 0
Profis 5 0 2 1 0 68 11 10 2 0 439 0 1 0 1
Prava_GIT 6 0 0 0 1 26 7 0 1 4 3 443 0 7 1
VM_Servers 6 1 0 0 0 26 4 0 2 1 3 0 337 1 2
Prava_SVN_Interni 3 0 0 14 0 15 8 3 1 1 1 1 0 271 1
Ostatni 66 26 2 12 56 401 121 64 137 6 61 21 45 73 451
Klasifikace podle skutečné kategorie – rel. četnosti (%)
kateg_skut Pozadavky Pozadavky_na_HW Nastup_vystup_lidi Prava_SVN_Externi Prava_EMail Incidenty Prava_Bugzilla_Externi Prava_File_System Licence_SW Prava_Confluence Profis Prava_GIT VM_Servers Prava_SVN_Interni Ostatni
Pozadavky 17.3 7.5 2.1 1.3 5.8 26.7 10.7 5.4 1.4 1.5 5.9 3.9 5.0 3.3 2.3
Pozadavky_na_HW 4.7 74.9 0.4 0.1 0.2 13.4 0.8 0.2 0.5 0.0 0.5 0.1 2.4 0.8 1.0
Nastup_vystup_lidi 3.0 0.1 94.8 0.1 0.2 0.4 0.8 0.1 0.0 0.0 0.5 0.0 0.0 0.0 0.0
Prava_SVN_Externi 0.7 0.0 0.0 83.1 0.0 3.1 8.2 0.0 0.0 0.1 0.6 0.6 0.0 3.6 0.1
Prava_EMail 5.6 0.1 0.3 0.5 69.4 13.5 3.8 0.5 0.8 0.3 2.3 1.1 0.1 0.5 1.3
Incidenty 2.5 3.6 0.1 0.3 1.0 86.3 1.1 0.7 0.1 0.1 1.3 0.1 1.0 0.7 1.0
Prava_Bugzilla_Externi 1.0 0.0 0.0 4.9 0.0 3.4 89.3 0.0 0.0 0.0 0.9 0.0 0.0 0.3 0.1
Prava_File_System 2.8 0.3 0.0 0.3 0.2 5.7 0.9 82.6 0.5 0.9 2.0 0.3 0.0 3.3 0.2
Licence_SW 2.8 0.2 0.0 0.3 0.3 11.0 1.1 0.6 77.8 0.2 0.3 0.3 1.1 0.5 3.4
Prava_Confluence 1.6 0.0 0.2 1.2 0.0 5.4 2.4 1.2 0.2 81.1 2.8 1.9 0.2 1.9 0.0
Profis 0.9 0.0 0.4 0.2 0.0 12.6 2.0 1.9 0.4 0.0 81.3 0.0 0.2 0.0 0.2
Prava_GIT 1.2 0.0 0.0 0.0 0.2 5.2 1.4 0.0 0.2 0.8 0.6 88.8 0.0 1.4 0.2
VM_Servers 1.6 0.3 0.0 0.0 0.0 6.8 1.0 0.0 0.5 0.3 0.8 0.0 88.0 0.3 0.5
Prava_SVN_Interni 0.9 0.0 0.0 4.4 0.0 4.7 2.5 0.9 0.3 0.3 0.3 0.3 0.0 85.0 0.3
Ostatni 4.3 1.7 0.1 0.8 3.6 26.0 7.8 4.2 8.9 0.4 4.0 1.4 2.9 4.7 29.2

Hodnota metriky accuracy je 0.541 a metriky accuracy v top3 je 0.789.

Při vysokém počtu kategorií se přesnost klasifikace z logického důvodu snížila. Stále však platí, že bugy patřící do většiny kategorií mimo Pozadavky a Ostatni jsou klasifikovány s přesností nad 60 %. V kategoriích Pozadavky, Ostatni a v kategoriích jim podobných z hlediska slovníku (viz kapitolu Clusterování kategorií podle slovníku) je přesnost klasifikace mnohem nižší.

Pokud se omezíme jen na jiné kategorie než Pozadavky a Ostatni, je upravená metrika accuracy rovna 0.827 a upravená metrika accuracy v top3 rovna 0.939.

Podíváme se opět, do jakých kategorií jsou klasifikovány bugy patřící do kategorií Pozadavky, resp. Ostatni.

Export dat

Do samostatných souborů vyexportujeme případy z kategorií Pozadavky a Ostatni, abychom je mohli podrobně prozkoumat.

fwrite(bugs[target=="Pozadavky" & klasif!="Pozadavky", .(bug_id, name, target, klasif, thetext)],
       file="klasifikovano-jinam-pozadavky.csv",
       row.names=FALSE, col.names=TRUE)
fwrite(bugs[target=="Ostatni" & klasif!="Ostatni", .(bug_id, name, target, klasif, thetext)],
       file="klasifikovano-jinam-ostatni.csv",
       row.names=FALSE, col.names=TRUE)

Modifikace klasifikátoru

Pojetí klasifikátoru popsané v předchozím textu a konkrétní hodnoty parametrů samozřejmě nejsou jediné možné. Má smysl uvažovat o různých modifikacích, např.:

  1. jiné hodnoty parametrů (limity pro délku slov, použití geometrického průměru, koeficient Laplaceovy korekce) – použité hodnoty jsou na začátku zdejší kapitoly Modelování
  2. rozlišit počet výskytů slova v bugu (nyní se rozlišuje jen přítomnost a nepřítomnost)
  3. místo slov uvažovat jako příznaky fragmenty (n-gramy)

Body 1 a 3 jsme zatím prozkoumali testováním alternativních scénářů. Ty zahrnují dvě různé metody text-miningu (metoda word dělí text na slova, metoda substr dělí text na n-gramy neboli podřetězce s pevnou délkou) a různé hodnoty parametrů. Každý scénář byl aplikován na stejná data s klasifikací do 15 kategorií a z cross-validace byly získány metriky accuracy v základní a upravené podobě. Následující tabulka uvádí scénáře seřazené podle metriky accuracy na kategoriích mimo Pozadavky a Ostatni.

Vyhodnocení různých parametrizací klasifikátoru
metoda base cetnost_min delka_min delka_max geom_prum accuracy accuracy_bez_Poz_Ost accuracy_top3 accur_top3_bez_Poz_Ost
word 1.0 0.002 3 1000 ne 0.550 0.832 0.787 0.940
word 1.0 0.002 2 1000 ne 0.542 0.827 0.792 0.939
word 1.0 0.000 2 1000 ne 0.525 0.825 0.739 0.940
word 0.5 0.002 2 1000 ne 0.564 0.825 0.857 0.935
word 1.0 0.005 2 1000 ne 0.552 0.823 0.839 0.935
word 1.0 0.002 1 1000 ne 0.542 0.821 0.795 0.937
word 0.5 0.005 2 1000 ne 0.572 0.820 0.884 0.928
word 1.0 0.002 4 1000 ne 0.545 0.818 0.774 0.932
word 2.0 0.002 2 1000 ne 0.512 0.816 0.706 0.935
word 1.0 0.010 2 1000 ne 0.557 0.813 0.863 0.925
word 0.5 0.010 2 1000 ne 0.571 0.810 0.891 0.920
word 1.0 0.020 2 1000 ne 0.563 0.801 0.874 0.917
word 5.0 0.002 2 1000 ne 0.473 0.791 0.608 0.913
word 1.0 0.050 2 1000 ne 0.558 0.776 0.869 0.899
word 1.0 0.100 2 1000 ne 0.527 0.701 0.843 0.860
substr 1.0 0.002 2 4 ne 0.454 0.522 0.771 0.740
substr 1.0 0.002 2 4 ne 0.454 0.522 0.770 0.741
substr 1.0 0.002 3 4 ne 0.464 0.477 0.772 0.709
substr 1.0 0.002 2 3 ne 0.403 0.402 0.722 0.641
substr 1.0 0.002 3 3 ne 0.428 0.349 0.713 0.567
substr 1.0 0.002 4 4 ne 0.446 0.337 0.713 0.571
substr 1.0 0.002 2 2 ne 0.380 0.231 0.655 0.480
substr 1.0 0.002 3 3 ano 0.423 0.142 0.715 0.488
word 0.5 0.002 2 1000 ano 0.434 0.130 0.880 0.781
word 1.0 0.002 2 1000 ano 0.431 0.127 0.872 0.767
word 0.5 0.005 2 1000 ano 0.430 0.124 0.869 0.761
substr 1.0 0.002 4 4 ano 0.422 0.120 0.709 0.474
word 0.5 0.010 2 1000 ano 0.426 0.120 0.855 0.735
substr 1.0 0.002 3 4 ano 0.423 0.119 0.748 0.543
substr 1.0 0.002 2 3 ano 0.407 0.092 0.710 0.474
substr 1.0 0.002 2 2 ano 0.356 0.001 0.648 0.362

Závěry

  • Naivní Bayesův klasifikátor na slova velmi dobře funguje pro klasifikaci do více kategorií, je ale potřeba tyto kategorie citlivě vybrat, protože některé dvojice si jsou podobné.
  • Kategorie Pozadavky a Ostatni vyžadují konzultaci s Profinit ITS. Zdá se, že klasifikátor je schopen velmi dobře rozpoznat správnou kategorii pro bug zadaný původně do kategorie Pozadavky, je to ale potřeba ověřit na vzorku konkrétních případů. U bugů patřících do některé z málo početných kategorií (shrnutých pod Ostatni) klasifikátor pravděpodobně selhává, je to ovšem potřeba také ověřit na konkrétních případech.
  • Při větším počtu kategorií velmi dobře funguje nabídka tří doporučovaných kategorií pro klasifikaci – správná kategorie je v této nabídce s pravděpodobností nad 0,9.
  • Výhodou klasifikátoru je adaptivnost – průběžně se může učit nová slova, jakmile se začnou objevovat dostatečně často, přepočítávat korekční koeficienty, zároveň uživatel může poskytovat zpětnou vazbu opravou chybné automatické klasifikace.