Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Mått | Jämföra Modeller
Klassificering med Python

Mått

Svep för att visa menyn

Hittills har vi använt noggrannhet som det huvudsakliga måttet för att utvärdera modellens prestanda. Noggrannhet har dock vissa begränsningar. Vi ska nu diskutera dess nackdelar och introducera flera ytterligare mått – baserade på TP, TN, FP och FN – som hjälper till att hantera dessa problem.

ConfusionMatrix

Noggrannhet

Noggrannhet representerar andelen korrekta förutsägelser:

accuracy=correctcorrect+incorrect=TP+TNTP+TN+FP+FN\text{accuracy} = \frac{\text{correct}}{\text{correct} + \text{incorrect}} = \frac{\textcolor{green}{\text{TP}} + \textcolor{green}{\text{TN}}}{\textcolor{green}{\text{TP}} + \textcolor{green}{\text{TN}} + \textcolor{red}{\text{FP}} + \textcolor{red}{\text{FN}}}

Noggrannhet har dock sina nackdelar. Tänk dig till exempel att du försöker förutsäga om en patient har en sällsynt sjukdom. Datamängden innehåller 99,9 % friska patienter och endast 0,1 % med sjukdomen. I detta fall skulle en modell som alltid förutsäger att patienten är frisk ge en noggrannhet på 0,999 – även om en sådan modell är helt värdelös.

Sådana datamängder kallas obalanserade, och i dessa fall är balanserad noggrannhet ett bättre mått att använda.

Balanserad noggrannhet

Balanserad noggrannhet beräknar andelen korrekta positiva förutsägelser och andelen korrekta negativa förutsägelser separat, och medelvärdesbildar sedan dessa. Detta tillvägagångssätt ger lika stor vikt åt varje klass, oavsett hur obalanserad datamängden är.

balanced_accuracy=12TPP+12TNNaccuracy=TP+TNP+N\begin{aligned} \text{balanced\_accuracy} &= \frac12 \cdot \frac{\textcolor{green}{\text{TP}}}{\text{P}} + \frac12 \cdot \frac{\textcolor{green}{\text{TN}}}{\text{N}}\\ \text{accuracy} &= \frac{\textcolor{green}{\text{TP}} + \textcolor{green}{\text{TN}}}{\text{P} + \text{N}} \end{aligned}

Där

  • P=TP+FN\text{P} = \textcolor{green}{\text{TP}} + \textcolor{red}{\text{FN}} – totalt antal positiva instanser (klass 1);
  • N=TN+FP\text{N} = \textcolor{green}{\text{TN}} + \textcolor{red}{\text{FP}} – totalt antal negativa instanser (klass 0).

I exemplet med den sällsynta sjukdomen skulle den balanserade noggrannheten för en modell som alltid förutsäger "frisk" vara 0,5 – vilket tydligt belyser problemet. Så detta problem hanteras.

Balanserad noggrannhet skiljer dock fortfarande inte mellan typ 1 och typ 2-fel – precis som vanlig noggrannhet. Det är här precision och återkallelse kommer in.

Precision

Precision-måttet anger hur många av de värden som modellen förutsade som positiva som faktiskt var positiva. Det är andelen sanna positiva förutsägelser av alla positiva förutsägelser som modellen gjort:

precision=TPTP+FP\text{precision} = \frac{\textcolor{green}{\text{TP}}}{\textcolor{green}{\text{TP}} + \textcolor{red}{\text{FP}}}

Genom att använda precision-måttet kan vi förstå hur ofta ett typ 1-fel uppstår. Hög precision innebär att typ 1-fel är sällsynta, medan låg precision indikerar att typ 1-fel inträffar ofta.

Recall

Recall-måttet visar andelen av de faktiska positiva fallen som modellen korrekt förutsade:

recall=TPTP+FN\text{recall} = \frac{\textcolor{green}{\text{TP}}}{\textcolor{green}{\text{TP}} + \textcolor{red}{\text{FN}}}

