Scikit-Learn Tutorial: Hur man installerar & Scikit-Learn Exempel

โšก Smart sammanfattning

Scikit-learn รคr รถppen kรคllkod Python bibliotek som tรคcker fรถrbehandling, klassificering, regression, klustring och modellval bakom ett enda konsekvent estimatorgrรคnssnitt, vilket hรฅller ett komplett arbetsflรถde fรถr maskininlรคrning kort, lรคsbart och reproducerbart frรฅn rรฅdata till poรคngsatta fรถrutsรคgelser.

  • ๐Ÿ”˜ Installation: Bรฅde Conda och pip fungerar, och den nuvarande stabila utgรฅvan innehรฅller redan alla transformatorer som anvรคnds hรคr.
  • โ˜‘๏ธ Bearbetad datamรคngd: UCI:s vuxenfolkrรคkningsfil med 32 561 rader driver varje exempel i den hรคr genomgรฅngen.
  • โœ… Rรถrledningar: make_column_transformer skalar de numeriska kolumnerna och kodar de kategoriska i ett enda objekt med ett hot.
  • ๐Ÿงช Instรคllning: GridSearchCV sveper ett fullstรคndigt parameternรคt, medan RandomizedSearchCV samplar det och slutfรถr det mycket snabbare.
  • ๐Ÿ› ๏ธ Tre modeller: Logistisk regressionspoรคng 0.850891, XGBoost 0.873157 och MLPClassifier-nรคtverket 0.821253.
  • โš ๏ธ Fรถrklaring: LIME visar vilka funktioner som drev en enskild fรถrutsรคgelse mot sin klass, inklusive de felaktiga.

Scikit-learn handledning med installationssteg och fungerande exempel

Vad รคr Scikit-learn?

Scikit lรคra รคr en รถppen kรคllkod Python bibliotek fรถr maskininlรคrningDen stรถder vรคletablerade algoritmer som KNN, gradient boosting, random forest och SVM, och den รคr byggd ovanpรฅ numpy och SciPy. Scikit-learn anvรคnds flitigt i Kaggle-tรคvlingar sรฅvรคl som i framstรฅende teknikfรถretag. Det omfattar fรถrbehandling, dimensionalitetsreduktion, klassificering, regression, klustring och modellval.

Scikit-learn har nรฅgra av de bรคsta dokumentationerna av alla รถppna kรคllkodsbibliotek. Det tillhandahรฅller till och med ett interaktivt kalkylatordiagram, Att vรคlja rรคtt kalkylator, som guidar dig frรฅn storleken pรฅ din datauppsรคttning till en kortlista med algoritmer som รคr vรคrda att prova.

Figuren nedan illustrerar hur Scikit-learn fungerar.

Hur Scikit-learn fungerar i ett maskininlรคrningsarbetsflรถde

Scikit-learn รคr inte svรฅrt att anvรคnda och ger utmรคrkta resultat. Det trรคnas dock pรฅ processorn: arbetet parallelliseras รถver kรคrnor med argumentet n_jobs snarare รคn pรฅ en GPU. Att kรถra en djupinlรคrningsalgoritm med det รคr mรถjligt men sรคllan optimalt, sรคrskilt om du redan vet hur man anvรคnder det. TensorFlow.

Hur man laddar ner och installerar Scikit-learn

Nu i detta Python Scikit-learn handledning, du lรคr dig hur du laddar ner och installerar Scikit-learn:

Alternativ 1: AWS

Scikit-learn kan anvรคndas รถver AWS. En Docker-avbildning med scikit-learn fรถrinstallerat sparar installationsarbetet helt.

Fรถr att installera utvecklarversionen, kรถr kommandot nedan inuti Jupyter:

import sys
!{sys.executable} -m pip install git+git://github.com/scikit-learn/scikit-learn.git

Alternativ 2: Mac eller Windows anvรคnder Anaconda

Fรถr att lรคra dig mer om installationen av Anaconda, se hur man laddar ner och installerar TensorFlow.

