AI FÖR NATURLIGT SPRÅK
Kursinfo
Kursmaterial
FAQ
Kursmaterial
/
Kapitel
Deluppgift 3: Balansera data
Balansera data
Följande filer används i uppgiften:
• app_sentiment.csv - Recensioner av applikationer från Google Play Store.
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.
Resultatet från vår Naive Bayes-modell indikerar att vår modell har en tendens att oftare generera den klass som förekommer oftast i träningsdata. Även om modellen kan få ett bättre resultat när klasserna i ett dataset har liknande fördelning så leder det till att modellen kan få svårt att generalisera till andra fördelningar. Det kan dessutom ge en falsk bild av modellens förmåga: träffsäkerheten kan vara hög samtidigt som modellen har svårt att gissa rätt för en specifik klass. Detta är speciellt problematiskt om vi vill att modellen ska kunna identifiera att texter tillhör en klass som förekommer sällan. Ett exempel kan vara att vi just vill identifiera om en recension av en app är negativ då det ger mer information om hur appen kan utvecklas.
Vi laddar in vårt dataset precis som i tidigare deluppgifter.
xxxxxxxxxx
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
with open("data/ch3/app_sentiment.csv") as source:
app_reviews = pd.read_csv(source)
app_reviews['review'] = app_reviews['review'].astype('str')
training_data, test_data = train_test_split(app_reviews, test_size=0.2, \
random_state=42, shuffle=True)
train_ratings = training_data["rating"].value_counts().index.tolist()
train_ratings_count = training_data["rating"].value_counts().tolist()
print("Antal datapunkter i träningsdata:", len(training_data))
print("Antal datapunkter i testdata:", len(test_data))
När vi balanserar data kan vi använda oss av en metod som kallas undersampling. Det innebär att vi hittar klassen med lägst frekvens och väljer ut samma antal datapunkter från resterande klasser.
I nästa kodcell ska du hitta frekvensen för den klass med lägst frekvens. Det värdet kommer sedan användas för att göra ett urval från vår träningsdata.
xxxxxxxxxx
min_class_freq = ____
train_balanced = pd.DataFrame(columns=training_data.columns)
for r in train_ratings:
train_balanced = train_balanced.append(training_data.loc[training_data['rating'] == r].sample(min_class_freq)
,ignore_index=True)
train_balanced.head()
Nu har vi balanserat vår data. För att verifiera det ska du ta fram frekvensen för varje klass och presentera informationen i ett stapeldiagram.
xxxxxxxxxx
import matplotlib.pyplot as plt
import pandas as pd
balanced_ratings = _____
balanced_ratings_count = _____
plt.figure(facecolor='white')
plt.title("Antal per klass - balanserad träningsdata")
plt.bar(x = balanced_ratings, height = balanced_ratings_count)
plt.show()
Nu när vi verifierat att vår data är balanserad kan vi återigen träna en Naive Bayesmodell och utvärdera den för att se effekterna av att ha tränat på balanserad data.
xxxxxxxxxx
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics import classification_report
from sklearn.pipeline import Pipeline
from sklearn.naive_bayes import MultinomialNB
vectorizer = CountVectorizer()
clf = MultinomialNB()
naive_bayes = Pipeline([('count_vect', vectorizer), ('multi_nb',clf)])
X = train_balanced['review']
y = train_balanced['rating']
naive_bayes.fit(X, y)
X_test = test_data['review']
pred_nb = naive_bayes.predict(X_test)
class_report = classification_report(y_true=test_data['rating'],
y_pred=pred_nb)
print("Klassificeringsrapport:")
print(class_report)
Nu kan vi se hur modellens accuracy har minskat något, men hur recall för ‘neg’ har ökat. Det innebär att modellen har blivit bättre på att klassificera den ovanligare klassen när det också är den korrekta klassen i testdata.
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