Opetus-Testausjako ja Ristiinvalidointi
Aiemmissa luvuissa rakensimme malleja ja ennustimme uusia arvoja. Meillä ei kuitenkaan ole tietoa siitä, kuinka hyvin malli suoriutuu 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.
Yleensä mallista varataan 70-90 % koulutusjoukolle ja 10-30 % testijoukolle.
Kun tietoaineistossasi on miljoonia havaintoja, pelkästään muutaman tuhannen käyttäminen testaukseen on yleensä riittävää. Tällöin voit varata testaukseen jopa alle 10 % aineistosta.
Nyt voimme kouluttaa mallin koulutusjoukolla ja arvioida sen tarkkuutta testijoukolla.
123456789101112131415161718192021from 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 = scaler.fit_transform(X_train) X_test = 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))
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 vain 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 ehkäisemään ylisovittamista 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 lopputestiä.
Ajatuksena 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, malli tulee arvioida erillisellä testijoukolla puolueettoman arvion saamiseksi todellisesta suorituskyvystä.
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.
Koulutamme viisi mallia hieman erilaisilla osajoukoilla. Jokaiselle mallille lasketaan testijoukon tarkkuus:
accuracy=predicted correctly+predicted incorrectlypredicted correctlyKun tämä on tehty, voidaan laskea näiden viiden tarkkuuden keskiarvo, joka toimii ristiinvalidoinnin tarkkuutena:
accuracyavg=5accuracy1+accuracy2+...+accuracy5Tämä menetelmä on luotettavampi, koska laskimme tarkkuusluvun käyttäen kaikkia tietojamme – vain jaettuna eri tavoin viidessä iteraatiossa.
Nyt kun tiedämme, kuinka hyvin malli suoriutuu, voimme kouluttaa sen uudelleen koko aineistolla.
Onneksi sklearn tarjoaa cross_val_score()-funktion mallin arviointiin ristivalidoinnilla, joten sinun ei tarvitse toteuttaa sitä itse:
Tässä esimerkki siitä, miten ristivalidointia käytetään k-NN-mallin kanssa, joka on koulutettu Star Wars -arviointiaineistolla:
12345678910111213141516171819from 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())
Luokittelussa oletusarvoisesti käytetty pistemittari on tarkkuus.
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
Awesome!
Completion rate improved to 4.17
Opetus-Testausjako ja Ristiinvalidointi
Pyyhkäise näyttääksesi valikon
Aiemmissa luvuissa rakensimme malleja ja ennustimme uusia arvoja. Meillä ei kuitenkaan ole tietoa siitä, kuinka hyvin malli suoriutuu 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.
Yleensä mallista varataan 70-90 % koulutusjoukolle ja 10-30 % testijoukolle.
Kun tietoaineistossasi on miljoonia havaintoja, pelkästään muutaman tuhannen käyttäminen testaukseen on yleensä riittävää. Tällöin voit varata testaukseen jopa alle 10 % aineistosta.
Nyt voimme kouluttaa mallin koulutusjoukolla ja arvioida sen tarkkuutta testijoukolla.
123456789101112131415161718192021from 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 = scaler.fit_transform(X_train) X_test = 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))
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 vain 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 ehkäisemään ylisovittamista 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 lopputestiä.
Ajatuksena 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, malli tulee arvioida erillisellä testijoukolla puolueettoman arvion saamiseksi todellisesta suorituskyvystä.
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.
Koulutamme viisi mallia hieman erilaisilla osajoukoilla. Jokaiselle mallille lasketaan testijoukon tarkkuus:
accuracy=predicted correctly+predicted incorrectlypredicted correctlyKun tämä on tehty, voidaan laskea näiden viiden tarkkuuden keskiarvo, joka toimii ristiinvalidoinnin tarkkuutena:
accuracyavg=5accuracy1+accuracy2+...+accuracy5Tämä menetelmä on luotettavampi, koska laskimme tarkkuusluvun käyttäen kaikkia tietojamme – vain jaettuna eri tavoin viidessä iteraatiossa.
Nyt kun tiedämme, kuinka hyvin malli suoriutuu, voimme kouluttaa sen uudelleen koko aineistolla.
Onneksi sklearn tarjoaa cross_val_score()-funktion mallin arviointiin ristivalidoinnilla, joten sinun ei tarvitse toteuttaa sitä itse:
Tässä esimerkki siitä, miten ristivalidointia käytetään k-NN-mallin kanssa, joka on koulutettu Star Wars -arviointiaineistolla:
12345678910111213141516171819from 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())
Luokittelussa oletusarvoisesti käytetty pistemittari on tarkkuus.
Kiitos palautteestasi!