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

bookMått

Hittills har vi använt noggrannhet som det huvudsakliga måttet för att utvärdera modellens prestanda. Noggrannhet har dock vissa begränsningar. Låt oss 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.

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 – trots att 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 dem. 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 positiva instanser (klass 0).

I exemplet med sällsynta sjukdomar skulle den balanserade noggrannheten för en modell som alltid förutspår "frisk" vara 0,5 – vilket effektivt belyser problemet. Detta problem hanteras alltså.

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

Precision

Måttet precision anger hur många av de värden som modellen förutspådde 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 faktiska positiva fall som modellen korrekt förutsäger:

recall=precision=TPTP+FN\text{recall} = \text{precision} = \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 innebär att de inträffar ofta.

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

Detta visar att det är enkelt att bygga en modell med perfekt precision eller perfekt recall, men mycket svårare att skapa en modell 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-poäng

F1-poängen är det harmoniska medelvärdet av precision och återkallelse. 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 återkallelse) ä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-poängen kombinerar både precision och återkallelse i ett enda mått. Den blir endast hög om både precision och återkallelse är relativt höga, vilket gör den användbar när det är viktigt att balansera båda typerna av fel.

Valet av 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 mer detaljerad insikt om feltyper krävs, hjälper precision att identifiera typ 1-fel, medan återkallelse belyser typ 2-fel. F1-poängen visar hur välbalanserad modellen är avseende både typ 1- och typ 2-fel.

Note
Läs mer

En annan vanligt använd metrisk är ROC/AUC, som du kan läsa mer om i denna artikel.

Metriker i Python

Scikit-learn tillhandahåller implementationer för alla dessa metrikvä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å metrikvärden som precision, recall och F1-score samtidigt, 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))
copy
Note
Notering

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

question mark

Vilket utvärderingsmått ger en balans mellan precision och recall, och ger ett enda värde som återspeglar båda?

Select the correct answer

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

Suggested prompts:

Can you explain the difference between precision and recall in more detail?

When should I use F1 score instead of accuracy?

How do I interpret the classification report output in scikit-learn?

Awesome!

Completion rate improved to 4.17

bookMå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. Låt oss 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.

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 – trots att 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 dem. 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 positiva instanser (klass 0).

I exemplet med sällsynta sjukdomar skulle den balanserade noggrannheten för en modell som alltid förutspår "frisk" vara 0,5 – vilket effektivt belyser problemet. Detta problem hanteras alltså.

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

Precision

Måttet precision anger hur många av de värden som modellen förutspådde 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 faktiska positiva fall som modellen korrekt förutsäger:

recall=precision=TPTP+FN\text{recall} = \text{precision} = \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 innebär att de inträffar ofta.

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

Detta visar att det är enkelt att bygga en modell med perfekt precision eller perfekt recall, men mycket svårare att skapa en modell 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-poäng

F1-poängen är det harmoniska medelvärdet av precision och återkallelse. 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 återkallelse) ä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-poängen kombinerar både precision och återkallelse i ett enda mått. Den blir endast hög om både precision och återkallelse är relativt höga, vilket gör den användbar när det är viktigt att balansera båda typerna av fel.

Valet av 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 mer detaljerad insikt om feltyper krävs, hjälper precision att identifiera typ 1-fel, medan återkallelse belyser typ 2-fel. F1-poängen visar hur välbalanserad modellen är avseende både typ 1- och typ 2-fel.

Note
Läs mer

En annan vanligt använd metrisk är ROC/AUC, som du kan läsa mer om i denna artikel.

Metriker i Python

Scikit-learn tillhandahåller implementationer för alla dessa metrikvä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å metrikvärden som precision, recall och F1-score samtidigt, 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))
copy
Note
Notering

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

question mark

Vilket utvärderingsmått ger en balans mellan precision och recall, och ger ett enda värde som återspeglar båda?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 5. Kapitel 2
some-alt