Recall-måttet hjälper oss att förstå hur ofta ett typ 2-fel uppstår. Hög recall innebär att typ 2-fel är sällsynta, medan låg recall betyder att de inträffar ofta.

Både precision och recall har dock sina begränsningar. Till exempel kommer en modell som endast förutspår den positiva klassen (1) att uppnå perfekt recall, men dess precision kommer att vara dålig. Å andra sidan kommer en modell som korrekt förutspår endast ett positivt fall och markerar allt annat som negativt att ha perfekt precision, men usel recall.

Detta visar att det är enkelt att bygga en modell med perfekt precision eller perfekt recall, men mycket svårare att skapa en som presterar bra på båda. Därför är det viktigt att ta hänsyn till båda måtten – och lyckligtvis finns det ett mått som kombinerar dem.

F1-värde

F1-värdet är det harmoniska medelvärdet av precision och recall. Det harmoniska medelvärdet föredras framför det vanliga (aritmetiska) medelvärdet eftersom det straffar situationer där ett av värdena (antingen precision eller recall) är lågt, vilket gör det till ett mer balanserat mått på modellens prestanda.

F1=21precision+1recall=2precisionrecallprecision+recall\text{F1} = \frac{2}{\frac{1}{\text{precision}} + \frac{1}{\text{recall}}} = \frac{2 \cdot \text{precision} \cdot \text{recall}}{\text{precision} + \text{recall}}

F1-värdet kombinerar både precision och recall till ett enda mått. Det blir endast högt om både precision och recall är relativt höga, vilket gör det till ett användbart mått när du behöver balansera båda typerna av fel.

Att välja rätt mått beror på den specifika uppgiften. Noggrannhet (eller balanserad noggrannhet för obalanserade datamängder) är intuitivt och ger en allmän uppfattning om modellens övergripande prestanda. Om du behöver mer detaljerad insikt i vilka typer av fel modellen gör, hjälper precision att identifiera typ 1-fel, medan återkallning belyser typ 2-fel. F1-poängen visar hur välbalanserad modellen är när det gäller både typ 1- och typ 2-fel.

MetricsSummary
Note
Läs mer

Ett annat vanligt använt mått är ROC/AUC, som du kan läsa mer om i denna artikel.

Mätvärden i Python

Scikit-learn tillhandahåller implementationer för alla dessa mätvärden i modulen sklearn.metrics:

from sklearn.metrics import accuracy_score, balanced_accuracy_score, precision_score, recall_score, f1_score

accuracy = accuracy_score(y_true, y_pred)
balanced_accuracy = balanced_accuracy_score(y_true, y_pred)
precision = precision_score(y_true, y_pred)
recall = recall_score(y_true, y_pred)
f1 = f1_score(y_true, y_pred)

Om du vill få mätvärden som precision, recall och F1-score på en gång, erbjuder sklearn funktionen classification_report():

12345678910111213
import pandas as pd import seaborn as sns from sklearn.metrics import classification_report from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split df = pd.read_csv('https://codefinity-content-media.s3.eu-west-1.amazonaws.com/b71ff7ac-3932-41d2-a4d8-060e24b00129/titanic.csv') X, y = df.drop('Survived', axis=1), df['Survived'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1) random_forest = RandomForestClassifier().fit(X_train, y_train) y_pred = random_forest.predict(X_test) # Display a classification report print(classification_report(y_test, y_pred))
Note
Notering

Support avser antalet faktiska förekomster av varje klass i testuppsättningen. Macro avg beräknar medelvärdet för varje mätvärde (precision, recall, F1) över alla klasser lika, utan att ta hänsyn till obalans mellan klasserna. Weighted avg beräknar också medelvärdet för mätvärdena över alla klasser, men ger större vikt åt klasser med fler instanser (baserat på deras support).

question mark

Vilken utvärderingsmetrik ger en balans mellan precision och återkallelse och ger ett enda värde som återspeglar båda?

Vänligen välj det korrekta svaret

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 5. Kapitel 2

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

Avsnitt 5. Kapitel 2
some-alt