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.

  • 🔘 Asennus: Sekä Conda että PIP toimivat, ja nykyinen vakaa julkaisu sisältää jo kaikki tässä käytetyt muuntajat.
  • ☑️ Työstetty tietojoukko: Tämän läpikäynnin jokaisen esimerkin taustalla on UCI:n aikuisten väestönlaskentatiedosto, jossa on 32 561 riviä.
  • Putket: make_column_transformer skaalaa numeeriset sarakkeet ja koodaa kategoriset sarakkeet kerrallaan yhdeksi objektiksi.
  • 🧪 viritys: GridSearchCV pyyhkäisee koko parametriruudukon, kun taas RandomizedSearchCV ottaa siitä näytteitä ja viimeistelee sen paljon nopeammin.
  • 🛠️ Kolme mallia: Logistisen regression pisteet 0.850891, XGBoost 0.873157 ja MLPClassifier-verkosto 0.821253.
  • ⚠️ Selitettävyys: LIME näyttää, mitkä ominaisuudet ohjasivat yksittäistä ennustetta kohti sen luokkaa, mukaan lukien väärät ominaisuudet.

Scikit-learn-opetusohjelma asennusvaiheineen ja toimineine esimerkkeineen

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.

Miten Scikit-learn toimii koneoppimisen työnkulussa

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:

  1. Koneoppiminen scikit-learnillä
  2. 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:

  1. Muunna merkkijono tunnukseksi. State-gov muuttuu tunnukseksi 1, Self-emp-not-inc muuttuu tunnukseksi 2 ja niin edelleen. LabelEncoder tekee tämän puolestasi.
  2. 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ä:

  1. Standardoi muuttuja: StandardScaler()
  2. 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)

LIME-selityskaavio, joka näyttää oikein ennustetun kotitalouden ominaisuuksien osuudet

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)

LIME-selitystaulukko kotitaloudelle, jonka luokittelija on merkinnyt väärin

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

UKK

Asenna nykyinen vakaa julkaisu komennolla pip install -U scikit-learn tai conda install -c conda-forge scikit-learn. Yllä olevissa vaiheissa käytetty kehittäjäversio oli tarpeen vain vuonna 2018, kun make_column_transformer ei ollut julkaistu; se toimitetaan nyt jokaisessa vakaassa versiossa.

fit oppii parametreja, kuten sarakkeen keskiarvon ja keskihajonnan. transform soveltaa niitä dataan. fit_transform tekee molemmat yhdellä kutsulla, ja sen tulisi aina koskettaa vain harjoitusjoukkoa, ei koskaan suljettua testijoukkoa.

Skaalaajan tai enkooderin sovittaminen koko datajoukkoon mahdollistaa testijoukon tilastojen pääsyn malliin. Liukuhihna sovittaa jokaisen muuntajan uudelleen jokaisen ristivalidointitaitoksen sisällä, joten pois jätetyt rivit pysyvät piilossa, kunnes ne pisteytetään.

Se täydentää automaattisesti tuttuja muotoja: ColumnTransformer-lohkoja, parametriruudukoita ja GridSearchCV:n odottamia kaksoisalaviivalla varustettuja nimiä. RevÄlä katso mitään versioherkkää, koska ehdotukset usein toistavat vanhempia argumenttien nimiä, kuten sparse sparse_output:n sijaan.

Ei täysin. Automaattiset hakutyökalut tutkivat ruudukkoa nopeammin ja karsivat heikot ehdokkaat, mutta sinä valitset silti hakuavaruuden, pisteytysmittarin ja ristiinvalidointijärjestelmän. Nämä päätökset ovat tärkeämpiä kuin itse hakualgoritmi.

Ei. Koulutus suoritetaan suorittimella ja rinnakkaistetaan ytimien välillä n_jobs-työtehtävien avulla. Kokeellinen Array API -kerros sallii rajoitetun joukon estimaattoreita hyväksyä GPU-taulukoita, mutta TensorFlow ja vastaavat kehykset ovat edelleen GPU-vaihtoehto.

Kyllä. Kutsu set_output(transform=”pandas”) -funktiota transformerille tai koko putkilinjalle, jolloin tulos säilyttää sarakenimensä tyhjän arvon palauttamisen sijaan. nuhjuinen taulukko, mikä tekee ColumnTransformerin tulosteen tarkastelusta paljon helpompaa.

Välitä class_weight=”balanced” estimaattoreille, jotka sen hyväksyvät, otanta uudelleen kumppanikirjastolla, kuten balanced-learn, ja pisteytä tarkkuudella, palautusarvolla tai F1-mitalla pelkän tarkkuuden sijaan.

Tiivistä tämä viesti seuraavasti: