Språkklassificering av Myers-Briggs del 2: en lömsk bugg och stora förbättringar!

Läs även del 1:  Kan man förutsäga Myers-Briggs personlighetstyp från bloggtexter?

Del 3: Toppresultat med två klasser!

Del 4: För bra för att vara sant, tyvärr

Del 5: Jung var nåt på spåren, men...

Del 6: Postmodern kritik

För ett par dagar sen publicerade jag ett inledande experiment med språkklassificering av Jungiansk/Myers-Briggs personlighetstyp från bloggtext insamlade via typealyzer.com. Utvärderingen av den Naiva-Bayesiska klassificeraren skapad på uClassify.com gav en precision på 0,27 och en recall på 0,27. Vi återvänder till de vad de siffrorna betyder. I den här posten kommer vi se att de siffrorna förbättrats betydligt, genom klassisk avlusning av kod.

Först kan det vara bra att komma ihåg vad det är vi försöker klassificera. Klassificeraren försöker gissa vilken kognitiv funktion enligt Jungs personlighetsttypsteori bloggtextens författare uttrycker med texten. Varje kognitiv funktion representeras av en bokstav, s, n, t eller f. Det är förkortningar för de fyra kognitiva funktionerna s  för Sensing, n  för iNtuition, t  för Thinking respektive f för Feeling. Med hjälp av dessa bokstavsförkortningar byggs sedan en persons Myers-Briggs typ upp på ett ganska intrikat sätt. Hur det går till kan du läsa mer om hos Thought Archive.

De huvudsakliga siffrorna att titta på i utvärderingen är precision och recall. Precision betyder att  när klassificeraren gissat en bokstav har det stämt i denna procent andel av fallen, 0,27 är alltså en precision på 27 procent. Med fyra klasser innebär det ett par procentenheter över hur det hade gått om apor hade kastat pil på de fyra bokstäverna. Det var ju trots allt bättre än slumpen.  Recall svarar på frågan om hur hur stor andel av respektive bokstav som klassificeraren gissade rätt på. Även här var svaret alltså 27 procent.

Eftersom jag inte har särskilt stort förtroende på kvalitén på de typ-rapporter som anonyma användare skickat in till bloggadresser som de inte med säkerhet kan vare sig knytas till eller sägas ha någon särskild kännedom om, tog jag det dåliga resultatet med ro. Skit in skit ut.

Initial SNTF classification report
Så här såg de ursprungliga resultaten för den 4-klassade klassificeraren av Jungs kognitiva funktioner ut baserat på den ursprungliga tränings- och utvärderingsdatan.

Av en händelse får jag syn på en lömsk bugg…

Medan jag satt och började titta på en helt annan approach för analys av datasetet kom jag av en händelse att titta på de sista raderna i träningsdatan och noterade nåt konstigt. Nästan ingen av de fyra kognitiva funktioner för bloggtexterna stämde överens med den ursprungliga Myers-Briggs typen! En typ som till exempel ESFJ borde ha den dominanta funktionen F för Feeling. Nu kunde där istället så exempelvis T. Ajaj… Jag hade bara kollat på överdelen av varje producerad kolumn och då missade jag att felet uppstod för längre ner.

Så jag satte igång att felsöka rad för rad i scriptet som jag använt för att transformera den ursprungliga datan till nya kolumner för analys och såg att jag gjort ett tankefel. Jag hade tänkt att alla inrapporterade exempel skulle innehålla någon av de 16 Myers-Briggs typerna, men vi hade ju också med möjligheten att svara ”I don’t know”. Det medförde att när jag sedan loopade genom alla raderna, läste av det som förväntades vara en av 16 typer och stoppade in den motsvarande dominanta funktionen i en ny lista hoppades fallen då svaret var ”I don’t know” helt enkelt över!

Buggen uppträdde här
Här uppstod felet. If-satsen låter fallen med ”I don’t know”-svar passera utan att ett noll-värde adderas till listorna.

När jag väl rättat till koden körde jag den ganska tidskrävande träningen av klassificerare på nytt. Jag märkte en förbättring som jag diskuterade med mina vänner Jon och Mikael Huss för att få en sanity check och bättre förstå de statistiska resultaten i utvärderingen. Men…

Nästa miss från min sida!

Idag upptäckte jag att jag också glömt att filtrera bort allt annat än inskickade blogg-URL:er, på samma sätt som jag gjort på datasetet jag redan publicerat på Kaggle. Jag hade lagt koden för Kaggle-datasetet i en annan notebook och sen inte fört över den till den nuvarande notebooken vi tittade i.

Min intuition efter att ha tittat på originaldatan var ju redan från början att det var så mycket konstiga URL:ar inskickade till typealyzer.com, exempelvis twitter-sidor och artiklar i nyhetsmedier, att det borde öka bruset på bekostnad av signalen. Bort med allt som inte garanterat är bloggar alltså!

filter out blogs only

Med allt detta tillrättat (inklusive uppdaterat dataset på Kaggle som version 4) har jag nu tränat om den publicerade klassificeraren för de fyra Jungianska kognitiva funktionerna på uClassify.com och gjort en ny utvärdering:

del 2 SNTF-klassificerare utvärdering
Mer än en fördubblad förbättring av resultatet!

Mer än fördubblad precision och recall för för klassificeraren!

Men ännu återstår flera idéer för förbättring av metoden för klassificering. Framförallt vill jag testa att träna två klassificerare för dikotomierna s/n respektive t/f vilket bättre följer den ursprungliga teorin för typerna. Det borde jag faktiskt tänkt på redan vid första experimentet, eftersom jag själv i alla år hävdat att den approachen ska ge bästa resultaten i långa diskussioner med Jon när vi ursprungligen konstruerade typealyzer.com.

Utöver precision och recall är det intressant att beräkna accuracy och Cohens Kappa för att bedömma hur väl en klassificerare fungerar. Accuracy är helt enkelt antalet rätta gissningar delat med antalet fall:

SNTF accuracy score

Vi har alltså en accuracy på 59 procent. Med det värdet och att vi vet antalet fall för varje klass kan vi beräkna Cohens Kappa. För att förstå Kappa-värdet med begränsade förkunskaper kan du läsa denna eminenta forumtråd.

Ett ungefärligt kappa-värde får vi genom (0.59 – 0.25)/(1 – 0.25) = c:a 0.45 där alltså 0.25 kommer från att det är 25 % chans att träffa rätt klass helt slumpmässigt med fyra klasser. I den eminenta forumtråden som länkats till ovan står att läsa en tumregel för vad som räknas som bra respektive dåliga Kappa-värden:

“According to Wikipedia (citing their paper), Landis and Koch considers 0-0.20 as slight, 0.21-0.40 as fair, 0.41-0.60 as moderate, 0.61-0.80 as substantial, and 0.81-1 as almost perfect. Fleiss considers kappas > 0.75 as excellent, 0.40-0.75 as fair to good, and < 0.40 as poor. It is important to note that both scales are somewhat arbitrary.”

Vi har alltså ett OK result för språkklassificering av Jungianska kognitiva funktioner från bloggtexter (redan) nu.

Jag återkommer i nya bloggposter med de fortsatta experimenten!