Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Metrikker | Sammenligning af Modeller
Klassifikation med Python

Metrikker

Stryg for at vise menuen

Indtil nu har vi brugt nøjagtighed som den primære måling til at evaluere modellens præstation. Dog har nøjagtighed nogle begrænsninger. Lad os nu diskutere dens ulemper og introducere flere yderligere målinger – baseret på TP, TN, FP og FN – som hjælper med at håndtere disse udfordringer.

ConfusionMatrix

Nøjagtighed

Nøjagtighed repræsenterer andelen af korrekte forudsigelser:

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}}}

Dog nøjagtighed har sine ulemper. Forestil dig for eksempel, at du forsøger at forudsige, om en patient har en sjælden sygdom. Datasættet indeholder 99,9% raske patienter og kun 0,1% med sygdommen. I dette tilfælde vil en model, der altid forudsiger, at patienten er rask, give en nøjagtighed på 0,999 – selvom en sådan model er fuldstændig ubrugelig.

Datasæt som dette kaldes ubalancerede, og i sådanne tilfælde er balanceret nøjagtighed en bedre målemetode.

Balanceret nøjagtighed

Balanceret nøjagtighed beregner andelen af korrekte positive forudsigelser og andelen af korrekte negative forudsigelser hver for sig og gennemsnitliggør dem. Denne tilgang giver lige stor betydning til hver klasse, uanset hvor ubalanceret datasættet er.

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}

Hvor

  • P=TP+FN\text{P} = \textcolor{green}{\text{TP}} + \textcolor{red}{\text{FN}} – samlet antal positive forekomster (klasse 1);
  • N=TN+FP\text{N} = \textcolor{green}{\text{TN}} + \textcolor{red}{\text{FP}} – samlet antal negative forekomster (klasse 0).

I eksemplet med den sjældne sygdom vil den balancerede nøjagtighed for en model, der altid forudsiger "rask", være 0,5 – hvilket effektivt fremhæver problemet. Så dette problem bliver adresseret.

Balanceret nøjagtighed skelner dog stadig ikke mellem type 1 og type 2 fejl – ligesom almindelig nøjagtighed. Det er her, præcision og recall kommer ind.

Præcision

Målingen præcision angiver, hvor mange af de værdier, som modellen har forudsagt som positive, der faktisk var positive. Det er andelen af sande positive forudsigelser ud af alle positive forudsigelser foretaget af modellen:

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

Ved at bruge præcision som måling kan man forstå, hvor ofte en type 1-fejl opstår. Høj præcision betyder, at type 1-fejl er sjældne, mens lav præcision indikerer, at type 1-fejl forekommer hyppigt.

Recall

Målingen recall viser andelen af faktiske positive tilfælde, som modellen korrekt har forudsagt:

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

Recall-metricen hjælper med at forstå, hvor ofte en type 2-fejl opstår. Høj recall betyder, at type 2-fejl er sjældne, mens lav recall betyder, at de forekommer hyppigt.

Både præcision og recall har dog begrænsninger. For eksempel vil en model, der kun forudsiger den positive klasse (1), opnå perfekt recall, men dens præcision vil være dårlig. Omvendt vil en model, der korrekt forudsiger blot én positiv forekomst og mærker alt andet som negativt, have perfekt præcision, men elendig recall.

Dette viser, at det er let at bygge en model med perfekt præcision eller perfekt recall, men langt sværere at bygge en, der klarer sig godt på begge områder. Derfor er det vigtigt at tage begge metrikker i betragtning – og heldigvis findes der en metrik, der kombinerer dem.

F1-score

F1-score er det harmoniske gennemsnit af præcision og recall. Det harmoniske gennemsnit foretrækkes frem for det almindelige (aritmetiske) gennemsnit, fordi det straffer situationer, hvor én af værdierne (enten præcision eller recall) er lav, hvilket gør det til et mere balanceret mål for modellens præstation.

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-score kombinerer både præcision og recall i én enkelt metrik. Den vil kun være høj, hvis både præcision og recall er relativt høje, hvilket gør den til et nyttigt mål, når der skal balanceres mellem begge typer fejl.

Valget af den rette metrik afhænger af den specifikke opgave. Nøjagtighed (eller balanceret nøjagtighed for ubalancerede datasæt) er intuitiv og giver et generelt indtryk af modellens samlede præstation. Hvis der er behov for mere detaljeret indsigt i de typer fejl, modellen laver, hjælper præcision med at identificere type 1-fejl, mens recall fremhæver type 2-fejl. F1-score viser, hvor godt balanceret modellen er i forhold til både type 1- og type 2-fejl.

MetricsSummary
Note
Læs mere

En anden ofte anvendt metrik er ROC/AUC, som du kan læse mere om i denne artikel.

Metoder i Python

Scikit-learn tilbyder implementeringer af alle disse metoder i modulet 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)

Hvis du ønsker at få metoder som præcision, recall og F1-score på én gang, tilbyder 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
Bemærk

Support henviser til antallet af faktiske forekomster af hver klasse i testdatasættet. Macro avg beregner gennemsnittet af hver metode (præcision, recall, F1) på tværs af alle klasser ligeligt, uden at tage højde for ubalance mellem klasserne. Weighted avg beregner også gennemsnittet af metoderne på tværs af alle klasser, men vægter klasser med flere forekomster højere (baseret på deres support).

question mark

Hvilken evalueringsmetrik giver en balance mellem præcision og recall og giver en enkelt score, der afspejler begge dele?

Vælg det korrekte svar

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 5. Kapitel 2

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

Sektion 5. Kapitel 2
some-alt