Nรคr denna genomgรฅng skrevs hade utvecklarna av scikit slรคppt en utvecklingsversion som รฅtgรคrdade problem som fanns i den dรฅvarande utgรฅvan, sรฅ stegen nedan anvรคnder den utvecklarversionen. Pรฅ en ny maskin idag innehรฅller den nuvarande stabila utgรฅvan redan alla transformatorer som anvรคnds hรคr, och pip install -U scikit-learn รคr nog.

Hur man installerar scikit-learn med Conda Environment

Om du installerade scikit-learn med conda-miljรถn, fรถlj stegen nedan fรถr att uppdatera till version 0.20.

Steg 1) Aktivera tensorflow-miljรถn

source activate hello-tf

Steg 2) Ta bort scikit-learn med hjรคlp av conda-kommandot

conda remove scikit-learn

Steg 3) Installera utvecklarversionen

Installera utvecklarversionen av scikit-learn tillsammans med nรถdvรคndiga bibliotek.

conda install -c anaconda git
pip install Cython
pip install h5py
pip install git+git://github.com/scikit-learn/scikit-learn.git

OBS: Windows anvรคndarna behรถver Microsoft Visuell C++ 14. Du kan fรฅ det hรคr..

Scikit-Learn-exempel med maskininlรคrning

Denna Scikit-handledning รคr uppdelad i tvรฅ delar:

  1. Maskininlรคrning med scikit-learn
  2. Hur du litar pรฅ din modell med LIME

Den fรถrsta delen beskriver hur man bygger en pipeline, skapar en modell och finjusterar hyperparametrarna, medan den andra delen tรคcker modelltolkning.

Steg 1) Importera data

Under den hรคr Scikit Learn-handledningen kommer du att anvรคnda datamรคngden fรถr vuxna.

Filen lรคses direkt frรฅn UCI Machine Learning Repository i koden nedan, sรฅ ingen manuell nedladdning behรถvs. Om du รคr intresserad av beskrivande statistik รคr verktygen Dive och Overview vรคrda att titta pรฅ. Se denna handledning fรถr att lรคra dig mer om Dyk och ร–versikt.

Du importerar datamรคngden med pandas. Observera att du mรฅste konvertera de kontinuerliga variablerna till flyttalformat.

Denna datauppsรคttning innehรฅller รฅtta kategoriska variabler, listade i CATE_FEATURES:

  • arbetsklass
  • utbildning
  • รคktenskaplig
  • ockupation
  • relation
  • lopp
  • kรถn
  • hemland

Den innehรฅller ocksรฅ sex kontinuerliga variabler, listade i CONTI_FEATURES:

  • รฅlder
  • fnlwgt
  • utbildningsnummer
  • kapitalvinsten
  • kapitalfรถrlust
  • timmar_vecka

Listorna fylls i fรถr hand hรคr sรฅ att du fรฅr en tydligare uppfattning om vilka kolumner som รคr i spel. Ett snabbare sรคtt att bygga en lista med kategoriska eller kontinuerliga kolumner รคr:

## 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)

Hรคr รคr koden fรถr att importera data:

# 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()

Att anropa describe() pรฅ ramen returnerar sammanfattningsstatistiken fรถr de sex kontinuerliga kolumnerna:

รฅlder fnlwgt utbildningsnummer kapitalvinsten kapitalfรถrlust timmar_vecka
rรคkna 32561.000000 3.256100e + 04 32561.000000 32561.000000 32561.000000 32561.000000
betyda 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
min 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

Du kan kontrollera antalet unika vรคrden fรถr funktionen native_country. Endast ett hushรฅll kommer frรฅn Nederlรคnderna. Det hushรฅllet ger ingen information och kommer att ge ett felmeddelande under trรคningen.

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

Du kan exkludera den hรคr oinformativa raden frรฅn datasetet:

## Drop Netherland, because only one row
df_train = df_train[df_train.native_country != "Holand-Netherlands"]

Dรคrefter lagrar du positionen fรถr de kontinuerliga funktionerna i en lista. Du kommer att behรถva det i nรคsta steg fรถr att bygga pipelinen.

