Analiza mišljenja strojnim učenjem

Big data / Poslovna analitika / Rudarenje podataka

Analiza mišljenja strojnim učenjem

U prošlom članku smo govorili o analizi mišljenja pomoću rječnika, a za ovaj sam Vam obećao analizu mišljenja pomoću strojnog učenja. Kao što ćete vidjeti u ovom modelu, sličnosti s prethodnikom su dosta velika, no ključna razlika je ta što je ovdje logika nekako obrnuta. Dakle, početna točka su nam kao i uvijek tvitovi, no ovaj put je nužno imati već unaprijed ocijenjene tvitove i to je ta ključna razlika. Dakle, obično se uzme neki broj već unaprijed („ručno“) ocijenjenih tvitova, gdje zapravo pripremamo teren za klasifikacijske algoritme (strojno učenje). Kao što možete vidjeti na slici ispod, pored svakog tvita osoba zadužena za ocjenjivanje stavi da li je taj tvit pozitivan ili negativan. Osim podjele tvitova na dvije kategorije, postoje metodologije i koje ih dijele na više kategorija, no mi smo se odlučili za dvije krajnosti – pozitivno vs negativno.

tvitovi

Tvitovi – klikni za uvećanje

Ono što je ključno u ovoj fazi je činjenica da više tvitova doprinosi boljem učenju od strane algoritma što dovodi do bolje klasifikacije budućih tvitova koje dobijemo. Poželjna brojka bi bila oko 5 000 tvitova, no naš cilj je 10 000 tvitova od kojih je 5 000 pozitivno, a 5 000 negativno. Također, bilo bi dobro da je više osoba uključeno u ocjenjivanje (klasifikaciju) tih tvitova tako da možemo vidjeti eventualne nesuglasice oko polariteta nekog tvita, jer je i ljudima nekada teško prepoznati polaritet. Nakon što smo nabavili dovoljno tvitova ubacujemo ih u KNIME, bilo preko excela, csv ili nečeg trećeg. Zatim slijedimo korake koji su više-manje isti u odnosu na analizu mišljenja pomoću rječnika što smo prošli put predstavili.

glavni model

Glavni model – klikni za uvećanje

Iz slike možete vidjeti da nakon učitanih tvitova slijedi konverzija istih u format Document (prošli put smo govorili zašto), te pozitivne i negativne tvitove spajamo u jednu tablicu pomoću Concatenate. Kad ih imamo sve na jednom mjestu slijedi „preprocessing“. Prije ulaska u detalje preprocessinga bitno je naglasiti da su u koraku String to Document označeni svi tvitovi s oznakom pozitivan ili negativan ovisno iz kojeg excela je došao što će nam kasnije pomoći kod učenja algoritma. Dakle, te oznake su skrivene unutar svakog pojedino Documenta (u našem slučaju je to tvit). Kad govorimo o preprocessingu vidjet ćete da su nodovi gotovo identično kao u prethodnom članku te idu redom:

  • BoW – izvlači sve riječi iz svakog pojedinog tvita te je dodjeljuje tom tvitu. Npr. Riječi hotels, best, in, Croatia se nalaze u tvitu „Best hotels in Croatia“ i tako za svaki tvit posebno.
  • Punctuation Erasure, N Chars Filter, Number filter i Case converter – Brišemo sve točke, zareze, riječi koje imaju manje od 3 slova (može i više ili manje ovisno o našoj procjeni), brišemo brojeve te sve riječi pretvaramo u mala slova kako bi uklonili eventualne razlike u zapisu iste riječi (Hotel vs hotel).
  • Stop word filter i Porter Stemmer – Prvim nodom brišem česte riječi koje nam ne utječu toliko na analizu mišljenja (on, a, at, is …), a drugim izvlačimo korijen od svake riječi kako bi označili da su riječi poput work, working, works zapravo iste tj. imaju isto značenje (gledajući iz perspektive analize mišljenja) i isti korijen work.
  • Term Grouper – Grupira sve riječi po dokumentu te može brisati konfliktne tagove ili čak sve ovisno o našoj želji.
preprocessing

Preprocessing

Nakon „preprocessinga“ slijedi izračunavanje frekvencija. S obzirom na to da smo prošli put predstavili TF-IDF, sada se koristi Keygraph keyword extractor. Na našim podacima daju veoma slične rezultate gledajući ukupnu točnost modela na kraju, što je i očekivano. Znači, možemo koristiti ili jedan pristup ili drugi. Više o načinu rada ovog konkretnog nodea pročitajte na linku. U ovom nodeu je bitno naznačiti tri stvari: Number of keywords to extract, Size of the high frequency terms set i Size of the high key terms set. Ovaj korak zapravo zamislite kao izradu rječnika, koji se ne koristi za određivanje mišljenja kao u prethodnom članku već se koristi za izradu Document vectora. U prvom stupcu Document vectora se nalaze svi tvitovi, a u ostalim stupcima su sve riječi koje smo dobili izradom Keygraph keyword extractora. Vrijednosti se dakle nalaze u jednoj ogromnoj matrici i mogu poprimiti vrijednost 0 (ova riječ se ne nalazi u ovom tvitu) ili vrijednost 1 (ova riječ se nalazi u ovom tvitu). Preporuka je imati rječnik koji ima od 10 000 do 30 000 riječi. Dakle, ovaj Document vector zna biti uistinu ogroman.

