Scikit-Learn Tutorial: Kuinka asentaa ja Scikit-Learn esimerkkejä
⚡ Älykäs yhteenveto
Scikit-learn on avoimen lähdekoodin Python kirjasto, joka kattaa esikäsittelyn, luokittelun, regression, klusteroinnin ja mallin valinnan yhden yhtenäisen estimaattorirajapinnan takana, mikä pitää koneoppimisen työnkulun lyhyenä, luettavana ja toistettavana raakadatasta pisteytettyihin ennusteisiin.
Mitä Scikit-learn on?
Scikit opittava on avoimen lähdekoodin Python kirjasto varten koneoppiminenSe tukee vakiintuneita algoritmeja, kuten KNN:ää, gradientin tehostamista, satunnaismetsää ja SVM:ää, ja se on rakennettu ... päälle. nuhjuinen ja SciPy. Scikit-learnia käytetään laajalti Kaggle-kilpailuissa sekä merkittävissä teknologiayrityksissä. Se kattaa esikäsittelyn, ulottuvuuden vähentämisen, luokittelun, regression, klusteroinnin ja mallin valinnan.
Scikit-learnilla on avoimen lähdekoodin kirjastoista parasta dokumentaatiota. Se tarjoaa jopa interaktiivisen arviointikaavion, Oikean arvioijan valitseminen, joka opastaa sinua tietojoukkosi koosta kokeilemisen arvoisten algoritmien lyhyeen luetteloon.
Alla oleva kuva havainnollistaa Scikit-learnin toimintaa.
Scikit-learnia ei ole vaikea käyttää ja se antaa erinomaisia tuloksia. Se kuitenkin harjoittelee suorittimella: työ rinnakkaistetaan ytimien välillä n_jobs-argumentilla eikä näytönohjaimella. Syväoppimisalgoritmin suorittaminen sillä on mahdollista, mutta harvoin optimaalista, varsinkin jos osaat jo käyttää sitä. TensorFlow.
Kuinka ladata ja asentaa Scikit-learn
Nyt tässä Python Scikit-learn-opetusohjelmassa opit lataamaan ja asentamaan Scikit-learnin:
Vaihtoehto 1: AWS
Scikit-learnia voidaan käyttää AWS:n päällä. Docker-levykuva, jossa on esiasennettu scikit-learn, säästää asennustyön kokonaan.
Asentaaksesi kehittäjäversion, suorita alla oleva komento sisällä Jupyter:
import sys !{sys.executable} -m pip install git+git://github.com/scikit-learn/scikit-learn.git
Vaihtoehto 2: Mac tai Windows käyttämällä Anacondaa
Lisätietoja Anacondan asennuksesta on osoitteessa Kuinka ladata ja asentaa TensorFlow.
Tämän ohjeen kirjoitushetkellä scikitin kehittäjät olivat julkaisseet kehitysversion, joka korjasi silloisessa julkaisussa olleet ongelmat, joten alla olevat vaiheet käyttävät kyseistä kehittäjän versiota. Nykyisellä uudella koneella nykyinen vakaa julkaisu sisältää jo kaikki tässä käytetyt muuntajat, ja pip-asennus -U scikit-learn on tarpeeksi.
Kuinka asentaa scikit-learn Conda Environmentin avulla
Jos asensit scikit-learnin Conda-ympäristössä, päivitä versioon 0.20 noudattamalla alla olevia ohjeita.
Vaihe 1) Aktivoi tensorflow-ympäristö
source activate hello-tf
Vaihe 2) Poista scikit-learn conda-komennolla
conda remove scikit-learn
Vaihe 3) Asenna kehittäjäversio
Asenna scikit-learn-kehittäjäversio tarvittavine kirjastoineen.
conda install -c anaconda git
pip install Cython
pip install h5py
pip install git+git://github.com/scikit-learn/scikit-learn.git
HUOMAUTUS: Windows käyttäjien tarvitsemat Microsoft Visuaalinen C++ 14. Voit saada sen täältä.
Scikit-Learn-esimerkki koneoppimisen kanssa
Tämä Scikit-opetusohjelma on jaettu kahteen osaan:
- Koneoppiminen scikit-learnillä
- Kuinka luottaa malliisi LIME:n kanssa
Ensimmäisessä osassa kerrotaan, miten rakennetaan putki, luodaan malli ja viritetään hyperparametreja, kun taas toisessa osassa käsitellään mallin tulkintaa.
Vaihe 1) Tuo tiedot
Tässä Scikit-oppimisoppaassa käytät aikuisten väestönlaskennan aineistoa.
Tiedosto luetaan suoraan UCI:n koneoppimisarkistoista alla olevassa koodissa, joten manuaalista lataamista ei tarvita. Jos olet kiinnostunut kuvailevista tilastoista, Dive- ja Overview-työkalut ovat tutustumisen arvoisia. Katso tämä opetusohjelma saadaksesi lisätietoja sukelluksesta ja yleiskatsauksesta.
Tuot tietojoukon pandas-funktiolla. Huomaa, että sinun on muunnettava jatkuvat muuttujat liukulukumuotoon.
Tämä tietojoukko sisältää kahdeksan kategorista muuttujaa, jotka on lueteltu kohdassa CATE_FEATURES:
- työluokka
- koulutus
- avio-
- ammatti
- yhteys
- rotu
- sukupuoli
- Kotimaa
Se sisältää myös kuusi jatkuvaa muuttujaa, jotka on lueteltu kohdassa CONTI_FEATURES:
- ikä
- fnlwgt
- koulutus_nm
- myyntivoitto
- pääoma_tappio
- tuntia_viikko
Listat täytetään tässä käsin, jotta saat selkeämmän käsityksen siitä, mitkä sarakkeet ovat käytössä. Nopeampi tapa rakentaa luettelo kategorisista tai jatkuvista sarakkeista on:
## List Categorical CATE_FEATURES = df_train.iloc[:,:-1].select_dtypes('object').columns print(CATE_FEATURES) ## List continuous CONTI_FEATURES = df_train._get_numeric_data() print(CONTI_FEATURES)
Tässä on koodi tietojen tuontia varten:
# Import dataset import pandas as pd ## Define path data COLUMNS = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital', 'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss', 'hours_week', 'native_country', 'label'] ### Define continuous list CONTI_FEATURES = ['age', 'fnlwgt','capital_gain', 'education_num', 'capital_loss', 'hours_week'] ### Define categorical list CATE_FEATURES = ['workclass', 'education', 'marital', 'occupation', 'relationship', 'race', 'sex', 'native_country'] ## Prepare the data features = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital', 'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss', 'hours_week', 'native_country'] PATH = "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data" df_train = pd.read_csv(PATH, skipinitialspace=True, names = COLUMNS, index_col=False) df_train[CONTI_FEATURES] =df_train[CONTI_FEATURES].astype('float64') df_train.describe()
Kutsumalla describe()-funktiota kehyksessä palautetaan kuuden jatkuvan sarakkeen yhteenvetotilastot:
| ikä | fnlwgt | koulutus_nm | myyntivoitto | pääoma_tappio | tuntia_viikko | |
|---|---|---|---|---|---|---|
| laskea | 32561.000000 | 3.256100e + 04 | 32561.000000 | 32561.000000 | 32561.000000 | 32561.000000 |
| tarkoittaa | 38.581647 | 1.897784e + 05 | 10.080679 | 1077.648844 | 87.303830 | 40.437456 |
| std | 13.640433 | 1.055500e + 05 | 2.572720 | 7385.292085 | 402.960219 | 12.347429 |
| minuuttia | 17.000000 | 1.228500e + 04 | 1.000000 | 0.000000 | 0.000000 | 1.000000 |
| 25% | 28.000000 | 1.178270e + 05 | 9.000000 | 0.000000 | 0.000000 | 40.000000 |
| 50% | 37.000000 | 1.783560e + 05 | 10.000000 | 0.000000 | 0.000000 | 40.000000 |
| 75% | 48.000000 | 2.370510e + 05 | 12.000000 | 0.000000 | 0.000000 | 45.000000 |
| max | 90.000000 | 1.484705e + 06 | 16.000000 | 99999.000000 | 4356.000000 | 99.000000 |
Voit tarkistaa native_country-ominaisuuden yksilöllisten arvojen määrän. Vain yksi kotitalous on kotoisin Holandista (Alankomaista). Tämä kotitalous ei tuo mukanaan tietoa ja antaa virheen harjoittelun aikana.
df_train.native_country.value_counts()
United-States 29170 Mexico 643 ? 583 Philippines 198 Germany 137 Canada 121 Puerto-Rico 114 El-Salvador 106 India 100 Cuba 95 England 90 Jamaica 81 South 80 China 75 Italy 73 Dominican-Republic 70 Vietnam 67 Guatemala 64 Japan 62 Poland 60 Columbia 59 Taiwan 51 Haiti 44 Iran 43 Portugal 37 Nicaragua 34 Peru 31 France 29 Greece 29 Ecuador 28 Ireland 24 Hong 20 Cambodia 19 Trinadad&Tobago 19 Thailand 18 Laos 18 Yugoslavia 16 Outlying-US(Guam-USVI-etc) 14 Honduras 13 Hungary 13 Scotland 12 Holand-Netherlands 1 Name: native_country, dtype: int64
Voit jättää tämän epäinformatiivisen rivin pois tietojoukosta:
## Drop Netherland, because only one row df_train = df_train[df_train.native_country != "Holand-Netherlands"]
Seuraavaksi tallennat jatkuvien ominaisuuksien sijainnin luetteloon. Tarvitset sitä seuraavassa vaiheessa putkilinjan rakentamiseen.
Alla oleva koodi käy läpi kaikki CONTI_FEATURES-luettelon sarakenimet, lukee jokaisen sijainnin (eli sen sarakenumeron) ja lisää sen conti_features-nimiseen luetteloon.
## Get the column index of the categorical features conti_features = [] for i in CONTI_FEATURES: position = df_train.columns.get_loc(i) conti_features.append(position) print(conti_features)
[0, 2, 10, 4, 11, 12]
Seuraava lohko tekee saman työn kategorisille muuttujille.
## Get the column index of the categorical features categorical_features = [] for i in CATE_FEATURES: position = df_train.columns.get_loc(i) categorical_features.append(position) print(categorical_features)
[1, 3, 5, 6, 7, 8, 9, 13]
Tarkastellaan nyt itse tietojoukkoa. Jokainen kategorinen ominaisuus on merkkijono, eikä mallille voida syöttää merkkijonoarvoa, joten tietojoukko on muunnettava mallimuuttujilla.
df_train.head(5)
Itse asiassa tarvitset yhden sarakkeen jokaista ryhmää kohden jokaisessa ominaisuudessa. Suorita ensin alla oleva koodi laskeaksesi tarvittavien sarakkeiden kokonaismäärän.
print(df_train[CATE_FEATURES].nunique(), 'There are',sum(df_train[CATE_FEATURES].nunique()), 'groups in the whole dataset')
workclass 9
education 16
marital 7
occupation 15
relationship 6
race 5
sex 2
native_country 41
dtype: int64 There are 101 groups in the whole dataset
Koko tietojoukko sisältää 101 ryhmää, kuten yllä on esitetty. Pelkästään työluokkaominaisuudella on yhdeksän ryhmää. Voit listata ryhmien nimet alla olevalla koodilla; unique() palauttaa kunkin kategorisen ominaisuuden erilliset arvot.
for i in CATE_FEATURES: print(df_train[i].unique())
['State-gov' 'Self-emp-not-inc' 'Private' 'Federal-gov' 'Local-gov' '?' 'Self-emp-inc' 'Without-pay' 'Never-worked'] ['Bachelors' 'HS-grad' '11th' 'Masters' '9th' 'Some-college' 'Assoc-acdm' 'Assoc-voc' '7th-8th' 'Doctorate' 'Prof-school' '5th-6th' '10th' '1st-4th' 'Preschool' '12th'] ['Never-married' 'Married-civ-spouse' 'Divorced' 'Married-spouse-absent' 'Separated' 'Married-AF-spouse' 'Widowed'] ['Adm-clerical' 'Exec-managerial' 'Handlers-cleaners' 'Prof-specialty' 'Other-service' 'Sales' 'Craft-repair' 'Transport-moving' 'Farming-fishing' 'Machine-op-inspct' 'Tech-support' '?' 'Protective-serv' 'Armed-Forces' 'Priv-house-serv'] ['Not-in-family' 'Husband' 'Wife' 'Own-child' 'Unmarried' 'Other-relative'] ['White' 'Black' 'Asian-Pac-Islander' 'Amer-Indian-Eskimo' 'Other'] ['Male' 'Female'] ['United-States' 'Cuba' 'Jamaica' 'India' '?' 'Mexico' 'South' 'Puerto-Rico' 'Honduras' 'England' 'Canada' 'Germany' 'Iran' 'Philippines' 'Italy' 'Poland' 'Columbia' 'Cambodia' 'Thailand' 'Ecuador' 'Laos' 'Taiwan' 'Haiti' 'Portugal' 'Dominican-Republic' 'El-Salvador' 'France' 'Guatemala' 'China' 'Japan' 'Yugoslavia' 'Peru' 'Outlying-US(Guam-USVI-etc)' 'Scotland' 'Trinadad&Tobago' 'Greece' 'Nicaragua' 'Vietnam' 'Hong' 'Ireland' 'Hungary']
Harjoitusdatajoukko sisältää siis 101 + 6 saraketta: yhden kuuman ryhmän sekä kuusi jatkuvaa ominaisuutta.
Scikit-learn voi hoitaa muuntamisen kahdessa vaiheessa:
- Muunna merkkijono tunnukseksi. State-gov muuttuu tunnukseksi 1, Self-emp-not-inc muuttuu tunnukseksi 2 ja niin edelleen. LabelEncoder tekee tämän puolestasi.
- Transponoi jokainen tunnus uuteen sarakkeeseen. Aineistossa on 101 ryhmätunnusta, joten jokaista kategorista ominaisuusryhmää varten on 101 saraketta. Scikit-learn tarjoaa OneHotEncoderin tätä toimintoa varten.
Vaihe 2) Luo juna/testisarja
Nyt kun tietojoukko on valmis, jaa se 80/20: 80 prosenttia harjoitusjoukolle ja 20 prosenttia testijoukolle.
Voit käyttää train_test_split-muuttujaa. Ensimmäinen argumentti on ominaisuuksien datakehys ja toinen on otsikko. Testijoukon koko asetetaan test_size-muuttujalla.
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(df_train[features], df_train.label, test_size = 0.2, random_state=0) X_train.head(5) print(X_train.shape, X_test.shape)
(26048, 14) (6512, 14)
Vaihe 3) Rakenna putki
Putkilinja helpottaa mallin syöttämistä yhdenmukaisella datalla. Ajatuksena on työntää raakadata yhden objektin läpi, joka suorittaa kaikki toiminnot järjestyksessä.
Tämän tietojoukon avulla sinun on standardoitava jatkuvat muuttujat ja muunnettava kategoriset muuttujat. Mikä tahansa operaatio voi toimia putken sisällä: puuttuvat arvot voidaan korvata keskiarvolla tai mediaanilla, ja uusia muuttujia voidaan luoda.
Sinulla on kaksi vaihtoehtoa: koodata molemmat prosessit kovakoodauksella tai rakentaa liukuhihna. Kovakoodaus voi vuotaa testidataa sovitettuihin tilastoihin ja aiheuttaa epäjohdonmukaisuuksia ajan myötä, joten liukuhihna on parempi vaihtoehto.
from sklearn.preprocessing import StandardScaler, OneHotEncoder, LabelEncoder from sklearn.compose import ColumnTransformer, make_column_transformer from sklearn.pipeline import make_pipeline from sklearn.linear_model import LogisticRegression
Putkilinja suorittaa kaksi toimintoa ennen logistisen luokittelijan syöttämistä:
- Standardoi muuttuja: StandardScaler()
- Muunna kategoriset ominaisuudet: OneHotEncoder(sparse=False)
Molemmat vaiheet suoritetaan make_column_transformer-funktiolla. Kun tätä ohjetta kirjoitettiin, funktiota ei ollut scikit-learnin julkaistussa versiossa (0.19), minkä vuoksi käytettiin kehittäjän versiota; se on toimitettu jokaisessa vakaassa julkaisussa versiosta 0.20 lähtien.
make_column_transformer on yksinkertainen: määrittelet muunnettavat sarakkeet ja käytettävän muunnoksen. Jatkuvien ominaisuuksien standardoimiseksi annat seuraavat tiedot:
- conti_features, StandardScaler() make_column_transformer-muuttujassa
- conti_features: jatkuvien sarakkeiden luettelo
- StandardScaler: standardoi kyseiset sarakkeet
make_column_transformer-luokituksen sisällä oleva OneHotEncoder-objekti koodaa otsikot automaattisesti.
preprocess = make_column_transformer(
(conti_features, StandardScaler()),
### Need to be numeric not string to specify columns name
(categorical_features, OneHotEncoder(sparse=False))
)
Versiohuomautus: Yllä olevan lohkon kaksi argumenttia on siirtynyt eteenpäin. Nykyiset versiot odottavat muuntajan olevan ensin ja sarakkeet vasta toisena, ja harva nimettiin uudelleen harva_lähtö scikit-learn 1.2:ssa ja poistettu 1.4:ssä, joten uudempi koodi lukee OneHotEncoder(sparse_output=False).
Voit testata putken toimivuutta funktiolla fit_transform. Tulosteen tulisi olla muotoa 26048, 107.
preprocess.fit_transform(X_train).shape
(26048, 107)
Datamuuntaja on valmis. Luot putken make_pipeline-funktiolla, ja kun data on muunnettu, syötät tietoja logistiseen regressioon.
model = make_pipeline(
preprocess,
LogisticRegression())
Mallin kouluttaminen scikit-learnilla on sitten yksinkertaista: kutsu fit-metodia putkelle. Voit tulostaa tarkkuuden score-metodilla.
model.fit(X_train, y_train) print("logistic regression score: %f" % model.score(X_test, y_test))
logistic regression score: 0.850891
Lopuksi voit ennustaa luokat predict_proba-funktiolla, joka palauttaa kunkin luokan todennäköisyyden. Huomaa, että kahden todennäköisyyden summa on yksi.
model.predict_proba(X_test)
array([[0.83576663, 0.16423337],
[0.94582765, 0.05417235],
[0.64760587, 0.35239413],
...,
[0.99639252, 0.00360748],
[0.02072181, 0.97927819],
[0.56781353, 0.43218647]])
Vaihe 4) Liukulinjamme käyttäminen ruudukkohaussa
Hyperparametrien, mallin rakenteen korjaavien arvojen, virittäminen voi olla työlästä ja uuvuttavaa.
Yksi tapa arvioida mallia olisi muuttaa harjoitusjoukon kokoa ja mitata suorituskykyä toistamalla harjoitus kymmenen kertaa pistemäärän hajonnan näkemiseksi. Se on paljon manuaalista työtä.
Sen sijaan scikit-learn tarjoaa funktioita, jotka suorittavat parametrien virityksen ja ristiinvalidoinnin puolestasi.
Ristiinvalidointi
Ristivalidointi tarkoittaa, että opetuksen aikana opetusjoukko jaetaan n kertaa taitoksiin ja malli arvioidaan n kertaa. Jos cv on 10, mallia opetetaan ja arvioidaan kymmenen kertaa. Jokaisella kierroksella luokittelija harjoittelee yhdeksällä satunnaisesti valitulla taitoksilla ja kymmenes taitos säilytetään arviointia varten.
Verkkohaku
Jokaisella luokittelijalla on viritettäviä hyperparametreja. Voit kokeilla arvoja yksi kerrallaan tai asettaa parametriruudukon. scikit-learn-dokumentaatiossa luetellaan kaikki logistisen luokittelijan hyväksymät parametrit. Jotta koulutus pysyisi nopeana, tässä esimerkissä viritetään vain C-parametria, joka ohjaa regularisointia. Sen on oltava positiivinen, ja pieni arvo antaa regularisoijalle enemmän painoarvoa.
Käytät GridSearchCV-objektia, joka ottaa viritettävien hyperparametrien sanakirjan. Listaa jokainen hyperparametri ja sen jälkeen arvot, joita haluat kokeilla. C:n virittämiseksi kirjoita:
- 'logisticregression__C': [0.001, 0.01, 0.1, 1.0] — parametrin nimeä edeltää luokittelijan nimi pienellä kirjaimella ja kaksi alaviivaa.
Malli kokeilee neljää eri arvoa: 0.001, 0.01, 0.1 ja 1. Se koulutetaan 10 taitolla, eli cv = 10.
from sklearn.model_selection import GridSearchCV # Construct the parameter grid param_grid = { 'logisticregression__C': [0.001, 0.01,0.1, 1.0], }
Voit nyt kouluttaa mallia GridSearchCV:llä parametreilla grid ja cv.
# Train the model grid_clf = GridSearchCV(model, param_grid, cv=10, iid=False) grid_clf.fit(X_train, y_train)
lähtö:
GridSearchCV(cv=10, error_score='raise-deprecating', estimator=Pipeline(memory=None, steps=[('columntransformer', ColumnTransformer(n_jobs=1, remainder='drop', transformer_weights=None, transformers=[('standardscaler', StandardScaler(copy=True, with_mean=True, with_std=True), [0, 2, 10, 4, 11, 12]), ('onehotencoder', OneHotEncoder(categorical_features=None, categories=None,...ty='l2', random_state=None, solver='liblinear', tol=0.0001, verbose=0, warm_start=False))]), fit_params=None, iid=False, n_jobs=1, param_grid={'logisticregression__C': [0.001, 0.01, 0.1, 1.0]}, pre_dispatch='2*n_jobs', refit=True, return_train_score='warn', scoring=None, verbose=0)
Versiohuomautus: Ishayoiden opettaman iid Tässä tulosteessa näkyvä argumentti vanhentui scikit-learn-versiossa 0.22 ja poistettiin versiossa 0.24, joten se tulisi yksinkertaisesti poistaa GridSearchCV-kutsussa nykyisissä julkaisuissa.
Parhaiden parametrien käyttämiseen käytetään best_params_-metodia.
grid_clf.best_params_
lähtö:
{'logisticregression__C': 1.0}
Kun malli on koulutettu neljällä eri regularisointiarvolla, optimaalinen parametri antaa:
print("best logistic regression from grid search: %f" % grid_clf.best_estimator_.score(X_test, y_test))
paras logistinen regressio ruudukkohausta: 0.850891
Pääset ennustettuihin todennäköisyyksiin seuraavasti:
grid_clf.best_estimator_.predict_proba(X_test)
array([[0.83576677, 0.16423323],
[0.9458291 , 0.0541709 ],
[0.64760416, 0.35239584],
...,
[0.99639224, 0.00360776],
[0.02072033, 0.97927967],
[0.56782222, 0.43217778]])
XGBoost-malli scikit-learnillä
Kokeile nyt yhtä markkinoiden vahvimmista luokittimista. XGBoost on gradienttia tehostava parannus satunnaismetsään. Sen teoreettinen tausta ei kuulu tämän kirjoituksen piiriin. Python Scikit-tutoriaali, mutta muista, että XGBoost on voittanut useita Kaggle-kilpailuja. Keskikokoisella datajoukolla se voi toimia yhtä hyvin kuin syväoppimisalgoritmi tai paremmin.
Luokittelijan kouluttaminen on haastavaa, koska se paljastaa suuren määrän parametreja. Voit tietenkin käyttää GridSearchCV:tä valitaksesi ne puolestasi.
Parempi vaihtoehto tässä on RandomizedSearchCV. GridSearchCV hidastuu, kun ruudukko on suuri, koska hakuavaruus kasvaa jokaisen lisätyn parametrin myötä. RandomizedSearchCV sen sijaan ottaa näytteitä jokaisen hyperparametrin arvoista satunnaisesti jokaisella iteraatiolla, joten 1 000 iteraatiota arvioi 1 000 yhdistelmää. Muuten se toimii paljolti samalla tavalla kuin GridSearchCV.
Sinun on tuotava xgboost. Jos kirjastoa ei ole asennettu, suorita pip3 install xgboost tai asenna se palvelimelta. Jupyter muistikirja, jossa on:
use import sys
!{sys.executable} -m pip install xgboost
Tuo sitten luokittelija ja kaksi hakuapua:
import xgboost from sklearn.model_selection import RandomizedSearchCV from sklearn.model_selection import StratifiedKFold
Seuraava askel tässä Scikitissä Python opetusohjelman tarkoituksena on määrittää viritettävät parametrit. Virallisessa XGBoost-dokumentaatiossa on lueteltu ne kaikki. Tämän vuoksi Python Sklearn-tutoriaalissa valitset vain kaksi hyperparametria, joilla kullakin on kaksi arvoa, koska XGBoostin kouluttaminen vie kauan ja jokainen ylimääräinen ruudukkopiste lisää odotusaikaa.
params = {
'xgbclassifier__gamma': [0.5, 1],
'xgbclassifier__max_depth': [3, 4]
}
Sitten rakennat uuden prosessin, jossa käytetään XGBoost-luokittelijaa ja 600 estimaattoria. n_estimators on itsessään viritettävä, ja korkea arvo voi johtaa ylisovitukseen. Voit kokeilla muita arvoja, mutta huomaa, että se voi viedä tuntikausia. Kaikki muut parametrit säilyttävät oletusarvonsa.
model_xgb = make_pipeline(
preprocess,
xgboost.XGBClassifier(
n_estimators=600,
objective='binary:logistic',
silent=True,
nthread=1)
)
Voit parantaa ristiinvalidointia Stratified K-Folds -ristiinvalidaattorilla. Tässä käytetään vain kolmea taittoa laskennan nopeuttamiseksi, mutta se vaikuttaa laatuun jonkin verran. Lisää tätä määrää omalla koneellasi viiteen tai kymmeneen parempien tulosten saavuttamiseksi. Malli koulutetaan neljän iteraation aikana.
skf = StratifiedKFold(n_splits=3,
shuffle = True,
random_state = 1001)
random_search = RandomizedSearchCV(model_xgb,
param_distributions=params,
n_iter=4,
scoring='accuracy',
n_jobs=4,
cv=skf.split(X_train, y_train),
verbose=3,
random_state=1001)
Satunnaistettu haku on valmis, joten voit kouluttaa mallia.
#grid_xgb = GridSearchCV(model_xgb, params, cv=10, iid=False)
random_search.fit(X_train, y_train)
Fitting 3 folds for each of 4 candidates, totalling 12 fits
[CV] xgbclassifier__max_depth=3, xgbclassifier__gamma=0.5 ............
[CV] xgbclassifier__max_depth=3, xgbclassifier__gamma=0.5 ............
[CV] xgbclassifier__max_depth=3, xgbclassifier__gamma=0.5 ............
[CV] xgbclassifier__max_depth=4, xgbclassifier__gamma=0.5 ............
[CV] xgbclassifier__max_depth=3, xgbclassifier__gamma=0.5, score=0.8759645283888057, total= 1.0min
[CV] xgbclassifier__max_depth=4, xgbclassifier__gamma=0.5 ............
[CV] xgbclassifier__max_depth=3, xgbclassifier__gamma=0.5, score=0.8729701715996775, total= 1.0min
[CV] xgbclassifier__max_depth=3, xgbclassifier__gamma=0.5, score=0.8706519235199263, total= 1.0min
[CV] xgbclassifier__max_depth=4, xgbclassifier__gamma=0.5 ............
[CV] xgbclassifier__max_depth=3, xgbclassifier__gamma=1 ..............
[CV] xgbclassifier__max_depth=4, xgbclassifier__gamma=0.5, score=0.8735460094437406, total= 1.3min
[CV] xgbclassifier__max_depth=3, xgbclassifier__gamma=1 ..............
[CV] xgbclassifier__max_depth=3, xgbclassifier__gamma=1, score=0.8722791661868018, total= 57.7s
[CV] xgbclassifier__max_depth=3, xgbclassifier__gamma=1 ..............
[CV] xgbclassifier__max_depth=3, xgbclassifier__gamma=1, score=0.8753886905447426, total= 1.0min
[CV] xgbclassifier__max_depth=4, xgbclassifier__gamma=1 ..............
[CV] xgbclassifier__max_depth=4, xgbclassifier__gamma=0.5, score=0.8697304768486523, total= 1.3min
[CV] xgbclassifier__max_depth=4, xgbclassifier__gamma=1 ..............
[CV] xgbclassifier__max_depth=4, xgbclassifier__gamma=0.5, score=0.8740066797189912, total= 1.4min
[CV] xgbclassifier__max_depth=4, xgbclassifier__gamma=1 ..............
[CV] xgbclassifier__max_depth=3, xgbclassifier__gamma=1, score=0.8707671043538355, total= 1.0min
[CV] xgbclassifier__max_depth=4, xgbclassifier__gamma=1, score=0.8729701715996775, total= 1.2min
[Parallel(n_jobs=4)]: Done 10 out of 12 | elapsed: 3.6min remaining: 43.5s
[CV] xgbclassifier__max_depth=4, xgbclassifier__gamma=1, score=0.8736611770125533, total= 1.2min
[CV] xgbclassifier__max_depth=4, xgbclassifier__gamma=1, score=0.8692697535130154, total= 1.2min
[Parallel(n_jobs=4)]: Done 12 out of 12 | elapsed: 3.6min finished /Users/Thomas/anaconda3/envs/hello-tf/lib/python3.6/site-packages/sklearn/model_selection/_search.py:737: DeprecationWarning: The default of the `iid` parameter will change from True to False in version 0.22 and will be removed in 0.24. This will change numeric results when test-set sizes are unequal. DeprecationWarning)
RandomizedSearchCV(cv=<generator object _BaseKFold.split at 0x1101eb830>,
error_score='raise-deprecating',
estimator=Pipeline(memory=None,
steps=[('columntransformer', ColumnTransformer(n_jobs=1, remainder='drop', transformer_weights=None,
transformers=[('standardscaler', StandardScaler(copy=True, with_mean=True, with_std=True), [0, 2, 10, 4, 11, 12]), ('onehotencoder', OneHotEncoder(categorical_features=None, categories=None,...
reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=None,
silent=True, subsample=1))]),
fit_params=None, iid='warn', n_iter=4, n_jobs=4,
param_distributions={'xgbclassifier__gamma': [0.5, 1], 'xgbclassifier__max_depth': [3, 4]},
pre_dispatch='2*n_jobs', random_state=1001, refit=True,
return_train_score='warn', scoring='accuracy', verbose=3)
Kuten näette, XGBoost saa paremmat pisteet kuin aiempi logistinen regressio.
print("Best parameter", random_search.best_params_) print("best logistic regression from grid search: %f" % random_search.best_estimator_.score(X_test, y_test))
Best parameter {'xgbclassifier__max_depth': 3, 'xgbclassifier__gamma': 0.5}
best logistic regression from grid search: 0.873157
random_search.best_estimator_.predict(X_test)
array(['<=50K', '<=50K', '<=50K', ..., '<=50K', '>50K', '<=50K'], dtype=object)
Luo DNN MLPClassifierilla scikit-learnissä
Lopuksi voit kouluttaa neuroverkon itse scikit-learn-metodilla. Menetelmä on sama kuin minkä tahansa muun luokittelijan kohdalla, ja estimaattori on MLPClassifier.
from sklearn.neural_network import MLPClassifier
Alla oleva verkko määritellään seuraavasti:
- Adam ratkaisija
- ReLU aktivointitoiminto
- Alfa = 0.0001
- Eräkoko 150
- Kaksi piilotettua kerrosta, joissa on 200 ja 100 neuronia
model_dnn = make_pipeline(
preprocess,
MLPClassifier(solver='adam',
alpha=0.0001,
activation='relu',
batch_size=150,
hidden_layer_sizes=(200, 100),
random_state=1))
Voit parantaa mallia muuttamalla kerrosten määrää.
model_dnn.fit(X_train, y_train) print("DNN regression score: %f" % model_dnn.score(X_test, y_test))
DNN-regressiopisteet: 0.821253
LIME: Luota malliisi
Nyt kun sinulla on hyvä malli, tarvitset keinon luottaa siihen. Koneoppimisalgoritmeja, erityisesti satunnaismetsiä ja neuroverkkoja, kutsutaan mustalaatikkomalleiksi: ne toimivat, mutta kukaan ei näe miksi.
Kolme tutkijaa rakensi työkalun, joka näyttää, miten tietokone päätyy ennusteeseen. Heidän artikkelinsa on "Miksi minun pitäisi luottaa sinuun?", ja heidän julkaisemansa algoritmi on nimeltään Local Interpretable Model-Agnostic Explanations (LIME).
Otetaan esimerkiksi. Joskus et tiedä, voidaanko koneoppimiseen perustuvaan ennusteeseen luottaa. Lääkäri ei voi hyväksyä diagnoosia vain siksi, että tietokone on sen tuottanut, ja sinun on tiedettävä, onko malli luotettava, ennen kuin otat sen käyttöön.
Kuvittele, että pystyisit näkemään, miksi mikä tahansa luokittelija teki ennusteen, jopa niin monimutkaisille malleille kuin neuroverkot, satunnaismetsät tai mielivaltaisen ytimen omaavat SVM:t. Ennusteeseen luottaminen on paljon helpompaa, kun sen taustalla olevat syyt ovat näkyvissä, ja yhtä lailla helpompi päättää, milloin malliin ei pitäisi luottaa. LIME kertoo, mitkä ominaisuudet ajoivat luokittelijan päätöksen.
Tietojen valmistelu
LIMEn suorittamiseen on pari asiaa, jotka sinun on muutettava PythonAsenna ensin lime terminaaliin komennolla pip install lime.
Lime käyttää LimeTabularExplainer-objektia mallin paikalliseen approksimointiin. Tämä objekti vaatii:
- tietojoukko nuhjuinen muoto
- Ominaisuuksien nimet: ominaisuuden_nimet
- Luokkien nimet: luokan_nimet
- Kategoristen ominaisuuksien sarakkeen indeksi: categorical_features
- Kunkin kategorisen ominaisuuden ryhmän nimi: categorical_names
Luo NumPy-junajoukko
Voit kopioida ja muuntaa df_train-tiedoston pandas-tiedostosta NumPy-tiedostoksi erittäin helposti.
df_train.head(5)
# Create numpy data
df_lime = df_train
df_lime.head(3)
Hanki luokan nimi
Otsikkoon pääsee unique()-funktion avulla. Sinun pitäisi nähdä:
- '<=50 XNUMX'
- '>50K'
# Get the class name
class_names = df_lime.label.unique()
class_names
array(['<=50K', '>50K'], dtype=object)
Indeksoi kategoriset ominaisuussarakkeet
Käytä aiemmin oppimaasi menetelmää kunkin ryhmän nimen selvittämiseen. Koodaa nimi LabelEncoderilla ja toista operaatio jokaiselle kategoriselle ominaisuudelle.
## import sklearn.preprocessing as preprocessing categorical_names = {} for feature in CATE_FEATURES: le = preprocessing.LabelEncoder() le.fit(df_lime[feature]) df_lime[feature] = le.transform(df_lime[feature]) categorical_names[feature] = le.classes_ print(categorical_names)
{'workclass': array(['?', 'Federal-gov', 'Local-gov', 'Never-worked', 'Private',
'Self-emp-inc', 'Self-emp-not-inc', 'State-gov', 'Without-pay'],
dtype=object), 'education': array(['10th', '11th', '12th', '1st-4th', '5th-6th', '7th-8th', '9th',
'Assoc-acdm', 'Assoc-voc', 'Bachelors', 'Doctorate', 'HS-grad',
'Masters', 'Preschool', 'Prof-school', 'Some-college'],
dtype=object), 'marital': array(['Divorced', 'Married-AF-spouse', 'Married-civ-spouse',
'Married-spouse-absent', 'Never-married', 'Separated', 'Widowed'],
dtype=object), 'occupation': array(['?', 'Adm-clerical', 'Armed-Forces', 'Craft-repair',
'Exec-managerial', 'Farming-fishing', 'Handlers-cleaners',
'Machine-op-inspct', 'Other-service', 'Priv-house-serv',
'Prof-specialty', 'Protective-serv', 'Sales', 'Tech-support',
'Transport-moving'], dtype=object), 'relationship': array(['Husband', 'Not-in-family', 'Other-relative', 'Own-child',
'Unmarried', 'Wife'], dtype=object), 'race': array(['Amer-Indian-Eskimo', 'Asian-Pac-Islander', 'Black', 'Other',
'White'], dtype=object), 'sex': array(['Female', 'Male'], dtype=object), 'native_country': array(['?', 'Cambodia', 'Canada', 'China', 'Columbia', 'Cuba',
'Dominican-Republic', 'Ecuador', 'El-Salvador', 'England',
'France', 'Germany', 'Greece', 'Guatemala', 'Haiti', 'Honduras',
'Hong', 'Hungary', 'India', 'Iran', 'Ireland', 'Italy', 'Jamaica',
'Japan', 'Laos', 'Mexico', 'Nicaragua',
'Outlying-US(Guam-USVI-etc)', 'Peru', 'Philippines', 'Poland',
'Portugal', 'Puerto-Rico', 'Scotland', 'South', 'Taiwan',
'Thailand', 'Trinadad&Tobago', 'United-States', 'Vietnam',
'Yugoslavia'], dtype=object)}
df_lime.dtypes
age float64 workclass int64 fnlwgt float64 education int64 education_num float64 marital int64 occupation int64 relationship int64 race int64 sex int64 capital_gain float64 capital_loss float64 hours_week float64 native_country int64 label object dtype: object
Nyt kun datajoukko on valmis, voit rakentaa alla olevissa Scikit-oppimisesimerkeissä esitetyt eri datajoukot. Data muunnetaan tässä prosessin ulkopuolella LIME-virheiden välttämiseksi: LimeTabularExplainerille välitettävän harjoitusjoukon on oltava NumPy-taulukko ilman merkkijonoja, ja yllä oleva metodi on jo tuottanut sellaisen.
from sklearn.model_selection import train_test_split X_train_lime, X_test_lime, y_train_lime, y_test_lime = train_test_split(df_lime[features], df_lime.label, test_size = 0.2, random_state=0) X_train_lime.head(5)
Voit tehdä putken XGBoostin löytämillä optimaalisilla parametreilla.
model_xgb = make_pipeline(
preprocess,
xgboost.XGBClassifier(max_depth = 3,
gamma = 0.5,
n_estimators=600,
objective='binary:logistic',
silent=True,
nthread=1))
model_xgb.fit(X_train_lime, y_train_lime)
/Users/Thomas/anaconda3/envs/hello-tf/lib/python3.6/site-packages/sklearn/preprocessing/_encoders.py:351: FutureWarning: The handling of integer data will change in version 0.22. Currently, the categories are determined based on the range [0, max(values)], while in the future they will be determined based on the unique values. If you want the future behavior and silence this warning, you can specify "categories='auto'."In case you used a LabelEncoder before this OneHotEncoder to convert the categories to integers, then you can now use the OneHotEncoder directly. warnings.warn(msg, FutureWarning)
Pipeline(memory=None, steps=[('columntransformer', ColumnTransformer(n_jobs=1, remainder='drop', transformer_weights=None, transformers=[('standardscaler', StandardScaler(copy=True, with_mean=True, with_std=True), [0, 2, 10, 4, 11, 12]), ('onehotencoder', OneHotEncoder(categorical_features=None, categories=None,... reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=None, silent=True, subsample=1))])
Saat varoituksen. Se selittää, että sinun ei tarvitse luoda etikettikooderia ennen putkistoa. Jos et käytä LIMEä, tämän Machine Learning with Scikit-learn -opetusohjelman ensimmäisen osan menetelmä on riittävä. Muussa tapauksessa pidä tämä lähestymistapa: luo ensin koodattu tietojoukko ja käytä sitten yhden käyttökerran kooderia putken sisällä.
print("best logistic regression from grid search: %f" % model_xgb.score(X_test_lime, y_test_lime))
best logistic regression from grid search: 0.873157
model_xgb.predict_proba(X_test_lime)
array([[7.9646105e-01, 2.0353897e-01],
[9.5173013e-01, 4.8269872e-02],
[7.9344827e-01, 2.0655173e-01],
...,
[9.9031430e-01, 9.6856682e-03],
[6.4581633e-04, 9.9935418e-01],
[9.7104281e-01, 2.8957171e-02]], dtype=float32)
Ennen kuin otat LIMEn käyttöön, luo NumPy-taulukko, joka sisältää väärin luokiteltujen rivien ominaisuudet. Voit käyttää tätä listaa myöhemmin saadaksesi käsityksen siitä, mikä johti luokittelijaa harhaan.
temp = pd.concat([X_test_lime, y_test_lime], axis= 1) temp['predicted'] = model_xgb.predict(X_test_lime) temp['wrong']= temp['label'] != temp['predicted'] temp = temp.query('wrong==True').drop('wrong', axis=1) temp= temp.sort_values(by=['label']) temp.shape
(826, 16)
Sitten luot lambda-funktion, joka hakee ennusteen mallista uutta dataa varten. Tarvitset sitä pian.
predict_fn = lambda x: model_xgb.predict_proba(x).astype(float)
X_test_lime.dtypes
age float64 workclass int64 fnlwgt float64 education int64 education_num float64 marital int64 occupation int64 relationship int64 race int64 sex int64 capital_gain float64 capital_loss float64 hours_week float64 native_country int64 dtype: object
predict_fn(X_test_lime)
array([[7.96461046e-01, 2.03538969e-01],
[9.51730132e-01, 4.82698716e-02],
[7.93448269e-01, 2.06551731e-01],
...,
[9.90314305e-01, 9.68566816e-03],
[6.45816326e-04, 9.99354184e-01],
[9.71042812e-01, 2.89571714e-02]])
Muunnat pandas-datakehyksen NumPy-taulukoksi.
X_train_lime = X_train_lime.values X_test_lime = X_test_lime.values X_test_lime
array([[4.00000e+01, 5.00000e+00, 1.93524e+05, ..., 0.00000e+00,
4.00000e+01, 3.80000e+01],
[2.70000e+01, 4.00000e+00, 2.16481e+05, ..., 0.00000e+00,
4.00000e+01, 3.80000e+01],
[2.50000e+01, 4.00000e+00, 2.56263e+05, ..., 0.00000e+00,
4.00000e+01, 3.80000e+01],
...,
[2.80000e+01, 6.00000e+00, 2.11032e+05, ..., 0.00000e+00,
4.00000e+01, 2.50000e+01],
[4.40000e+01, 4.00000e+00, 1.67005e+05, ..., 0.00000e+00,
6.00000e+01, 3.80000e+01],
[5.30000e+01, 4.00000e+00, 2.57940e+05, ..., 0.00000e+00,
4.00000e+01, 3.80000e+01]])
model_xgb.predict_proba(X_test_lime)
array([[7.9646105e-01, 2.0353897e-01],
[9.5173013e-01, 4.8269872e-02],
[7.9344827e-01, 2.0655173e-01],
...,
[9.9031430e-01, 9.6856682e-03],
[6.4581633e-04, 9.9935418e-01],
[9.7104281e-01, 2.8957171e-02]], dtype=float32)
print(features,
class_names,
categorical_features,
categorical_names)
['age', 'workclass', 'fnlwgt', 'education', 'education_num', 'marital', 'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss', 'hours_week', 'native_country'] ['<=50K' '>50K'] [1, 3, 5, 6, 7, 8, 9, 13] {'workclass': array(['?', 'Federal-gov', 'Local-gov', 'Never-worked', 'Private', 'Self-emp-inc', 'Self-emp-not-inc', 'State-gov', 'Without-pay'], dtype=object), 'education': array(['10th', '11th', '12th', '1st-4th', '5th-6th', '7th-8th', '9th', 'Assoc-acdm', 'Assoc-voc', 'Bachelors', 'Doctorate', 'HS-grad', 'Masters', 'Preschool', 'Prof-school', 'Some-college'], dtype=object), 'marital': array(['Divorced', 'Married-AF-spouse', 'Married-civ-spouse', 'Married-spouse-absent', 'Never-married', 'Separated', 'Widowed'], dtype=object), 'occupation': array(['?', 'Adm-clerical', 'Armed-Forces', 'Craft-repair', 'Exec-managerial', 'Farming-fishing', 'Handlers-cleaners', 'Machine-op-inspct', 'Other-service', 'Priv-house-serv', 'Prof-specialty', 'Protective-serv', 'Sales', 'Tech-support', 'Transport-moving'], dtype=object), 'relationship': array(['Husband', 'Not-in-family', 'Other-relative', 'Own-child', 'Unmarried', 'Wife'], dtype=object), 'race': array(['Amer-Indian-Eskimo', 'Asian-Pac-Islander', 'Black', 'Other', 'White'], dtype=object), 'sex': array(['Female', 'Male'], dtype=object), 'native_country': array(['?', 'Cambodia', 'Canada', 'China', 'Columbia', 'Cuba', 'Dominican-Republic', 'Ecuador', 'El-Salvador', 'England', 'France', 'Germany', 'Greece', 'Guatemala', 'Haiti', 'Honduras', 'Hong', 'Hungary', 'India', 'Iran', 'Ireland', 'Italy', 'Jamaica', 'Japan', 'Laos', 'Mexico', 'Nicaragua', 'Outlying-US(Guam-USVI-etc)', 'Peru', 'Philippines', 'Poland', 'Portugal', 'Puerto-Rico', 'Scotland', 'South', 'Taiwan', 'Thailand', 'Trinadad&Tobago', 'United-States', 'Vietnam', 'Yugoslavia'], dtype=object)}
import lime import lime.lime_tabular ### Train should be label encoded not one hot encoded explainer = lime.lime_tabular.LimeTabularExplainer(X_train_lime , feature_names = features, class_names=class_names, categorical_features=categorical_features, categorical_names=categorical_names, kernel_width=3)
Valitse nyt testijoukosta satunnainen kotitalous ja katso sekä ennustetta että sitä, miten tietokone siihen päätyi.
import numpy as np np.random.seed(1) i = 100 print(y_test_lime.iloc[i]) >50K
X_test_lime[i]
array([4.20000e+01, 4.00000e+00, 1.76286e+05, 7.00000e+00, 1.20000e+01,
2.00000e+00, 4.00000e+00, 0.00000e+00, 4.00000e+00, 1.00000e+00,
0.00000e+00, 0.00000e+00, 4.00000e+01, 3.80000e+01])
Voit käyttää selitintä yhdessä selitin_instance-muuttujan kanssa tarkastellaksesi mallin taustalla olevaa päättelyä. Sen renderöimä kaavio näkyy alla.
exp = explainer.explain_instance(X_test_lime[i], predict_fn, num_features=6)
exp.show_in_notebook(show_all=False)
Luokittelija ennusti tämän kotitalouden oikein: tulot ovat todellakin yli 50 000.
Ensimmäinen huomioitava asia on, että luokittelija ei ole kovin varma itsestään. Se ennustaa yli 50 000 euron tuloja 64 %:n todennäköisyydellä, ja tämä 64 % perustuu myyntivoittoon ja siviilisäätyyn. Sininen väri vaikuttaa negatiivisesti positiiviseen luokkaan ja oranssi viiva positiivisesti.
Luokittelija epäröi, koska tämän kotitalouden pääomavoitto on nolla, vaikka pääomavoitto on yleensä hyvä varallisuuden ennustaja. Kotitalous myös työskentelee alle 40 tuntia viikossa. Ikä, ammatti ja sukupuoli vaikuttavat kaikki positiivisesti.
Jos siviilisääty olisi ollut naimaton, luokittelija olisi ennustanut alle 50 000 euron tulot (0.64 – 0.18 = 0.46).
Kokeile nyt toista kotitaloutta, sellaista, joka luokiteltiin väärin. Selitystaulukko sen koodin jälkeen.
temp.head(3) temp.iloc[1,:-2]
age 58 workclass 4 fnlwgt 68624 education 11 education_num 9 marital 2 occupation 4 relationship 0 race 4 sex 1 capital_gain 0 capital_loss 0 hours_week 45 native_country 38 Name: 20931, dtype: object
i = 1 print('This observation is', temp.iloc[i,-2:])
This observation is label <=50K
predicted >50K
Name: 20931, dtype: object
exp = explainer.explain_instance(temp.iloc[1,:-2], predict_fn, num_features=6)
exp.show_in_notebook(show_all=False)
Luokittelija ennusti tuloiksi alle 50 000, mikä on väärin. Tämä kotitalous on epätavallinen: sillä ei ole myyntivoittoa eikä myyntitappiota, henkilö on eronnut, lähes 60-vuotias ja koulutettu, eli koulutusnumero > 12. Yleistä kaavaa noudattaen luokittelija sijoitti kotitalouden alle 50 000:n.
Leiki LIMEn kanssa itse, niin huomaat luokittelijassa paljon tylsiä virheitä. Kirjaston tekijän GitHub-arkistossa on lisädokumentaatiota kuvien ja tekstin luokittelusta.
Scikit-learn-komentoopas
Alla on luettelo hyödyllisistä komennoista, jotka koskevat scikit-learn-versiota 0.20 ja uudempia.
| Tehtävä | Toiminto tai luokka |
|---|---|
| Luo juna-/testitietojoukko | train_test_split |
| Rakenna putki | |
| Valitse sarakkeet ja käytä muunnosta | make_column_transformer |
| Muunnoksen tyyppi | |
| Standardoi | StandardScaler |
| Min-max-skaalaus | MinMaxScaler |
| Normalisoi | Normalizer |
| Implementoi puuttuvat arvot | Yksinkertainen |
| Muunna kategorisiksi | OneHotEncoder |
| Sovita ja muunna tiedot | sovita_muunnos |
| Tee putkisto | make_pipeline |
| Perus malli | |
| Logistinen regressio | Logistinen regressio |
| XGBoost | XGB-luokitus |
| Hermoverkko | MLPC-luokitus |
| Verkkohaku | GridSearchCV |
| Satunnaistettu haku | Satunnaistettu haku CV |



