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.
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.
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:
- Maskininlรคrning med scikit-learn
- 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:
- 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.
- 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:
- Standardisera variabeln: StandardScaler()
- 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)
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)
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 |