Koden nedan loopar รถver alla kolumnnamn i CONTI_FEATURES, lรคser varje plats (det vill sรคga dess kolumnnummer) och lรคgger till den i en lista som heter conti_features.

## 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]

Nรคsta block gรถr samma jobb fรถr de kategoriska variablerna.

## 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]

Titta nu pรฅ sjรคlva datamรคngden. Varje kategorisk funktion รคr en strรคng, och en modell kan inte matas med ett strรคngvรคrde, sรฅ datamรคngden mรฅste transformeras med dummyvariabler.

df_train.head(5)

Faktum รคr att du behรถver en kolumn fรถr varje grupp i varje funktion. Kรถr fรถrst koden nedan fรถr att berรคkna det totala antalet kolumner som behรถvs.

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

Hela datamรคngden innehรฅller 101 grupper, som visas ovan. Bara arbetsklassfunktionen har nio grupper. Du kan lista namnen pรฅ grupperna med koden nedan; unique() returnerar de distinkta vรคrdena fรถr varje kategorisk funktion.

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']

Trรคningsdatasetet kommer dรคrfรถr att innehรฅlla 101 + 6 kolumner: de en-hot-grupperna plus de sex kontinuerliga funktionerna.

Scikit-learn kan hantera konverteringen i tvรฅ steg:

  1. Konvertera strรคngen till ett ID. State-gov blir ID 1, Self-emp-not-inc blir ID 2 och sรฅ vidare. LabelEncoder gรถr detta รฅt dig.
  2. Transponera varje ID till en ny kolumn. Datasetet har 101 grupp-ID:n, sรฅ det kommer att finnas 101 kolumner som fรฅngar varje kategorisk funktionsgrupp. Scikit-learn tillhandahรฅller OneHotEncoder fรถr denna operation.

Steg 2) Skapa tรฅget/testsetet

Nu nรคr datamรคngden รคr klar, dela den 80/20: 80 procent fรถr trรคningsmรคngden och 20 procent fรถr testmรคngden.

Du kan anvรคnda train_test_split. Det fรถrsta argumentet รคr dataframen fรถr funktionerna och det andra รคr etiketten. Du anger storleken pรฅ testuppsรคttningen med test_size.

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)

Steg 3) Bygg pipeline

Pipelinen gรถr det enklare att mata modellen med konsekventa data. Tanken รคr att skicka rรฅdata genom ett objekt som utfรถr varje operation i ordning.

Med denna datauppsรคttning behรถver du standardisera de kontinuerliga variablerna och konvertera de kategoriska. Alla operationer kan finnas inuti en pipeline: saknade vรคrden kan ersรคttas med medelvรคrdet eller medianen, och nya variabler kan skapas.

Du har ett val: hรฅrdkoda de tvรฅ processerna, eller bygga en pipeline. Hรฅrdkodning kan lรคcka testdata till den anpassade statistiken och skapa inkonsekvenser รถver tid, sรฅ pipeline รคr det bรคttre alternativet.

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

Pipelinen utfรถr tvรฅ operationer innan den matar den logistiska klassificeraren:

  1. Standardisera variabeln: StandardScaler()
  2. Konvertera de kategoriska funktionerna: OneHotEncoder(sparse=False)

Du utfรถr bรฅda stegen med make_column_transformer. Nรคr den hรคr genomgรฅngen skrevs fanns inte funktionen i den slรคppta versionen av scikit-learn (0.19), vilket รคr anledningen till att utvecklarversionen anvรคndes; den har inkluderats i varje stabil utgรฅva sedan 0.20.

make_column_transformer รคr enkelt: du deklarerar vilka kolumner som ska transformeras och vilken transformation som ska tillรคmpas. Fรถr att standardisera de kontinuerliga funktioner som skickas:

  • conti_features, StandardScaler() inuti make_column_transformer
    • conti_features: listan รถver kontinuerliga kolumner
    • StandardScaler: standardiserar dessa kolumner

OneHotEncoder-objektet inuti make_column_transformer kodar etiketterna automatiskt.

preprocess = make_column_transformer(
    (conti_features, StandardScaler()),
    ### Need to be numeric not string to specify columns name 
    (categorical_features, OneHotEncoder(sparse=False))
)

Versionsnotering: tvรฅ argument i blocket ovan har flyttats. Nuvarande versioner fรถrvรคntar sig transformatorn fรถrst och kolumnerna sedan, och gles dรถptes om gles_utdata i scikit-learn 1.2 och borttagen i 1.4, sรฅ nyare kod lรคses OneHotEncoder(sparse_output=False).

Du kan testa om pipelinen fungerar med fit_transform. Utdata ska ha formen 26048, 107.

preprocess.fit_transform(X_train).shape
(26048, 107)

Datatransformatorn รคr klar. Du skapar pipelinen med make_pipeline, och nรคr data har transformerats matar du in den logistiska regressionen.

model = make_pipeline(
    preprocess,
    LogisticRegression())

Att trรคna en modell med scikit-learn รคr dรฅ trivialt: anropa anpassning pรฅ pipelinen. Du kan skriva ut noggrannheten med poรคngmetoden.

model.fit(X_train, y_train)
print("logistic regression score: %f" % model.score(X_test, y_test))
logistic regression score: 0.850891

Slutligen kan du fรถrutsรคga klasserna med predict_proba, vilket returnerar sannolikheten fรถr varje klass. Observera att de tvรฅ sannolikheterna summerar till ett.

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]])

Steg 4) Anvรคnda vรฅr pipeline i en rutnรคtssรถkning

Att finjustera hyperparametrarna, de vรคrden som fixerar modellens struktur, kan vara mรถdosamt och utmattande.

Ett sรคtt att utvรคrdera modellen vore att รคndra storleken pรฅ trรคningssetet och mรคta prestationen, genom att upprepa รถvningen tio gรฅnger fรถr att se spridningen av poรคngen. Det รคr mycket manuellt arbete.

Istรคllet tillhandahรฅller scikit-learn funktioner som utfรถr parameterjustering och korsvalidering รฅt dig.

Korsvalidering

Korsvalidering innebรคr att trรคningsmรคngden delas upp n gรฅnger i veck under trรคning och modellen utvรคrderas n gรฅnger. Om cv sรคtts till 10 trรคnas och utvรคrderas modellen tio gรฅnger. I varje omgรฅng trรคnar klassificeraren pรฅ nio slumpmรคssigt valda veck och den tionde vecken behรฅlls fรถr utvรคrdering.

Rutnรคtssรถkning

Varje klassificerare har hyperparametrar att finjustera. Du kan prova vรคrden ett i taget, eller stรคlla in ett parameternรคt. Dokumentationen i scikit-learn listar alla parametrar som den logistiska klassificeraren accepterar. Fรถr att hรฅlla trรคningen snabb finjusterar det hรคr exemplet endast C-parametern, som styr regularisering. Den mรฅste vara positiv, och ett litet vรคrde ger mer vikt รฅt regulariseraren.

Du anvรคnder GridSearchCV-objektet, som tar en ordlista med hyperparametrar fรถr att finjustera. Lista varje hyperparameter fรถljt av de vรคrden du vill prova. Fรถr att finjustera C skriver du:

  • 'logisticregression__C': [0.001, 0.01, 0.1, 1.0] โ€” parameternamnet fรถregรฅs av klassificeringsnamnet med gemener och tvรฅ understreck.

Modellen kommer att prova fyra olika vรคrden: 0.001, 0.01, 0.1 och 1. Den trรคnas med 10 veck, det vill sรคga cv=10.

from sklearn.model_selection import GridSearchCV
# Construct the parameter grid
param_grid = {
    'logisticregression__C': [0.001, 0.01,0.1, 1.0],
    }

Du kan nu trรคna modellen med hjรคlp av GridSearchCV med parametern grid och cv.

# Train the model
grid_clf = GridSearchCV(model,
                        param_grid,
                        cv=10,
                        iid=False)
grid_clf.fit(X_train, y_train)

Produktion:

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)

Versionsnotering: d iid Argumentet som syns i denna utdata fรถrรฅldrades i scikit-learn 0.22 och togs bort i 0.24, sรฅ det bรถr helt enkelt tas bort frรฅn GridSearchCV-anropet i aktuella versioner.

Fรถr att komma รฅt de bรคsta parametrarna anvรคnder du best_params_.

grid_clf.best_params_

Produktion:

{'logisticregression__C': 1.0}

Efter att ha trรคnat modellen med fyra olika regulariseringsvรคrden ger den optimala parametern:

print("best logistic regression from grid search: %f" % grid_clf.best_estimator_.score(X_test, y_test))

bรคsta logistiska regression frรฅn rutnรคtssรถkning: 0.850891

Fรถr att komma รฅt de fรถrutspรฅdda sannolikheterna:

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-modell med scikit-learn

Prova nu en av de starkaste klassificeringsverktygen pรฅ marknaden. XGBoost รคr en gradientfรถrstรคrkande fรถrbรคttring av den slumpmรคssiga skogen. Dess teoretiska bakgrund ligger utanfรถr ramen fรถr detta arbete. Python Scikit-handledning, men kom ihรฅg att XGBoost har vunnit mรฅnga Kaggle-tรคvlingar. Pรฅ en genomsnittlig datamรคngd kan den prestera lika bra som en djupinlรคrningsalgoritm, eller bรคttre.

Klassificeraren รคr svรฅr att trรคna eftersom den exponerar ett stort antal parametrar. Du kan naturligtvis anvรคnda GridSearchCV fรถr att vรคlja dem รฅt dig.

Ett bรคttre alternativ hรคr รคr RandomizedSearchCV. GridSearchCV blir lรฅngsamt nรคr rutnรคtet รคr stort, eftersom sรถkutrymmet vรคxer med varje parameter som lรคggs till. RandomizedSearchCV samplar istรคllet vรคrdena fรถr varje hyperparameter slumpmรคssigt vid varje iteration, sรฅ 1 000 iterationer utvรคrderar 1 000 kombinationer. Det fungerar annars ungefรคr som GridSearchCV.

Du mรฅste importera xgboost. Om biblioteket inte รคr installerat, kรถr pip3 install xgboost, eller installera det inifrรฅn en [server/ ... Jupyter anteckningsbok med:

use import sys
!{sys.executable} -m pip install xgboost

Importera sedan klassificeraren och de tvรฅ sรถkhjรคlpfunktionerna:

import xgboost
from sklearn.model_selection import RandomizedSearchCV
from sklearn.model_selection import StratifiedKFold

Nรคsta steg i denna Scikit Python handledningen gรฅr ut pรฅ att ange de parametrar som ska finjusteras. Den officiella XGBoost-dokumentationen listar dem alla. Fรถr detta รคndamรฅl Python I Sklearn-handledningen vรคljer du bara tvรฅ hyperparametrar med tvรฅ vรคrden vardera, eftersom XGBoost tar lรฅng tid att trรคna och varje extra rutnรคtspunkt รถkar vรคntetiden.

params = {
        'xgbclassifier__gamma': [0.5, 1],
        'xgbclassifier__max_depth': [3, 4]
        }

Sedan konstruerar du en ny pipeline med XGBoost-klassificeraren och 600 estimatorer. n_estimators รคr i sig sjรคlvt justerbart, och ett hรถgt vรคrde kan leda till รถveranpassning. Du kan prova andra vรคrden, men var medveten om att det kan ta timmar. Alla andra parametrar behรฅller sin standardvรคrde.

model_xgb = make_pipeline(
    preprocess,
    xgboost.XGBClassifier(
                          n_estimators=600,
                          objective='binary:logistic',
                          silent=True,
                          nthread=1)
)

Du kan fรถrbรคttra korsvalideringen med korsvalideraren Stratified K-Folds. Endast tre veck anvรคnds hรคr fรถr att snabba upp berรคkningen, vilket i sin tur pรฅverkar kvaliteten negativt; รถka detta till 5 eller 10 pรฅ din egen maskin fรถr bรคttre resultat. Modellen trรคnas รถver fyra iterationer.

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)

Den slumpmรคssiga sรถkningen รคr klar, sรฅ du kan trรคna modellen.

#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)

Som du kan se fรฅr XGBoost bรคttre resultat รคn den tidigare logistiska regressionen.

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)

Skapa DNN med MLPClassifier i scikit-learn

Slutligen kan du trรคna ett neuralt nรคtverk med scikit-learn. Metoden รคr densamma som fรถr alla andra klassificerare, och estimatorn รคr MLPClassifier.

from sklearn.neural_network import MLPClassifier

Nรคtverket nedan definieras med:

  • Adam lรถsare
  • ReLU aktiveringsfunktion
  • Alfa = 0.0001
  • Batchstorlek pรฅ 150
  • Tvรฅ dolda lager med 200 respektive 100 neuroner
model_dnn = make_pipeline(
    preprocess,
    MLPClassifier(solver='adam',
                  alpha=0.0001,
                  activation='relu',
                    batch_size=150,
                    hidden_layer_sizes=(200, 100),
                    random_state=1))

Du kan รคndra antalet lager fรถr att fรถrbรคttra modellen.

model_dnn.fit(X_train, y_train)
  print("DNN regression score: %f" % model_dnn.score(X_test, y_test))

DNN-regressionspoรคng: 0.821253

LIME: Lita pรฅ din modell

Nu nรคr du har en bra modell behรถver du ett sรคtt att lita pรฅ den. Maskininlรคrningsalgoritmer, sรคrskilt slumpmรคssiga skogar och neurala nรคtverk, รคr kรคnda som black-box-modeller: de fungerar, men ingen kan fรถrstรฅ varfรถr.

Tre forskare byggde ett verktyg som visar hur datorn nรฅr en fรถrutsรคgelse. Deras artikel รคr "Varfรถr skulle jag lita pรฅ dig?", och algoritmen de publicerade kallas Local Interpretable Model-Agnostic Explanations (LIME).

Ta ett exempel. Ibland vet man inte om en maskininlรคrningsprediktion kan litas pรฅ. En lรคkare kan inte acceptera en diagnos bara fรถr att en dator har producerat den, och man mรฅste veta om en modell รคr tillfรถrlitlig innan man tar den i produktion.

Tรคnk dig att kunna se varfรถr en klassificerare gjorde en fรถrutsรคgelse, รคven fรถr modeller sรฅ komplicerade som neurala nรคtverk, slumpmรคssiga skogar eller SVM:er med en godtycklig kรคrna. Det blir mycket lรคttare att lita pรฅ en fรถrutsรคgelse nรคr orsakerna bakom den รคr synliga, och lika lรคttare att avgรถra nรคr en modell inte ska vara tillfรถrlitlig. LIME berรคttar vilka funktioner som styrde klassificerarens beslut.

Fรถrberedelse av data

Det finns ett par saker du behรถver รคndra fรถr att kรถra LIME med PythonInstallera fรถrst lime i terminalen med pip install lime.

Lime anvรคnder ett LimeTabularExplainer-objekt fรถr att approximera modellen lokalt. Detta objekt krรคver:

  • en datauppsรคttning i numpy format
  • Namnet pรฅ funktionerna: feature_names
  • Namnet pรฅ klasserna: klassnamn
  • Indexet fรถr kolumnen med kategoriska funktioner: categorical_features
  • Namnet pรฅ gruppen fรถr varje kategorisk funktion: kategoriska_namn

Skapa NumPy-tรฅgsetet

Du kan kopiera och konvertera df_train frรฅn pandas till NumPy mycket enkelt.

df_train.head(5)
# Create numpy data
df_lime = df_train
df_lime.head(3)

Fรฅ klassnamnet

Etiketten รคr tillgรคnglig via unique(). Du bรถr se:

  • '<=50K'
  • '>50K'
# Get the class name
class_names = df_lime.label.unique()
class_names
array(['<=50K', '>50K'], dtype=object)

Indexera kolumnerna fรถr kategoriska funktioner

Anvรคnd metoden du lรคrde dig tidigare fรถr att fรฅ namnet pรฅ varje grupp. Du kodar etiketten med LabelEncoder och upprepar operationen pรฅ varje kategoriskt objekt.

## 
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

Nu nรคr datamรคngden รคr klar kan du bygga de olika datamรคngderna som visas i Scikit-inlรคrningsexemplen nedan. Data transformeras utanfรถr pipelinen hรคr fรถr att undvika fel med LIME: trรคningsmรคngden som skickas till LimeTabularExplainer mรฅste vara en NumPy-array utan strรคngar, och metoden ovan har redan producerat en.

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)

Du kan skapa pipelinen med de optimala parametrar som XGBoost hittat.

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))])

Du fรฅr en varning. Den fรถrklarar att du inte behรถver skapa en etikettkodare fรถre pipelinen. Om du inte anvรคnder LIME fungerar metoden frรฅn den fรถrsta delen av den hรคr handledningen fรถr maskininlรคrning med Scikit-learn. Annars behรฅller du den hรคr metoden: skapa fรถrst en kodad datamรคngd och anvรคnd sedan en-hot-kodaren inuti pipelinen.

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)

Innan du anvรคnder LIME, skapa en NumPy-array som innehรฅller funktionerna i de felaktigt klassificerade raderna. Du kan anvรคnda den listan senare fรถr att fรฅ en uppfattning om vad som missledde klassificeraren.

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)

Sedan skapar du en lambdafunktion som hรคmtar prediktionen frรฅn modellen fรถr nya data. Du kommer att behรถva den inom kort.

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]])

Du konverterar pandas dataframe till en NumPy-array.

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)

Vรคlj nu ett slumpmรคssigt hushรฅll frรฅn testmรคngden och se bรฅde fรถrutsรคgelsen och hur datorn kom fram till den.

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])

Du kan anvรคnda explainern med explain_instance fรถr att undersรถka resonemanget bakom modellen. Diagrammet som den renderar visas nedan.

exp = explainer.explain_instance(X_test_lime[i], predict_fn, num_features=6)
exp.show_in_notebook(show_all=False)

LIME-fรถrklaringstabell som visar funktionsbidragen fรถr ett korrekt fรถrutspรฅtt hushรฅll

Klassificeraren fรถrutspรฅdde detta hushรฅll korrekt: inkomsten รคr faktiskt รถver 50 000 kr.

Det fรถrsta man bรถr notera รคr att klassificeraren inte รคr sรคrskilt sรคker pรฅ sig sjรคlv. Den fรถrutspรฅr en inkomst รถver 50 000 med en sannolikhet pรฅ 64 %, och att 64 % drivs av kapitalvinst och civilstรฅnd. Den blรฅ fรคrgen bidrar negativt till den positiva klassen och den orangea linjen positivt.

Klassificeraren รคr tveksam eftersom hushรฅllets kapitalvinst รคr noll, medan kapitalvinst vanligtvis รคr en bra indikator pรฅ fรถrmรถgenhet. Hushรฅllet arbetar ocksรฅ fรคrre รคn 40 timmar per vecka. ร…lder, yrke och kรถn bidrar alla positivt.

Om civilstรฅndet var singel skulle klassificeraren ha fรถrutspรฅtt en inkomst under 50 000 kr (0.64 โ€“ 0.18 = 0.46).

Fรถrsรถk nu med ett annat hushรฅll, ett som klassificerades felaktigt. Fรถrklaringstabellen fรถr det fรถljer koden.

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-fรถrklaringstabell fรถr hushรฅllet, klassificeraren mรคrkt felaktigt

