Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Mittarit | Mallien Vertailu
Luokittelu Pythonilla

Mittarit

Pyyhkäise näyttääksesi valikon

Tähän asti olemme käyttäneet tarkkuutta (accuracy) mallin suorituskyvyn pääasiallisena mittarina. Tarkkuudella on kuitenkin joitakin rajoituksia. Tarkastellaan nyt näitä puutteita ja esitellään useita lisämittareita – perustuen TP, TN, FP ja FN – jotka auttavat ratkaisemaan näitä ongelmia.

ConfusionMatrix

Tarkkuus

Tarkkuus kuvaa oikeiden ennusteiden osuutta:

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

Tarkkuudella on kuitenkin haittapuolia. Kuvittele esimerkiksi, että yrität ennustaa, onko potilaalla harvinainen sairaus. Aineistossa on 99,9 % terveitä potilaita ja vain 0,1 % sairastuneita. Tässä tapauksessa, jos aina ennustetaan potilaan olevan terve, saavutetaan tarkkuudeksi 0,999 – vaikka tällainen malli on täysin hyödytön.

Tällaisia aineistoja kutsutaan epätasapainoisiksi, ja näissä tilanteissa tasapainotettu tarkkuus on parempi mittari.

Tasapainotettu tarkkuus

Tasapainotettu tarkkuus laskee oikeiden positiivisten ennusteiden osuuden ja oikeiden negatiivisten ennusteiden osuuden erikseen ja ottaa näiden keskiarvon. Tämä lähestymistapa antaa yhtä suuren painoarvon molemmille luokille riippumatta siitä, kuinka epätasapainoinen aineisto on.

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}

Missä

  • P=TP+FN\text{P} = \textcolor{green}{\text{TP}} + \textcolor{red}{\text{FN}} – positiivisten tapausten kokonaismäärä (luokka 1);
  • N=TN+FP\text{N} = \textcolor{green}{\text{TN}} + \textcolor{red}{\text{FP}} – negatiivisten tapausten kokonaismäärä (luokka 0).

Harvinaisen sairauden esimerkissä mallin, joka aina ennustaa "terve", tasapainotettu tarkkuus olisi 0,5 – mikä tuo ongelman selvästi esiin. Näin tämä ongelma tulee huomioiduksi.

Tasapainotettu tarkkuus ei kuitenkaan erottele tyypin 1 ja tyypin 2 virheitä – aivan kuten tavallinen tarkkuuskaan ei tee. Tässä kohtaa precision ja recall tulevat mukaan.

Tarkkuus

Tarkkuus-mittari ilmaisee, kuinka moni mallin positiivisiksi ennustamista arvoista oli todella positiivisia. Se on oikeiden positiivisten ennusteiden osuus kaikista mallin tekemistä positiivisista ennusteista:

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

Tarkkuusmittarin avulla voidaan arvioida, kuinka usein tyypin 1 virhe tapahtuu. Korkea tarkkuus tarkoittaa, että tyypin 1 virheet ovat harvinaisia, kun taas matala tarkkuus viittaa siihen, että tyypin 1 virheitä esiintyy usein.

Recall (herkkyys)

Recall-mittari ilmaisee, kuinka suuren osan todellisista positiivisista tapauksista malli ennusti oikein:

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

Recall-metriikka auttaa ymmärtämään, kuinka usein tyypin 2 virhe tapahtuu. Korkea recall tarkoittaa, että tyypin 2 virheet ovat harvinaisia, kun taas matala recall viittaa siihen, että niitä esiintyy usein.

Sekä precision- että recall-metriikoilla on kuitenkin rajoituksia. Esimerkiksi malli, joka ennustaa vain positiivisen luokan (1), saavuttaa täydellisen recallin, mutta sen precision on heikko. Toisaalta malli, joka tunnistaa vain yhden positiivisen tapauksen oikein ja luokittelee kaiken muun negatiiviseksi, saa täydellisen precisionin, mutta erittäin huonon recallin.

Tämä osoittaa, että vaikka on helppoa rakentaa malli, jolla on täydellinen precision tai recall, on paljon vaikeampaa rakentaa malli, joka suoriutuu hyvin molemmissa. Siksi on tärkeää ottaa huomioon molemmat metriikat – ja onneksi on olemassa metriikka, joka yhdistää ne.

F1-pisteet

F1-pisteet ovat precisionin ja recallin harmoninen keskiarvo. Harmonista keskiarvoa suositaan tavallisen (aritmeettisen) keskiarvon sijaan, koska se rankaisee tilanteissa, joissa jompikumpi arvo (precision tai recall) on matala, tehden siitä tasapainoisemman mittarin mallin suorituskyvylle.

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-pisteet yhdistävät sekä precisionin että recallin yhdeksi mittariksi. Se on korkea vain, jos sekä precision että recall ovat suhteellisen korkeita, mikä tekee siitä hyödyllisen mittarin silloin, kun molemmat virhetyypit täytyy ottaa huomioon.

Oikean mittarin valinta riippuu tehtävästä. Tarkkuus (tai tasapainotettu tarkkuus epätasapainoisille aineistoille) on intuitiivinen ja antaa yleiskuvan mallin kokonaissuorituskyvystä. Jos tarvitaan tarkempaa tietoa mallin tekemistä virheistä, precision auttaa tunnistamaan tyypin 1 virheet, kun taas recall korostaa tyypin 2 virheitä. F1-pisteet osoittavat, kuinka tasapainoinen malli on tyypin 1 ja tyypin 2 virheiden suhteen.

MetricsSummary
Note
Lisätietoa

Toinen yleisesti käytetty mittari on ROC/AUC, josta voit lukea lisää tästä artikkelista.

Mittarit Pythonissa

Scikit-learn tarjoaa toteutukset kaikille näille mittareille sklearn.metrics -moduulissa:

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)

Jos haluat saada mittarit kuten precision, recall ja F1-score kaikki kerralla, sklearn tarjoaa classification_report() -funktion:

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
Huomio

Support tarkoittaa kunkin luokan todellisten esiintymien määrää testijoukossa. Macro avg laskee kunkin mittarin (precision, recall, F1) keskiarvon kaikille luokille tasapuolisesti, ottamatta huomioon luokkien epätasapainoa. Weighted avg laskee mittareiden keskiarvon kaikille luokille, mutta antaa enemmän painoarvoa niille luokille, joissa on enemmän havaintoja (perustuen niiden support-arvoon).

question mark

Mikä arviointimittari tasapainottaa tarkkuuden ja palautuksen välillä, antaen yhden pistemäärän, joka heijastaa molempia?

Valitse oikea vastaus

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 5. Luku 2

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Osio 5. Luku 2
some-alt