Sljedeće je ekstrakcija polariteta (klase) za svaki pojedini tvit kako bi mogli započeti naše učenje. Korak prije smo samo izbacili tvitove iz analize kako bi uistinu ostala samo matrica s nulama i jedinicama, a zadnji stupac je polaritet (služi algoritmu za učenje). Znači prilikom učenja algoritam zapravo gleda koje se riječi nalaze u pozitivnim tvitovima, a koje se nalaze u negativnim te sukladno odabranom algoritmu (Naive Bayes, stablo ili neki od ensemble metoda) dobijemo output te točnost.

Overfitting

Overfitting

Za kraj nam ostaje učenje i predikcija te smo zapravo sve ove korake prije radili radi upravo ovog dijela modela. Ovdje se model grana na dvije strane, kako bi lakše pratili eventualni overfitting (algoritam se ponaša super prilikom učenja, ali čim pokušamo klasificirati nove tvitove bude loš). Inače trening i test error (razlika između onog što je algoritam izbacio da je polaritet i onog što je uistinu) trebaju padati do određene točke, nakon koje trening nastavlja padati, a test error počinje rasti i to nam je signal da nam model ulazi u područje overfittinga tj. da se vratimo na tu točku gdje su se rastali i to je optimum za nas u tom slučaju. Za potrebe ovog članka korišten je Naive Bayes algoritam, ali vi možete i testirati neki drugi pa ih uspoređivati.

Prva grana dijeli naš data set na dva dijela – train i test, gdje 70% našeg originalnog data seta postaje train, a 30% postaje test set. Ova podjela nije vršena random već prema polaritetu, tako da u svakom setu (train i test) bude zastupljen jednak broj i pozitivnih i negativnih. Ovaj zadnji node pod nazivom Scorer, nam služi da vidimo kolika je točnost algoritma. Dakle, on uči na train setu gdje ima uvid u riječi koje se nalaze u pozitivnim, a koje u negativnim tvitovima. Te nakon što algoritam nauči tj. u našem slučaju izbaci vjerojatnost za svaku riječ, spremni smo za klasifikaciju tvitova koji se nalaze u test setu. Znači, mi sad znamo točno koja je vjerojatnost da se riječ “good” pojavi u pozitivnim, a koja da se pojavi u negativnim tvitovima. Naš inicijalni rječnik napravljen u prethodnim koracima je sada dobio svoj produžetak, a to su vjerojatnosti za svaku pojedinu riječ. Taj rječnik tj. ono što smo naučili dalje, koristimo kako bi klasificirali tvitove iz test seta, no ovaj put je polaritet „skriven“ od algoritma tj. koristi se samo kako bi se odredila točnost tog našeg algoritma. Naive Bayes klasificira određeni tvit npr. kao pozitivan, a u stupcu do njega se nalazi stvarni polaritet te usporedbom ta dva polariteta možemo točno znati da li je algoritam pogriješio te koliko je puta pogriješio u cijelom test setu. Možemo vidjeti da li je više griješio kod klasifikacije pozitivnih ili negativnih tvitova. Možemo vidjeti i Sensitivity i Specifity, no o njima možda u budućim člancima.

algoritmi

Učenje i testiranje

Druga grana radi sve isto samo što nemamo train set i test set (bar ne kao u gornjem obliku) već se koristi cross-validation. Radi pojednostavljivanja uzet ćemo cross-validation s 4 folda. Dakle, naš originalni set dijelimo na 4 dijela čitaj folda. Jedan fold odredimo da nam služi za testing, a ostala 3 da će nam biti za training te dalje radimo sve kao što smo radili i u prvoj grani, no razlika je ta što svaki fold dobiva priliku da bude testing fold. Dakle, nakon što algoritam nauči na 2., 3. i 4. foldu, rezultate testira na 1. foldu, kada završi s tim krugom, 2.fold postaje testing, a 1., 3. i 4. foldovi postaju train foldovi i algoritam (Naive Bayes) ponovno uči, te tako sve dok svaki fold ne dobije priliku biti testni. Nakon toga možemo vidjeti prosječnu grešku za naša 4 folda, tj. za svaki fold (testni) se računa greška te se na kraju zna koliko smo u kojem griješili, koji je prosjek te usporediti s prvom granom i vidjeti da li odstupaju rezultati. Ovim načinom dobijemo puno stabilnije rezultate, koji nemaju velike oscilacije (bar takve rezultate tražimo). S obzirom na to da je Naive Bayes naivan tj. zasniva se na pretpostavci nezavisnosti, oscilacije rezultata u prvoj i drugoj grani su praktički nikakve. No, ako pokušate s nekim drugim algoritmom (Stablo ili SVM) rezultati bi mogli biti i više nego zanimljivi. Ove dvije grane mogu jedna bez druge i ovdje su stavljene više kao usporedba dva različita pristupa.

Da, više ne dužimo ovdje ćemo zaključiti ovaj članak, a u sljedećem ćemo predstaviti model koji klasificira nove tvitove te razloge zašto nam je potreban novi model, ako smo već napravili ovaj. Do tada, pokušajte izraditi sličan model u KNIME-u za vježbu, a za podatke možete uzeti neke od javno dostupnih kolekcija tvitova ili čak možete preko Twitter API sami streamati nekoliko tisuća tvitova. Budući koraci našeg dijela su isprobavan Ugodno učenje.