Klassificeraren fรถrutspรฅdde en inkomst under 50 000 kr, vilket รคr fel. Detta hushรฅll รคr ovanligt: โ€‹โ€‹det har varken en kapitalvinst eller en kapitalfรถrlust, personen รคr skild, nรคra 60 รฅr gammal och utbildad, det vill sรคga utbildningsnummer > 12. Klassificeraren fรถljt det รถvergripande mรถnstret och placerade hushรฅllet under 50 000 kr.

Lek med LIME sjรคlv sรฅ kommer du att mรคrka mรฅnga raka misstag frรฅn klassificeraren. GitHub-arkivet som tillhรถr biblioteksfรถrfattaren innehรฅller extra dokumentation fรถr bild- och textklassificering.

Scikit-learn-kommandoreferens

Nedan fรถljer en lista med anvรคndbara kommandon som gรคller fรถr scikit-learn version 0.20 och senare.

uppgift Funktion eller klass
Skapa tรฅg-/testdatasetet train_test_split
Bygg en pipeline
Markera kolumnerna och tillรคmpa transformationen make_column_transformator
Typ av transformation
Standardisera Standardskalare
Min-max-skalning MinMaxScaler
Normalisera normaliserare
Imputera saknade vรคrden SimpleImputer
Konvertera kategorisk OneHotEncoder
Anpassa och transformera data fit_transform
Gรถr rรถrledningen make_pipeline
Grundmodell
Logistisk รฅtergรฅng Logistisk tillbakagรฅng
XGBoost XGBClassifier
Neuralt nรคt MLPClassifierare
Rutnรคtssรถkning GridSearchCV
Randomiserad sรถkning RandomizedSearchCV

Vanliga frรฅgor

Installera den nuvarande stabila utgรฅvan med pip install -U scikit-learn eller conda install -c conda-forge scikit-learn. Utvecklarversionen som anvรคndes i stegen ovan var endast nรถdvรคndig 2018, nรคr make_column_transformer inte slรคpptes; den levereras nu i alla stabila versioner.

fit lรคr sig parametrar som kolumnmedelvรคrde och standardavvikelse. transform tillรคmpar dem pรฅ data. fit_transform gรถr bรฅda i ett anrop, och den ska bara vidrรถra trรคningsmรคngden, aldrig den uteslutna testmรคngden.

Genom att montera en skalare eller kodare pรฅ den fullstรคndiga datamรคngden kan teststatistik nรฅ modellen. En pipeline anpassar varje transformator inuti varje korsvalideringsvikning, sรฅ att de utelรคmnade raderna fรถrblir osynliga tills de poรคngsรคtts.

Den autokompletterar vรคlbekanta former: ColumnTransformer-block, parameterrutnรคt och de dubbla understrecknamnen som GridSearchCV fรถrvรคntar sig. RevVisa allt versionskรคnsligt, eftersom fรถrslag ofta reproducerar รคldre argumentnamn som sparse istรคllet fรถr sparse_output.

Inte helt. Automatiserade sรถkverktyg utforskar ett rutnรคt snabbare och renar svaga kandidater, men du vรคljer fortfarande sรถkutrymme, poรคngsรคttning och korsvalideringsschema. Dessa beslut รคr viktigare รคn sjรคlva sรถkalgoritmen.

Nej. Trรคningen kรถrs pรฅ processorn och parallelliseras รถver kรคrnor via n_jobs. Ett experimentellt Array API-lager lรฅter en begrรคnsad uppsรคttning estimatorer acceptera GPU-arrayer, men TensorFlow och liknande ramverk fรถrblir GPU-alternativet.

Ja. Anropa set_output(transform=โ€pandasโ€) pรฅ en transformer eller en hel pipeline och resultatet behรฅller sina kolumnnamn istรคllet fรถr att returnera en naken kod. numpy array, vilket gรถr ColumnTransformer-utdata mycket enklare att inspektera.

Skicka class_weight=โ€balancedโ€ till de estimatorer som accepterar det, omprova med ett tillhรถrande bibliotek som imbalanced-learn, och poรคngsรคtt med precision, recall eller F1-mรฅttet snarare รคn ren noggrannhet.

Sammanfatta detta inlรคgg med: