AI FÖR NATURLIGT SPRÅK
Kursinfo
Kursmaterial
FAQ
Kursmaterial
/
Kapitel
Slutuppgift: Klassificering med flera klasser
Analysera data
Följande filer används i uppgiften:
• speeches-201718.json.bz2 - Tal i Svenska riksdagen, 2017/2018.
• speeches-201819.json.bz2 - Tal i Svenska riksdagen, 2018/2019.
För att spara filerna, högerklicka på länken och välj att spara filen. Du behöver inte ladda ned några filer för att genomföra uppgiften, utan de är per automatik tillgängliga för användning i kodcellerna nedan.
Den sentimentanalys som vi gjorde på recensioner av appar hade två möjliga klasser, pos och neg. Nu ska vi utföra klassificering på data där det finns flera klasser. Det finns ett stort överlapp med hur de tidigare uppgifterna utfördes, men du kommer nu arbeta mer självständigt och få mindre ledning om vad som ska utföras. I slutändan ska du också gå utanför det vi gjort hittills och använda dig av logistisk regression som ett alternativ till Naive Bayes.
Vår data består av alla tal i Svenska riksdagen under sessioner från åren 2017/2018 och 2018/2019. Rådatan är tagen från Riksdagens öppna data och talen är indelade i två filer:
• speeches-201718.txt
med 12,343 tal
• speeches-201819.txt
med 9,288 tal
I nästa kodcell läser vi in talen, skriver ut hur många tal som finns i tränings- och testdata, och presenterar hur träningsdata ser ut.
Som du kan se så finns det en kolumn för words
, där varje fält består av ett tal, och party
, där varje cell består av en sträng som representerar ett parti.
I nästa kodcell ska du ta fram de klasser som finns i kolumnen party
och frekvensen per klass. Detta ska du göra för tränings- och testdata och spara dessa i listor.
Visualisera frekvensen per klass i tränings- och testdata i två olika stapeldiagram.
Baseline
Vi vill alltid ta fram en baseline innan vi börjar träna modeller. Använd DummyClassifier
från Scikit-learn för att skapa en modell som alltid ger den mest frekventa klassen som svar och tillämpa denna på testdata.
Ta fram en förväxlingsmatris där klassificeringen från baseline jämförs med de sanna värdena från testdata.
Ta slutligen fram en klassificeringsrapport från din förväxlingsmatris.
Naive Bayes
Bygg en pipeline med Pipeline
från Scikit-learn. Genom den ska riksdagstal vektoriseras till en representation baserad på ordfrekvens. De vektoriserade talen ska därefter användas av en Naive Bayes-klassificerare. Träna först modellen och utför sedan en klassificering på tal från testdata.
Ta fram en förväxlingsmatris där klassificeringen från Naive Bayes-modellen jämförs med de sanna värdena från testdata.
Följande kodcell presenterar vilka partier som oftast förväxlas med varandra. Det kan alltid vara intressant för att förstå varför modellen göra vissa förväxlingar mellan partier. Vad tror du gör att vissa partier förväxlas mot varandra?
Ta slutligen fram en klassificeringsrapport från din förväxlingsmatris.
Balansera data
Vår träningsdata är obalanserad, vilket leder till att de mer frekventa klasserna oftare blir korrekt predicerade. Utför undersampling för att skapa ett balanserat dataset.
Ta fram frekvensen per klass och visualisera den i stapeldiagram för att uppvisa att klasserna har blivit balanserade.
Logistisk regression
Naive Bayes är en av de simplare modellerna att implementera, och den grundar sig i en förenklad bild av hur text och en klass hänger samman. Det finns många fler modeller som vi kan träna, och en av dem är logistisk regression.
I följande kodcell ska vi använda oss av modellen LogisticRegression
för klassificering av flera klasser. Sätt modellens parametrar så att följande stämmer:
• random_state
har ett bestämt värde så att modellens resultat är reproducerbara.
• Parametern för maximala antalet iteration ska som minst sättas till 500, så att modellen har tid att närma sig en bra lösning (även om den kan behöva fler steg för att konvergera).
• Modellen ska använda sig av saga
för optimering.
• Valfritt: sätt verbose=True
för att få utskrifter om vilken iteration modellen är på.
För att genomföra detta behöver du troligtvis läsa om modellens paramterar i Scikit-learns dokumentation.
Data vektoriseras med CountVectorizer
så att resultat går att jämföra med Naive Bayes-modellen. Det finns dock andra vektoriserare, exempelvis en som transformerar till tf-idf, TfidfVectorizer
.
Utför träningen på ej balanserad träningsdata. Träning på balanserad data sker i en efterföljande kodcell.
OBS: Det kan ta några minuter för modellen att slutföra sin träning.
Ta fram en förväxlingsmatris där klassificeringen från den logistisk regressionen jämförs med de sanna värdena från testdata.
Som jämförelse med Naive Bayes-modellen, i följande kodcell kan du se vilka partier som oftast förväxlas med varandra.
Ta slutligen fram en klassificeringsrapport från din förväxlingsmatris.
Utifrån resultatet, hur ställer sig modellen mot Naive Bayes-modellen och mot baseline?
Utför nu samma träning och utvärdering men på balanserad träningsdata.
I följande kodcell kan du undersöka den logistiska regressionsmodellen närmare. Funktionen get_party_words()
tar in en klass och returnerar de ord som har högst korrelation med klassen. Se om du också tycker att orden stämmer väl överens med klassen.
Bra jobbat! Nu har du lärt dig att ta fram en baseline, balansera data, vektorisera data, och träna och utvärdera modeller med hjälp av Scikit-learn. Dessa verktyg är mycket användbara när det kommer till klassificeringsproblem, och ofta ett bra första steg för att snabbt skapa en fungerande modell – till och med en som fungerar väl.
Denna webbsajt innehåller kursmaterialet för kursen ETE335 AI för naturligt språk.
Materialet är licenserat under en Creative Commons Erkännande 4.0 Internationell licens.
Copyright © 2022, Marco Kuhlmann & Oskar Holmström