Scikit-Learn Tutorial: Hur man installerar & Scikit-Learn Exempel
Vad รคr Scikit-learn?
Scikit lรคra รคr en รถppen kรคllkod Python bibliotek fรถr maskininlรคrning. Den stรถder toppmoderna algoritmer som KNN, XGBoost, random forest och SVM. Den รคr byggd ovanpรฅ NumPy. Scikit-learn anvรคnds ofta i Kaggle-tรคvlingar sรฅvรคl som framstรฅende teknikfรถretag. Det hjรคlper till med fรถrbearbetning, dimensionsreduktion (parameterval), klassificering, regression, klustring och modellval.
Scikit-learn har den bรคsta dokumentationen av alla bibliotek med รถppen kรคllkod. Det ger dig ett interaktivt diagram pรฅ https://scikit-learn.org/stable/tutorial/machine_learning_map/index.html.

Scikit-learn รคr inte sรคrskilt svรฅrt att anvรคnda och ger utmรคrkta resultat. Men scikit learning stรถder inte parallella berรคkningar. Det รคr mรถjligt att kรถra en djupinlรคrningsalgoritm med den men det รคr inte en optimal lรถsning, speciellt om du vet hur man anvรคnder TensorFlow.
Hur man laddar ner och installerar Scikit-learn
Nu i detta Python Scikit-learn handledning, vi kommer att lรคra oss hur du laddar ner och installerar Scikit-learn:
Alternativet 1: AWS
scikit-learn kan anvรคndas รถver AWS. Snรคlla du hรคnvisa Docker-avbildningen som har scikit-learn fรถrinstallerat.
Fรถr att anvรคnda utvecklarversionen anvรคnd kommandot i Jupyter
import sys
!{sys.executable} -m pip install git+git://github.com/scikit-learn/scikit-learn.git
Alternativet 2: Mac eller Windows anvรคnder Anaconda
Fรถr att lรคra dig om Anaconda-installation se https://www.guru99.com/download-install-tensorflow.html
Nyligen har utvecklarna av scikit slรคppt en utvecklingsversion som tar itu med vanliga problem med den nuvarande versionen. Vi tyckte att det var bekvรคmare att anvรคnda utvecklarversionen istรคllet fรถr den nuvarande versionen.
Hur man installerar scikit-learn med Conda Environment
Om du installerade scikit-learn med conda-miljรถn, fรถlj steget fรถr att uppdatera till version 0.20
Steg 1) Aktivera tensorflรถdesmiljรถn
source activate hello-tf
Steg 2) Ta bort scikit lean med kommandot conda
conda remove scikit-learn
Steg 3) Installera utvecklarversionen.
Installera scikit learn utvecklarversion 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รคndaren mรฅste installera Microsoft Visuell C++ 14. Du kan fรฅ det frรฅn 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 justerar hyperparametrarna medan den andra delen ger toppmoderna nรคr det gรคller val av modell.
Steg 1) Importera data
Under denna Scikit-lรคrhandledning kommer du att anvรคnda vuxendatauppsรคttningen.
Fรถr en bakgrund i denna datauppsรคttning, se Om du รคr intresserad av att veta mer om den beskrivande statistiken, anvรคnd verktygen Dyk och รversikt.
Se denna handledning lรคs mer om dyk och รถversikt
Du importerar datasetet med Pandas. Observera att du mรฅste konvertera typen av de kontinuerliga variablerna i float-format.
Denna datauppsรคttning innehรฅller รฅtta kategoriska variabler:
De kategoriska variablerna listas i CATE_FEATURES
- arbetsklass
- utbildning
- รคktenskaplig
- ockupation
- relation
- lopp
- kรถn
- hemland
dessutom sex kontinuerliga variabler:
De kontinuerliga variablerna listas i CONTI_FEATURES
- รฅlder
- fnlwgt
- utbildningsnummer
- kapitalvinsten
- kapitalfรถrlust
- timmar_vecka
Observera att vi fyller listan fรถr hand sรฅ att du har en bรคttre uppfattning om vilka kolumner vi anvรคnder. Ett snabbare sรคtt att konstruera en lista med kategoriska eller kontinuerliga รคr att anvรคnda:
## 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()
| รฅ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 funktionerna native_country. Du kan se att endast ett hushรฅll kommer frรฅn Holand-Nederlรคnderna. Detta hushรฅll kommer inte att ge oss nรฅgon information, men kommer genom ett fel under utbildningen.
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 utesluta denna oinformativa rad frรฅn datamรคngden
## 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 kommer att gรฅ รถver alla kolumnnamn i CONTI_FEATURES och fรฅ dess plats (dvs. dess nummer) och sedan lรคgga 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]
Koden nedan gรถr samma jobb som ovan men fรถr den kategoriska variabeln. Koden nedan upprepar vad du har gjort tidigare, fรถrutom med de kategoriska funktionerna.
## 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]
Du kan ta en titt pรฅ datasetet. Observera att varje kategorisk funktion รคr en strรคng. Du kan inte mata en modell med ett strรคngvรคrde. Du mรฅste transformera datasetet med en dummyvariabel.
df_train.head(5)
Faktum รคr att du mรฅste skapa en kolumn fรถr varje grupp i funktionen. Fรถrst kan du kรถra 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 datasetet innehรฅller 101 grupper som visas ovan. Till exempel har arbetsklassens funktioner nio grupper. Du kan visualisera namnet pรฅ grupperna med fรถljande koder
unique() returnerar de unika vรคrdena fรถr de kategoriska funktionerna.
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']
Dรคrfรถr kommer trรคningsdatauppsรคttningen att innehรฅlla 101 + 7 kolumner. De sista sju kolumnerna รคr de kontinuerliga funktionerna.
Scikit-learn kan ta hand om konverteringen. Det gรถrs i tvรฅ steg:
- Fรถrst mรฅste du konvertera strรคngen till ID. Till exempel kommer State-gov att ha ID 1, Self-emp-not-inc ID 2 och sรฅ vidare. Funktionen LabelEncoder gรถr detta รฅt dig
- Transponera varje ID till en ny kolumn. Som nรคmnts tidigare har datasetet 101-gruppens ID. Dรคrfรถr kommer det att finnas 101 kolumner som fรฅngar alla kategoriska funktioners grupper. Scikit-learn har en funktion som heter OneHotEncoder som utfรถr denna operation
Steg 2) Skapa tรฅget/testsetet
Nu nรคr datasetet รคr klart kan vi dela upp det 80/20.
80 procent fรถr trรคningssetet och 20 procent fรถr testsetet.
Du kan anvรคnda train_test_split. Det fรถrsta argumentet รคr dataramen รคr funktionerna och det andra argumentet รคr etikettdataramen. Du kan ange storleken pรฅ testsetet 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 lรคttare att mata modellen med konsekventa data.
Tanken bakom รคr att lรคgga rรฅdata i en "pipeline" fรถr att utfรถra operationer.
Till exempel, med den aktuella datamรคngden, mรฅste du standardisera de kontinuerliga variablerna och konvertera kategoridata. Observera att du kan utfรถra vilken operation som helst inne i pipelinen. Om du till exempel har "NA" i datamรคngden kan du ersรคtta dem med medelvรคrdet eller medianen. Du kan ocksรฅ skapa nya variabler.
Du har valet; hรฅrdkoda de tvรฅ processerna eller skapa en pipeline. Det fรถrsta valet kan leda till datalรคckage och skapa inkonsekvenser รถver tid. Ett bรคttre alternativ รคr att anvรคnda rรถrledningen.
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
Pipeledningen kommer att utfรถra tvรฅ operationer innan den logistiska klassificeraren matas:
- Standardisera variabeln: `StandardScaler()โ
- Konvertera de kategoriska funktionerna: OneHotEncoder(sparse=False)
Du kan utfรถra de tvรฅ stegen med hjรคlp av make_column_transformer. Denna funktion รคr inte tillgรคnglig i den aktuella versionen av scikit-learn (0.19). Det รคr inte mรถjligt med den aktuella versionen att utfรถra etikettkodaren och en varmkodare i pipeline. Det รคr en anledning till att vi valde att anvรคnda utvecklarversionen.
make_column_transformer รคr lรคtt att anvรคnda. Du mรฅste definiera vilka kolumner som ska tillรคmpas pรฅ transformationen och vilken transformation som ska anvรคndas. Till exempel, fรถr att standardisera den kontinuerliga funktionen kan du gรถra:
- conti_features, StandardScaler() inuti make_column_transformer.
- conti_features: lista med den kontinuerliga variabeln
- StandardScaler: standardisera variabeln
Objektet OneHotEncoder inuti make_column_transformer kodar automatiskt etiketten.
preprocess = make_column_transformer(
(conti_features, StandardScaler()),
### Need to be numeric not string to specify columns name
(categorical_features, OneHotEncoder(sparse=False))
)
Du kan testa om pipelinen fungerar med fit_transform. Datauppsรคttningen ska ha fรถljande form: 26048, 107
preprocess.fit_transform(X_train).shape
(26048, 107)
Datatransformatorn รคr klar att anvรคndas. Du kan skapa pipelinen med make_pipeline. Nรคr data har transformerats kan du mata den logistiska regressionen.
model = make_pipeline(
preprocess,
LogisticRegression())
Att trรคna en modell med scikit-learn รคr trivialt. Du mรฅste anvรคnda objektpassningen som fรถregรฅs av pipeline, dvs modellen. Du kan skriva ut exaktheten med partiturobjektet frรฅn scikit-learn-biblioteket
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. Det returnerar sannolikheten fรถr varje klass. Observera att det summerar till en.
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
Justera hyperparametern (variabler som bestรคmmer nรคtverksstruktur som dolda enheter) kan vara trรฅkigt och anstrรคngande.
Ett sรคtt att utvรคrdera modellen kan vara att รคndra storleken pรฅ trรคningsuppsรคttningen och utvรคrdera prestationerna.
Du kan upprepa denna metod tio gรฅnger fรถr att se poรคngen. Det รคr dock fรถr mycket arbete.
Istรคllet tillhandahรฅller scikit-learn en funktion fรถr att utfรถra parameterjustering och korsvalidering.
Korsvalidering
Cross-Validation innebรคr under trรคningen, trรคningssetet glider n antal gรฅnger i veck och utvรคrderar sedan modellen n tid. Till exempel, om cv รคr satt till 10, trรคnas och utvรคrderas trรคningssetet tio gรฅnger. Vid varje omgรฅng vรคljer klassificeraren slumpmรคssigt nio veck fรถr att trรคna modellen, och den 10:e vecken รคr avsedd fรถr utvรคrdering.
Rutnรคtssรถkning
Varje klassificerare har hyperparametrar att stรคlla in. Du kan prova olika vรคrden, eller sรฅ kan du stรคlla in ett parameterrutnรคt. Om du gรฅr till den officiella webbplatsen fรถr scikit-learn kan du se att den logistiska klassificeraren har olika parametrar att stรคlla in. Fรถr att gรถra trรคningen snabbare vรคljer du att stรคlla in C-parametern. Den kontrollerar fรถr regulariseringsparametern. Det ska vara positivt. Ett litet vรคrde ger mer vikt รฅt regularizern.
Du kan anvรคnda objektet GridSearchCV. Du mรฅste skapa en ordbok som innehรฅller hyperparametrarna fรถr att stรคlla in.
Du listar hyperparametrarna fรถljt av de vรคrden du vill prova. Till exempel, fรถr att stรคlla in C-parametern, anvรคnder du:
- 'logisticregression__C': [0.1, 1.0, 1.0]: Parametern fรถregรฅs av namnet, med gemener, pรฅ klassificeraren och tvรฅ understreck.
Modellen kommer att prova fyra olika vรคrden: 0.001, 0.01, 0.1 och 1.
Du trรคnar modellen med 10 veck: 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 trรคna modellen med hjรคlp av GridSearchCV med parametern gri 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)
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 รคr 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
Lรฅt oss prova Scikit-learn-exempel fรถr att trรคna en av de bรคsta klassificerarna pรฅ marknaden. XGBoost รคr en fรถrbรคttring jรคmfรถrt med den slumpmรคssiga skogen. Klassificerarens teoretiska bakgrund utanfรถr ramen fรถr detta Python Scikit handledning. Tรคnk pรฅ att XGBoost har vunnit massor av kaggletรคvlingar. Med en genomsnittlig datauppsรคttningsstorlek kan den fungera lika bra som en djupinlรคrningsalgoritm eller รคnnu bรคttre.
Klassificeraren รคr utmanande att trรคna eftersom den har ett stort antal parametrar att stรคlla in. Du kan naturligtvis anvรคnda GridSearchCV fรถr att vรคlja parametern รฅt dig.
Lรฅt oss istรคllet se hur man anvรคnder ett bรคttre sรคtt att hitta de optimala parametrarna. GridSearchCV kan vara trรฅkigt och vรคldigt lรฅngt att trรคna om du klarar mรฅnga vรคrden. Sรถkutrymmet vรคxer tillsammans med antalet parametrar. En att fรถredra lรถsningen รคr att anvรคnda RandomizedSearchCV. Denna metod bestรฅr av att slumpmรคssigt vรคlja vรคrdena fรถr varje hyperparameter efter varje iteration. Till exempel, om klassificeraren trรคnas รถver 1000 iterationer, utvรคrderas 1000 kombinationer. Det fungerar ungefรคr som. GridSearchCV
Du mรฅste importera xgboost. Om biblioteket inte รคr installerat, anvรคnd pip3 install xgboost eller
use import sys
!{sys.executable} -m pip install xgboost
In Jupyter miljรถ
Hรคrnรคst
import xgboost from sklearn.model_selection import RandomizedSearchCV from sklearn.model_selection import StratifiedKFold
Nรคsta steg i denna Scikit Python handledningen inkluderar att specificera parametrarna som ska stรคllas in. Du kan hรคnvisa till den officiella dokumentationen fรถr att se alla parametrar som ska stรคllas in. Fรถr den skull Python Sklearn tutorial, du vรคljer bara tvรฅ hyperparametrar med tvรฅ vรคrden vardera. XGBoost tar mycket tid att trรคna, ju fler hyperparametrar i rutnรคtet, desto lรคngre tid behรถver du vรคnta.
params = {
'xgbclassifier__gamma': [0.5, 1],
'xgbclassifier__max_depth': [3, 4]
}
Du konstruerar en ny pipeline med XGBoost-klassificerare. Du vรคljer att definiera 600 estimatorer. Observera att n_estimators รคr en parameter som du kan stรคlla in. Ett hรถgt vรคrde kan leda till รถvermontering. Du kan prova olika vรคrden sjรคlv men var medveten om att det kan ta timmar. Du anvรคnder standardvรคrdet fรถr de andra parametrarna
model_xgb = make_pipeline(
preprocess,
xgboost.XGBClassifier(
n_estimators=600,
objective='binary:logistic',
silent=True,
nthread=1)
)
Du kan fรถrbรคttra korsvalideringen med den Stratified K-Folds korsvalidatorn. Du konstruerar bara tre veck hรคr fรถr att snabbare berรคkningen men sรคnka kvaliteten. รka detta vรคrde till 5 eller 10 hemma fรถr att fรถrbรคttra resultaten.
Du vรคljer att trรคna modellen รถ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 randomiserade sรถkningen รคr redo att anvรคndas, 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 har XGBoost ett 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 en djupinlรคrningsalgoritm med scikit-learn. Metoden รคr densamma som den andra klassificeraren. Klassificeraren finns tillgรคnglig pรฅ MLPClassifier.
from sklearn.neural_network import MLPClassifier
Du definierar fรถljande algoritm fรถr djupinlรคrning:
- Adam lรถsare
- Relu aktiveringsfunktion
- Alfa = 0.0001
- satsstorlek 150
- Tvรฅ dolda lager med 100 respektive 50 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 verktyg fรถr att lita pรฅ den. Maskininlรคrning algoritmer, sรคrskilt slumpmรคssiga skogar och neurala nรคtverk, รคr kรคnda fรถr att vara black-box-algoritmer. Sรคg annorlunda, det fungerar men ingen vet varfรถr.
Tre forskare har tagit fram ett bra verktyg fรถr att se hur datorn gรถr en fรถrutsรคgelse. Tidningen heter Why Should I Trust You?
De utvecklade en algoritm som heter Lokala tolkbara modellagnostiska fรถrklaringar (LIME).
Ta ett exempel:
ibland vet du inte om du kan lita pรฅ en maskininlรคrningsfรถrutsรคgelse:
En lรคkare kan till exempel inte lita pรฅ en diagnos bara fรถr att en dator sa det. Du mรฅste ocksรฅ veta om du kan lita pรฅ modellen innan du sรคtter i produktion.
Fรถrestรคll dig att vi kan fรถrstรฅ varfรถr nรฅgon klassificerare gรถr en fรถrutsรคgelse รคven otroligt komplicerade modeller som neurala nรคtverk, slumpmรคssiga skogar eller svms med vilken kรคrna som helst
kommer att bli mer tillgรคnglig fรถr att lita pรฅ en fรถrutsรคgelse om vi kan fรถrstรฅ orsakerna bakom den. Frรฅn exemplet med lรคkaren, om modellen berรคttade fรถr honom vilka symtom som รคr viktiga skulle du lita pรฅ den, รคr det ocksรฅ lรคttare att ta reda pรฅ om du inte ska lita pรฅ modellen.
Lime kan berรคtta vilka funktioner som pรฅverkar klassificerarens beslut
Fรถrberedelse av data
De รคr ett par saker du behรถver รคndra fรถr att kรถra LIME med pytonorm. Fรถrst och frรคmst mรฅste du installera kalk i terminalen. Du kan anvรคnda pipinstallera kalk
Lime anvรคnder sig av LimeTabularExplainer-objektet 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 kategoriskt inslag: categorical_names
Skapa numpy tรฅgset
Du kan kopiera och konvertera df_train frรฅn pandor till numpy vรคldigt lรคtt
df_train.head(5) # Create numpy data df_lime = df_train df_lime.head(3)
Fรฅ klassnamnet Etiketten รคr tillgรคnglig med objektet unique(). Du borde se:
- '<=50K'
- '>50K'
# Get the class name class_names = df_lime.label.unique() class_names
array(['<=50K', '>50K'], dtype=object)
index fรถr kolumnen fรถr de kategoriska dragen
Du kan anvรคnda metoden du lutar innan fรถr att fรฅ namnet pรฅ gruppen. Du kodar etiketten med LabelEncoder. Du upprepar operationen pรฅ alla kategoriska funktioner.
##
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 datauppsรคttningen รคr klar kan du konstruera den olika datauppsรคttningen som visas i Scikit-lรคrexemplen nedan. Du transformerar faktiskt data utanfรถr pipelinen fรถr att undvika fel med LIME. Trรคningsuppsรคttningen i LimeTabularExplainer bรถr vara en numpy array utan strรคng. Med metoden ovan har du ett trรคningsdataset redan konverterat.
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 gรถra pipelinen med de optimala parametrarna frรฅn XGBoost
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. Varningen fรถrklarar att du inte behรถver skapa en etikettkodare innan pipelinen. Om du inte vill anvรคnda LIME gรฅr det bra att anvรคnda metoden frรฅn den fรถrsta delen av Machine Learning with Scikit-learn-handledningen. Annars kan du fortsรคtta med den hรคr metoden, skapa fรถrst en kodad datauppsรคttning, stรคll in att hรคmta den heta kodaren inom pipeline.
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 vi anvรคnder LIME i aktion, lรฅt oss skapa en numpy array med funktionerna i fel klassificering. Du kan anvรคnda den listan senare fรถr att fรฅ en uppfattning om vad som vilseleder 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)
Du skapar en lambdafunktion fรถr att hรคmta fรถrutsรคgelsen frรฅn modellen med den nya datan. Du kommer att behรถva det snart.
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 dataram till 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)
Lรฅt oss vรคlja ett slumpmรคssigt hushรฅll frรฅn testsetet och se modellfรถrutsรคgelsen och hur datorn gjorde sitt val.
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 fรถrklararen med explain_instance fรถr att kontrollera fรถrklaringen bakom modellen
exp = explainer.explain_instance(X_test_lime[i], predict_fn, num_features=6) exp.show_in_notebook(show_all=False)
Vi kan se att klassificeraren fรถrutspรฅdde hushรฅllet korrekt. Inkomsten รคr faktiskt รถver 50k.
Det fรถrsta vi kan sรคga รคr att klassificeraren inte รคr sรฅ sรคker pรฅ de fรถrutspรฅdda sannolikheterna. Maskinen fรถrutspรฅr att hushรฅllet har en inkomst รถver 50k med en sannolikhet pรฅ 64%. Dessa 64 % bestรฅr av kapitalvinst och รคktenskap. Den blรฅ fรคrgen bidrar negativt till den positiva klassen och den orange linjen, positivt.
Klassificeraren รคr fรถrvirrad eftersom kapitalvinsten fรถr detta hushรฅll รคr noll, medan kapitalvinsten vanligtvis รคr en bra prediktor fรถr vรคlstรฅnd. Dessutom arbetar hushรฅllet mindre รคn 40 timmar per vecka. ร lder, yrke och kรถn bidrar positivt till klassificeraren.
Om civilstรฅndet var singel skulle klassificeraren ha fรถrutspรฅtt en inkomst under 50k (0.64-0.18 = 0.46)
Vi kan fรถrsรถka med ett annat hushรฅll som har blivit felaktigt klassificerat
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 50k medan det inte รคr sant. Det hรคr hushรฅllet verkar konstigt. Den har ingen kapitalvinst eller kapitalfรถrlust. Han รคr skild och รคr 60 รฅr gammal, och det รคr ett utbildat folk, dvs education_num > 12. Enligt det รถvergripande mรถnstret bรถr detta hushรฅll, som klassificeraren fรถrklarar, fรฅ en inkomst under 50k.
Du fรถrsรถker leka med LIME. Du kommer att mรคrka grova misstag frรฅn klassificeraren.
Du kan kontrollera GitHub fรถr รคgaren av biblioteket. De tillhandahรฅller extra dokumentation fรถr bild- och textklassificering.
Sammanfattning
Nedan รคr en lista รถver nรฅgra anvรคndbara kommandon med scikit learning version >=0.20
| skapa tรฅg/testdatauppsรคttning | praktikanter splittras |
| Bygg en pipeline | |
| vรคlj kolumnen och tillรคmpa omvandlingen | gรถra kolumntransformator |
| typ av transformation | |
| standardisera | Standardskalare |
| min Max | MinMaxScaler |
| Normalisera | normaliserare |
| Berรคkna saknat vรคrde | tillrรคkna |
| 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 |


