Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Train-Test-Jako ja Ristiinvalidointi | Osio
Practice
Projects
Quizzes & Challenges
Visat
Challenges
/
Ohjatun Oppimisen Perusteet

bookTrain-Test-Jako ja Ristiinvalidointi

Aiemmissa luvuissa rakensimme mallit ja ennustimme uusia arvoja. Mutta emme tiedä, kuinka hyvin malli toimii ja ovatko nämä ennusteet luotettavia.

Opetus- ja testijoukon jako

Mallin suorituskyvyn mittaamiseksi tarvitsemme osan merkittyä dataa, jota malli ei ole nähnyt. Siksi jaamme kaikki merkityt tiedot satunnaisesti opetusjoukkoon ja testijoukkoon.

Tämä onnistuu käyttämällä train_test_split()-kirjaston sklearn-funktiota.

Parametrit:

  • X — piirteiden arvojen taulukko;
  • y — kohdearvojen taulukko;
  • test_size — testijoukon osuus;

Palauttaa:

  • X_train, X_test, y_train, y_test — taulukot, joilla on samat tietotyypit kuin X ja y.

Yleensä mallista jaetaan noin 70–90 % harjoitusaineistoon ja 10–30 % testiaineistoon.

Note
Huomio

Kun tietoaineistossa on miljoonia havaintoja, muutama tuhat testaukseen riittää yleensä hyvin. Tällöin testaukseen voidaan varata jopa alle 10 % aineistosta.

Nyt voidaan kouluttaa malli harjoitusaineistolla ja arvioida sen tarkkuus testiaineistolla.

123456789101112131415161718192021
from sklearn.neighbors import KNeighborsClassifier from sklearn.preprocessing import StandardScaler import pandas as pd 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/starwars_binary.csv') X = df.drop('StarWars6', axis=1) y = df['StarWars6'] # Splitting the data X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) knn = KNeighborsClassifier(n_neighbors=3).fit(X_train_scaled, y_train) # Printing the accuracy on the test set print(knn.score(X_test_scaled, y_test))
copy

Mutta tässä lähestymistavassa on joitakin puutteita:

  • Kaikkea saatavilla olevaa dataa ei käytetä mallin kouluttamiseen, mikä voisi parantaa mallia;
  • Koska mallin tarkkuutta arvioidaan pienellä osalla dataa (testijoukko), tämä tarkkuus voi olla epäluotettava pienillä aineistoilla. Voit suorittaa yllä olevan koodin useita kertoja ja havaita, kuinka tarkkuus muuttuu joka kerta, kun uusi testijoukko arvotaan.

Ristiinvalidointi

Ristiinvalidointi on suunniteltu ratkaisemaan ylisovittamisen ongelmaa ja varmistamaan, että malli yleistyy hyvin uuteen, aiemmin näkemättömään dataan. Voit ajatella sitä mallin luokkahuonekoulutuksena — se auttaa mallia oppimaan tasapainoisemmin ennen varsinaista lopullista testiä.

Ideana on sekoittaa koko aineisto ja jakaa se n yhtä suureen osaan, joita kutsutaan lohkoksi. Tämän jälkeen malli käy läpi n iteraatiota. Jokaisessa iteraatiossa n-1 lohkoa käytetään koulutukseen ja 1 lohko validointiin. Näin jokainen osa dataa toimii validointina kerran, ja saadaan luotettavampi arvio mallin suorituskyvystä.

Huomioi, että ristiinvalidointi ei korvaa testijoukkoa. Kun ristiinvalidointia on käytetty mallin valintaan ja hienosäätöön, se tulee arvioida erillisellä testijoukolla puolueettoman arvion saamiseksi mallin todellisesta suorituskyvystä.

Note
Huomio

Yleinen valinta taitosten määräksi on 5. Tällöin yksi taitos toimii testijoukkona ja jäljelle jäävät 4 taitosta käytetään koulutukseen.

Koulutetaan viisi mallia hieman erilaisilla osajoukoilla. Jokaiselle mallille lasketaan testijoukon tarkkuus:

accuracy=predicted correctlypredicted correctly+predicted incorrectly\text{accuracy} = \frac{\text{predicted correctly}}{\text{predicted correctly} + \text{predicted incorrectly}}

Kun tämä on tehty, voidaan laskea näiden viiden tarkkuuden keskiarvo, joka toimii ristiinvalidoinnin tarkkuutena:

accuracyavg=accuracy1+accuracy2+...+accuracy55\text{accuracy}_{avg} = \frac{\text{accuracy}_1+\text{accuracy}_2+...+\text{accuracy}_5}{5}

Tämä menetelmä on luotettavampi, koska laskimme tarkkuuspisteet käyttäen kaikkia tietojamme – vain jaettuna eri tavalla viidessä iteraatiossa.

Nyt kun tiedämme, kuinka hyvin malli suoriutuu, voimme uudelleenkouluttaa sen käyttämällä koko aineistoa.

Onneksi sklearn tarjoaa cross_val_score()-funktion mallin arviointiin ristivalidoinnilla, joten sinun ei tarvitse toteuttaa sitä itse:

Parametrit:

  • estimator — mallin olio;
  • X — piirteiden arvojen taulukko;
  • y — kohdearvojen taulukko;
  • cv — taitosten määrä (oletuksena 5);
  • scoring — metriikka (oletuksena tarkkuus);

Palauttaa:

  • scores — pisteiden taulukko jokaisessa iteraatiossa.

Tässä on esimerkki siitä, miten ristivalidointia käytetään k-NN-mallin kanssa, joka on koulutettu Star Wars -arviointiaineistolla:

12345678910111213141516171819
from sklearn.neighbors import KNeighborsClassifier from sklearn.preprocessing import StandardScaler import pandas as pd from sklearn.model_selection import cross_val_score df = pd.read_csv('https://codefinity-content-media.s3.eu-west-1.amazonaws.com/b71ff7ac-3932-41d2-a4d8-060e24b00129/starwars_binary.csv') X = df.drop('StarWars6', axis=1) y = df['StarWars6'] scaler = StandardScaler() X = scaler.fit_transform(X) knn = KNeighborsClassifier(n_neighbors=3) # Calculating the accuracy for each split scores = cross_val_score(knn, X, y, cv=5) print('Scores: ', scores) print('Average score:', scores.mean())
copy

Luokittelussa oletusarvoisesti käytetty pistemittari on tarkkuus.

question mark

Valitse kaikki oikeat väittämät.

Select all correct answers

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 1. Luku 19

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

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

bookTrain-Test-Jako ja Ristiinvalidointi

Pyyhkäise näyttääksesi valikon

Aiemmissa luvuissa rakensimme mallit ja ennustimme uusia arvoja. Mutta emme tiedä, kuinka hyvin malli toimii ja ovatko nämä ennusteet luotettavia.

Opetus- ja testijoukon jako

Mallin suorituskyvyn mittaamiseksi tarvitsemme osan merkittyä dataa, jota malli ei ole nähnyt. Siksi jaamme kaikki merkityt tiedot satunnaisesti opetusjoukkoon ja testijoukkoon.

Tämä onnistuu käyttämällä train_test_split()-kirjaston sklearn-funktiota.

Parametrit:

  • X — piirteiden arvojen taulukko;
  • y — kohdearvojen taulukko;
  • test_size — testijoukon osuus;

Palauttaa:

  • X_train, X_test, y_train, y_test — taulukot, joilla on samat tietotyypit kuin X ja y.

Yleensä mallista jaetaan noin 70–90 % harjoitusaineistoon ja 10–30 % testiaineistoon.

Note
Huomio

Kun tietoaineistossa on miljoonia havaintoja, muutama tuhat testaukseen riittää yleensä hyvin. Tällöin testaukseen voidaan varata jopa alle 10 % aineistosta.

Nyt voidaan kouluttaa malli harjoitusaineistolla ja arvioida sen tarkkuus testiaineistolla.

123456789101112131415161718192021
from sklearn.neighbors import KNeighborsClassifier from sklearn.preprocessing import StandardScaler import pandas as pd 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/starwars_binary.csv') X = df.drop('StarWars6', axis=1) y = df['StarWars6'] # Splitting the data X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) knn = KNeighborsClassifier(n_neighbors=3).fit(X_train_scaled, y_train) # Printing the accuracy on the test set print(knn.score(X_test_scaled, y_test))
copy

Mutta tässä lähestymistavassa on joitakin puutteita:

  • Kaikkea saatavilla olevaa dataa ei käytetä mallin kouluttamiseen, mikä voisi parantaa mallia;
  • Koska mallin tarkkuutta arvioidaan pienellä osalla dataa (testijoukko), tämä tarkkuus voi olla epäluotettava pienillä aineistoilla. Voit suorittaa yllä olevan koodin useita kertoja ja havaita, kuinka tarkkuus muuttuu joka kerta, kun uusi testijoukko arvotaan.

Ristiinvalidointi

Ristiinvalidointi on suunniteltu ratkaisemaan ylisovittamisen ongelmaa ja varmistamaan, että malli yleistyy hyvin uuteen, aiemmin näkemättömään dataan. Voit ajatella sitä mallin luokkahuonekoulutuksena — se auttaa mallia oppimaan tasapainoisemmin ennen varsinaista lopullista testiä.

Ideana on sekoittaa koko aineisto ja jakaa se n yhtä suureen osaan, joita kutsutaan lohkoksi. Tämän jälkeen malli käy läpi n iteraatiota. Jokaisessa iteraatiossa n-1 lohkoa käytetään koulutukseen ja 1 lohko validointiin. Näin jokainen osa dataa toimii validointina kerran, ja saadaan luotettavampi arvio mallin suorituskyvystä.

Huomioi, että ristiinvalidointi ei korvaa testijoukkoa. Kun ristiinvalidointia on käytetty mallin valintaan ja hienosäätöön, se tulee arvioida erillisellä testijoukolla puolueettoman arvion saamiseksi mallin todellisesta suorituskyvystä.

Note
Huomio

Yleinen valinta taitosten määräksi on 5. Tällöin yksi taitos toimii testijoukkona ja jäljelle jäävät 4 taitosta käytetään koulutukseen.

Koulutetaan viisi mallia hieman erilaisilla osajoukoilla. Jokaiselle mallille lasketaan testijoukon tarkkuus:

accuracy=predicted correctlypredicted correctly+predicted incorrectly\text{accuracy} = \frac{\text{predicted correctly}}{\text{predicted correctly} + \text{predicted incorrectly}}

Kun tämä on tehty, voidaan laskea näiden viiden tarkkuuden keskiarvo, joka toimii ristiinvalidoinnin tarkkuutena:

accuracyavg=accuracy1+accuracy2+...+accuracy55\text{accuracy}_{avg} = \frac{\text{accuracy}_1+\text{accuracy}_2+...+\text{accuracy}_5}{5}

Tämä menetelmä on luotettavampi, koska laskimme tarkkuuspisteet käyttäen kaikkia tietojamme – vain jaettuna eri tavalla viidessä iteraatiossa.

Nyt kun tiedämme, kuinka hyvin malli suoriutuu, voimme uudelleenkouluttaa sen käyttämällä koko aineistoa.

Onneksi sklearn tarjoaa cross_val_score()-funktion mallin arviointiin ristivalidoinnilla, joten sinun ei tarvitse toteuttaa sitä itse:

Parametrit:

  • estimator — mallin olio;
  • X — piirteiden arvojen taulukko;
  • y — kohdearvojen taulukko;
  • cv — taitosten määrä (oletuksena 5);
  • scoring — metriikka (oletuksena tarkkuus);

Palauttaa:

  • scores — pisteiden taulukko jokaisessa iteraatiossa.

Tässä on esimerkki siitä, miten ristivalidointia käytetään k-NN-mallin kanssa, joka on koulutettu Star Wars -arviointiaineistolla:

12345678910111213141516171819
from sklearn.neighbors import KNeighborsClassifier from sklearn.preprocessing import StandardScaler import pandas as pd from sklearn.model_selection import cross_val_score df = pd.read_csv('https://codefinity-content-media.s3.eu-west-1.amazonaws.com/b71ff7ac-3932-41d2-a4d8-060e24b00129/starwars_binary.csv') X = df.drop('StarWars6', axis=1) y = df['StarWars6'] scaler = StandardScaler() X = scaler.fit_transform(X) knn = KNeighborsClassifier(n_neighbors=3) # Calculating the accuracy for each split scores = cross_val_score(knn, X, y, cv=5) print('Scores: ', scores) print('Average score:', scores.mean())
copy

Luokittelussa oletusarvoisesti käytetty pistemittari on tarkkuus.

question mark

Valitse kaikki oikeat väittämät.

Select all correct answers

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 1. Luku 19
some-alt