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

bookMittarit

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

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 heikkouksia. Kuvitellaan esimerkiksi, että yrität ennustaa, onko potilaalla harvinainen sairaus. Aineistossa on 99,9 % terveitä potilaita ja vain 0,1 % sairaita. Tässä tapauksessa, jos aina ennustetaan potilaan olevan terve, tarkkuudeksi saadaan 0,999 – vaikka tällainen malli on täysin hyödytön.

Tällaisia aineistoja kutsutaan epätasapainoisiksi (imbalanced), ja näissä tapauksissa tasapainotettu tarkkuus (balanced accuracy) on parempi mittari.

Tasapainotettu tarkkuus

Tasapainotettu tarkkuus laskee oikeiden positiivisten ennusteiden osuuden ja oikeiden negatiivisten ennusteiden osuuden erikseen, ja keskimääräistää ne. Tämä lähestymistapa antaa yhtä suuren painoarvon jokaiselle luokalle 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 havaintojen kokonaismäärä (luokka 1);
  • N=TN+FP\text{N} = \textcolor{green}{\text{TN}} + \textcolor{red}{\text{FP}} – negatiivisten havaintojen kokonaismäärä (luokka 0).

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

Kuitenkin tasapainotettu tarkkuus ei edelleenkään erottele tyypin 1 ja tyypin 2 virheitä – aivan kuten tavallinen tarkkuuskaan ei tee. Tässä kohtaa precision ja recall tulevat mukaan.

Precision

Precision-mittari ilmaisee, kuinka moni mallin positiivisista ennusteista oli todella positiivinen. 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}}}

Käyttämällä tarkkuusmittaria voidaan ymmärtää, kuinka usein tyypin 1 virhe esiintyy. Korkea tarkkuus tarkoittaa, että tyypin 1 virheet ovat harvinaisia, kun taas matala tarkkuus viittaa siihen, että tyypin 1 virheitä esiintyy usein.

Recall

Recall-mittari osoittaa, kuinka suuren osan todellisista positiivisista tapauksista malli ennustaa oikein:

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

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

Sekä tarkkuudella että recallilla on kuitenkin rajoituksia. Esimerkiksi malli, joka ennustaa vain positiivisen luokan (1), saavuttaa täydellisen recallin, mutta sen tarkkuus on heikko. Toisaalta malli, joka ennustaa oikein vain yhden positiivisen tapauksen ja luokittelee kaiken muun negatiiviseksi, saavuttaa täydellisen tarkkuuden, mutta erittäin huonon recallin.

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

F1-pisteet

F1-pisteet ovat tarkkuuden ja palautuksen harmoninen keskiarvo. Harmonista keskiarvoa suositaan tavallisen (aritmeettisen) keskiarvon sijaan, koska se rankaisee tilanteita, joissa toinen arvoista (joko tarkkuus tai palautus) 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ä tarkkuuden että palautuksen yhdeksi mittariksi. Arvo on korkea vain, jos sekä tarkkuus että palautus ovat suhteellisen korkeita, mikä tekee siitä hyödyllisen mittarin, kun molempien virhetyyppien tasapainottaminen on tärkeää.

Oikean mittarin valinta riippuu tehtävästä. Tarkkuus (tai tasapainotettu tarkkuus epätasapainoisissa aineistoissa) on intuitiivinen ja antaa yleiskuvan mallin kokonaissuorituskyvystä. Jos tarvitset tarkempaa tietoa mallin tekemistä virheistä, tarkkuus auttaa tunnistamaan tyypin 1 virheet, kun taas palautus korostaa tyypin 2 virheitä. F1-pisteet osoittavat, kuinka hyvin malli on tasapainossa sekä tyypin 1 että tyypin 2 virheiden suhteen.

Note
Opiskele lisää

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

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 yhdellä kertaa, 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))
copy
Note
Huomio

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

question mark

Mikä arviointimittari tarjoaa tasapainon tarkkuuden (precision) ja palautuksen (recall) välillä, antaen yhden pistemäärän, joka heijastaa molempia?

Select the correct answer

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

Awesome!

Completion rate improved to 4.17

bookMittarit

Pyyhkäise näyttääksesi valikon

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

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 heikkouksia. Kuvitellaan esimerkiksi, että yrität ennustaa, onko potilaalla harvinainen sairaus. Aineistossa on 99,9 % terveitä potilaita ja vain 0,1 % sairaita. Tässä tapauksessa, jos aina ennustetaan potilaan olevan terve, tarkkuudeksi saadaan 0,999 – vaikka tällainen malli on täysin hyödytön.

Tällaisia aineistoja kutsutaan epätasapainoisiksi (imbalanced), ja näissä tapauksissa tasapainotettu tarkkuus (balanced accuracy) on parempi mittari.

Tasapainotettu tarkkuus

Tasapainotettu tarkkuus laskee oikeiden positiivisten ennusteiden osuuden ja oikeiden negatiivisten ennusteiden osuuden erikseen, ja keskimääräistää ne. Tämä lähestymistapa antaa yhtä suuren painoarvon jokaiselle luokalle 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 havaintojen kokonaismäärä (luokka 1);
  • N=TN+FP\text{N} = \textcolor{green}{\text{TN}} + \textcolor{red}{\text{FP}} – negatiivisten havaintojen kokonaismäärä (luokka 0).

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

Kuitenkin tasapainotettu tarkkuus ei edelleenkään erottele tyypin 1 ja tyypin 2 virheitä – aivan kuten tavallinen tarkkuuskaan ei tee. Tässä kohtaa precision ja recall tulevat mukaan.

Precision

Precision-mittari ilmaisee, kuinka moni mallin positiivisista ennusteista oli todella positiivinen. 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}}}

Käyttämällä tarkkuusmittaria voidaan ymmärtää, kuinka usein tyypin 1 virhe esiintyy. Korkea tarkkuus tarkoittaa, että tyypin 1 virheet ovat harvinaisia, kun taas matala tarkkuus viittaa siihen, että tyypin 1 virheitä esiintyy usein.

Recall

Recall-mittari osoittaa, kuinka suuren osan todellisista positiivisista tapauksista malli ennustaa oikein:

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

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

Sekä tarkkuudella että recallilla on kuitenkin rajoituksia. Esimerkiksi malli, joka ennustaa vain positiivisen luokan (1), saavuttaa täydellisen recallin, mutta sen tarkkuus on heikko. Toisaalta malli, joka ennustaa oikein vain yhden positiivisen tapauksen ja luokittelee kaiken muun negatiiviseksi, saavuttaa täydellisen tarkkuuden, mutta erittäin huonon recallin.

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

F1-pisteet

F1-pisteet ovat tarkkuuden ja palautuksen harmoninen keskiarvo. Harmonista keskiarvoa suositaan tavallisen (aritmeettisen) keskiarvon sijaan, koska se rankaisee tilanteita, joissa toinen arvoista (joko tarkkuus tai palautus) 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ä tarkkuuden että palautuksen yhdeksi mittariksi. Arvo on korkea vain, jos sekä tarkkuus että palautus ovat suhteellisen korkeita, mikä tekee siitä hyödyllisen mittarin, kun molempien virhetyyppien tasapainottaminen on tärkeää.

Oikean mittarin valinta riippuu tehtävästä. Tarkkuus (tai tasapainotettu tarkkuus epätasapainoisissa aineistoissa) on intuitiivinen ja antaa yleiskuvan mallin kokonaissuorituskyvystä. Jos tarvitset tarkempaa tietoa mallin tekemistä virheistä, tarkkuus auttaa tunnistamaan tyypin 1 virheet, kun taas palautus korostaa tyypin 2 virheitä. F1-pisteet osoittavat, kuinka hyvin malli on tasapainossa sekä tyypin 1 että tyypin 2 virheiden suhteen.

Note
Opiskele lisää

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

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 yhdellä kertaa, 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))
copy
Note
Huomio

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

question mark

Mikä arviointimittari tarjoaa tasapainon tarkkuuden (precision) ja palautuksen (recall) välillä, antaen yhden pistemäärän, joka heijastaa molempia?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 5. Luku 2
some-alt