Scikit-Learn Tutorial: Hogyan telepítsünk és Scikit-Learn példák

⚡ Okos összefoglaló

A Scikit-learn nyílt forráskódú Python Egy olyan könyvtár, amely egyetlen konzisztens becslőfelület mögött lefedi az előfeldolgozást, az osztályozást, a regressziót, a klaszterezést és a modellkiválasztást, így a teljes gépi tanulási munkafolyamat rövid, olvasható és reprodukálható a nyers adatoktól a pontozott predikciókig.

  • 🔘 Telepítés: A Conda és a pip is működik, és a jelenlegi stabil kiadás már tartalmazza az itt használt összes transzformátort.
  • ☑️ Kidolgozott adathalmaz: Az ebben az útmutatóban szereplő összes példát az UCI felnőtt népszámlálási fájlja vezérli, amely 32 561 sort tartalmaz.
  • ✅ Csővezetékek: A make_column_transformer skálázza a numerikus oszlopokat, és egyetlen objektumban kódolja a kategorikus oszlopokat.
  • 🧪 tuning: A GridSearchCV egy teljes paraméteres rácsot pásztázik, míg a RandomizedSearchCV mintavételezi azt, és sokkal hamarabb befejezi.
  • 🇧🇷 Három modell: Logisztikus regressziós pontszámok 0.850891, XGBoost 0.873157 és az MLPClassifier hálózat 0.821253.
  • ⚠️ Magyarázhatóság: A LIME megmutatja, hogy mely jellemzők irányítottak egy adott predikciót a megfelelő osztályba, beleértve a hibásakat is.

Scikit-learn útmutató telepítési lépésekkel és működő példákkal

Mi az a Scikit-learn?

Scikit elsajátítható egy nyílt forrású Python könyvtár számára gépi tanulásTámogatja a jól bevált algoritmusokat, mint például a KNN, a gradiens boosting, a random forest és az SVM, és a következőkre épül: numpy és a SciPy. A Scikit-learn-t széles körben használják Kaggle versenyeken, valamint neves tech vállalatoknál. Lefedi az előfeldolgozást, a dimenziócsökkentést, az osztályozást, a regressziót, a klaszterezést és a modellkiválasztást.

A Scikit-learn rendelkezik az egyik legjobb dokumentációval az összes nyílt forráskódú könyvtár közül. Még egy interaktív becslőtáblát is biztosít, A megfelelő becslő kiválasztása, amely végigvezet az adathalmaz méretétől a kipróbálásra érdemes algoritmusok rövid listájáig.

Az alábbi ábra a Scikit-learn működését szemlélteti.

Hogyan működik a Scikit-learn egy gépi tanulási munkafolyamatban?

A Scikit-learn használata nem nehézkes, és kiváló eredményeket ad. Azonban a CPU-n tanít: a munka párhuzamosan fut a magok között az n_jobs argumentummal, nem pedig GPU-n. Egy mélytanuló algoritmus futtatása lehetséges vele, de ritkán optimális, különösen akkor, ha már tudod, hogyan kell használni. TensorFlow.

A Scikit-learn letöltése és telepítése

Most ebben Python A Scikit-learn oktatóanyagban megtanulhatod, hogyan töltsd le és telepítsd a Scikit-learn-t:

1. lehetőség: AWS

A Scikit-learn használható AWS-en keresztül. Egy előre telepített scikit-learn-nel rendelkező Docker-rendszerkép teljesen megspórolja a beállítási munkát.

A fejlesztői verzió telepítéséhez futtassa az alábbi parancsot a Jupyter:

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

2. lehetőség: Mac vagy Windows Anaconda segítségével

Az Anaconda telepítésével kapcsolatos további információkért lásd: Hogyan töltsd le és telepítsd a TensorFlow-t?.

Mire ez az útmutató íródott, a scikit fejlesztői kiadtak egy fejlesztői verziót, amely kijavította az akkori aktuális kiadásban található problémákat, így az alábbi lépések ezt a fejlesztői verziót használják. Egy mai friss gépen a jelenlegi stabil kiadás már tartalmazza az itt használt összes transzformátort, és pip install -U scikit-learn elég.

A scikit-learn telepítése a Conda Environment segítségével

Ha a scikit-learn csomagot a Conda környezettel telepítette, kövesse az alábbi lépéseket a 0.20-as verzióra való frissítéshez.

1. lépés) Aktiválja a tensorflow környezetet

source activate hello-tf

2. lépés) Távolítsa el a scikit-learn parancsot a conda paranccsal

conda remove scikit-learn

3. lépés) Telepítse a fejlesztői verziót

Telepítse a scikit-learn fejlesztői verzióját a szükséges kódtárakkal együtt.

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

JEGYZET: Windows a felhasználóknak szükségük van Microsoft Vizuális C++ 14. Megkaphatod itt .

Scikit-Learn példa gépi tanulással

Ez a Scikit oktatóanyag két részre oszlik:

  1. Gépi tanulás a scikit-learn segítségével
  2. Hogyan bízza meg modelljét a LIME-ban

Az első rész részletezi, hogyan kell felépíteni egy folyamatot, létrehozni egy modellt és hangolni a hiperparamétereket, míg a második rész a modell értelmezését tárgyalja.

1. lépés) Importálja az adatokat

Ebben a Scikit learn oktatóanyagban a felnőtt népszámlálási adatkészletet fogod használni.

A fájl közvetlenül az UCI Machine Learning Repository-ból olvasható be az alábbi kódban, így nincs szükség manuális letöltésre. Ha érdekelnek a leíró statisztikák, érdemes megnézni a Dive és az Overview eszközöket. Lásd: ez a bemutató ha többet szeretne megtudni a Merülésről és az Áttekintésről.

A pandas segítségével importálod az adathalmazt. Fontos megjegyezni, hogy a folytonos változókat lebegőpontos formátumba kell konvertálnod.

Ez az adathalmaz nyolc kategorikus változót tartalmaz, amelyek a CATE_FEATURES részben vannak felsorolva:

  • munkaosztály
  • szabott oktatás
  • házastársi
  • foglalkozás
  • kapcsolat
  • verseny
  • szex
  • Szülőföld

Ezenkívül hat folytonos változót is tartalmaz, amelyek a CONTI_FEATURES részben vannak felsorolva:

  • kor
  • fnlwgt
  • oktatási_szám
  • tőkenyereség
  • tőke_veszteség
  • óra_hét

A listákat itt kézzel töltjük ki, hogy világosabb képet kapj arról, mely oszlopok vannak érvényben. A kategorikus vagy folyamatos oszlopok listájának gyorsabb felépítése a következő:

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

Íme az adatok importálásához szükséges kód:

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

A describe() függvény meghívása a kereten visszaadja a hat folytonos oszlop összesített statisztikáját:

kor fnlwgt oktatási_szám tőkenyereség tőke_veszteség óra_hét
számít 32561.000000 3.256100e + 04 32561.000000 32561.000000 32561.000000 32561.000000
jelent 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
perc 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

Ellenőrizheted a native_country jellemző egyedi értékeinek számát. Csak egy háztartás származik Hollandiából. Ez a háztartás nem hoz információt, és hibát fog dobni a betanítás során.

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

Ezt a nem informatív sort kizárhatja az adathalmazból:

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

Ezután egy listában tárolja a folyamatos jellemzők pozícióját. Szüksége lesz rá a következő lépésben a csővezeték megépítéséhez.

Az alábbi kód végigmegy a CONTI_FEATURES összes oszlopnevén, beolvassa az egyes helyeket (azaz az oszlopszámukat), és hozzáfűzi azokat egy conti_features nevű listához.

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

A következő blokk ugyanezt a feladatot látja el a kategorikus változókkal.

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

Most nézzük meg magát az adathalmazt. Minden kategorikus jellemző egy karakterlánc, és egy modell nem kaphat karakterlánc értéket, ezért az adathalmazt dummy változókkal kell transzformálni.

df_train.head(5)

Valójában minden egyes funkció minden csoportjához egy oszlopra van szükséged. Először futtasd az alábbi kódot a szükséges oszlopok teljes számának kiszámításához.

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

A teljes adathalmaz 101 csoportot tartalmaz, ahogy fentebb látható. Csak a workclass jellemzőnek kilenc csoportja van. A csoportok nevét az alábbi kóddal listázhatod; a unique() függvény visszaadja az egyes kategorikus jellemzők egyedi értékeit.

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

A betanítási adatkészlet tehát 101 + 6 oszlopot fog tartalmazni: az egy-egy fontos csoportot, plusz a hat folytonos jellemzőt.

A Scikit-learn két lépésben tudja elvégezni az átalakítást:

  1. Alakítsa át a karakterláncot azonosítóvá. A State-gov azonosítóból 1 lesz, a Self-emp-not-inc azonosítóból 2, és így tovább. A LabelEncoder elvégzi ezt helyetted.
  2. Transzponálja az egyes azonosítókat egy új oszlopba. Az adathalmaz 101 csoportazonosítóval rendelkezik, így 101 oszlop rögzíti majd az összes kategorikus jellemzőcsoportot. A Scikit-learn a OneHotEncodert biztosítja ehhez a művelethez.

2. lépés) Hozza létre a vonat/tesztkészletet

Most, hogy az adathalmaz elkészült, oszd fel 80/20 arányban: 80 százalék a betanítóhalmazhoz és 20 százalék a teszthalmazhoz.

Használhatod a train_test_split függvényt. Az első argumentum a funkciók adatkerete, a második pedig a címke. A tesztkészlet méretét a test_size paraméterrel állíthatod be.

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)

3. lépés) Építse meg a csővezetéket

A folyamat megkönnyíti a modell konzisztens adatokkal való ellátását. Az ötlet az, hogy a nyers adatokat egyetlen objektumon keresztül juttassák el, amely minden műveletet sorban végrehajt.

Ezzel az adathalmazzal szabványosítani kell a folytonos változókat, és konvertálni a kategorikus változókat. Bármely művelet elvégezhető egy folyamatban: a hiányzó értékek helyettesíthetők az átlaggal vagy a mediánnal, és új változók hozhatók létre.

Választhatsz: fixen kódolod a két folyamatot, vagy egy pipeline-t építesz. A fix kódolás szivárogtathatja a tesztadatokat az illesztett statisztikákba, és idővel inkonzisztenciákat okozhat, ezért a pipeline a jobb megoldás.

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

A folyamat két műveletet hajt végre a logisztikai osztályozó feltöltése előtt:

  1. Standardizálja a változót: StandardScaler()
  2. Konvertálja a kategorikus jellemzőket: OneHotEncoder(sparse=False)

Mindkét lépést a make_column_transformer függvénnyel kell végrehajtani. Amikor ezt a bemutatót írták, a függvény még nem volt benne a scikit-learn kiadott verziójában (0.19), ezért a fejlesztői buildet használták; ez minden stabil kiadásban megtalálható a 0.20 óta.

A make_column_transformer függvény használata egyszerű: deklarálod, hogy mely oszlopokat kell átalakítani, és melyik transzformációt kell alkalmazni. A folytonos jellemzők átadásához szabványosítanod kell:

  • conti_features, StandardScaler() a make_column_transformer belsejében
    • conti_features: a folyamatos oszlopok listája
    • StandardScaler: szabványosítja ezeket az oszlopokat

A make_column_transformer függvényen belüli OneHotEncoder objektum automatikusan kódolja a címkéket.

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

Verzió megjegyzés: A fenti blokkban két argumentum továbblépett. A jelenlegi kiadások először a transzformátort, majd csak másodszor az oszlopokat várják, és ritka átnevezték ritka_kimenet a scikit-learn 1.2-ben és eltávolítva az 1.4-ben, így az újabb kód így szól OneHotEncoder(sparse_output=False).

A pipeline működését a fit_transform függvénnyel tesztelheted. A kimenetnek 26048, 107 alakúnak kell lennie.

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

Az adattranszformátor készen áll. A pipeline-t a make_pipeline paranccsal hozod létre, és miután az adatok transzformálódtak, betáplálod a logisztikus regressziót.

model = make_pipeline(
    preprocess,
    LogisticRegression())

Egy modell betanítása a scikit-learn segítségével ezután triviális: hívjuk meg az fit metódust a folyamaton. A pontosságot a score metódussal nyomtathatjuk ki.

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

Végül a predict_proba függvénnyel megjósolhatod az osztályokat, amely visszaadja az egyes osztályok valószínűségét. Figyeld meg, hogy a két valószínűség összege eggyel egyenlő.

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

4. lépés) Csővezetékünk használata rácskeresésben

A hiperparaméterek, a modell szerkezetét rögzítő értékek finomhangolása unalmas és kimerítő lehet.

A modell értékelésének egyik módja az lenne, hogy megváltoztatjuk a tanulóhalmaz méretét és mérjük a teljesítményt, a gyakorlatot tízszer megismételve, hogy lássuk az eredmény eloszlását. Ez sok manuális munkát igényel.

Ehelyett a scikit-learn olyan függvényeket biztosít, amelyek elvégzik a paraméterek finomhangolását és a keresztellenőrzést.

Keresztellenőrzés

A keresztvalidáció azt jelenti, hogy a betanítás során a tanulóhalmazt n-szer osztják fel hajtogatási csoportra, és a modellt n-szer kiértékelik. Ha a cv értéke 10, akkor a modellt tízszer tanítják és értékelik ki. Minden körben az osztályozó kilenc véletlenszerűen kiválasztott hajtogatási csoporton tanul, és a tizedik hajtogatást tartják meg kiértékelésre.

Rács keresés

Minden osztályozóhoz tartoznak a hangolandó hiperparaméterek. Kipróbálhatja az értékeket egyenként, vagy beállíthat egy paraméterrácsot. A scikit-learn dokumentációja felsorolja az összes paramétert, amelyet a logisztikai osztályozó elfogad. A gyors betanítás érdekében ez a példa csak a C paramétert hangolja, amely a regularizálást vezérli. Ennek pozitívnak kell lennie, és egy kis érték nagyobb súlyt ad a regularizátornak.

A GridSearchCV objektumot használod, amely a hangolandó hiperparaméterek szótárát veszi igénybe. Sorold fel az egyes hiperparamétereket, majd a kipróbálni kívánt értékeket. A C hangolásához a következőt írod:

  • 'logisticregression__C': [0.001, 0.01, 0.1, 1.0] — a paraméter neve előtt az osztályozó neve kisbetűvel, majd két aláhúzásjel szerepel.

A modell négy különböző értéket fog kipróbálni: 0.001, 0.01, 0.1 és 1. 10 hajtogatással van betanítva, azaz cv=10.

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

Most már a GridSearchCV használatával betaníthatja a modellt a grid és a cv paraméterekkel.

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

output:

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)

Verzió megjegyzés: a iid Az ebben a kimenetben látható argumentum elavult a scikit-learn 0.22-es verziójában, és eltávolításra került a 0.24-es verzióban, így egyszerűen el kell hagyni a GridSearchCV hívásból a jelenlegi kiadásokban.

A legjobb paraméterek eléréséhez a best_params_ paramétert kell használni.

grid_clf.best_params_

output:

{'logisticregression__C': 1.0}

Miután a modellt négy különböző regularizációs értékkel betanítottuk, az optimális paraméter a következőt adja:

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

legjobb logisztikai regresszió a rácskeresésből: 0.850891

Az előrejelzett valószínűségek eléréséhez:

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 scikit-learn funkcióval

Most próbáld ki a piacon kapható egyik legerősebb osztályozót. Az XGBoost egy színátmenet-növelő továbbfejlesztés a véletlenszerű erdőn. Elméleti háttere kívül esik ezen a tanulmányon. Python Scikit oktatóanyag, de ne feledd, hogy az XGBoost számos Kaggle versenyt megnyert. Egy átlagos méretű adathalmazon olyan jól, vagy jobban is teljesíthet, mint egy mélytanuló algoritmus.

Az osztályozó betanítása nehézkes, mivel nagyszámú paramétert tesz elérhetővé. Természetesen a GridSearchCV segítségével kiválaszthatod őket helyetted.

Jobb megoldás itt a RandomizedSearchCV. A GridSearchCV lelassul, ha a rács nagy, mivel a keresési tér minden hozzáadott paraméterrel növekszik. A RandomizedSearchCV ehelyett minden iterációban véletlenszerűen mintát vesz az egyes hiperparaméterek értékeiből, így 1,000 iteráció 1,000 kombinációt értékel ki. Egyébként nagyon hasonlóan működik, mint a GridSearchCV.

Importálnod kell az xgboost könyvtárat. Ha a könyvtár nincs telepítve, futtasd a pip3 install xgboost parancsot, vagy telepítsd egy könyvtárból. Jupyter jegyzetfüzet a következőkkel:

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

Ezután importáljuk az osztályozót és a két keresési segédletet:

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

A következő lépés ebben a Scikitben Python az oktatóanyag célja a hangolandó paraméterek megadása. A hivatalos XGBoost dokumentáció mindet felsorolja. Ennek érdekében Python Az Sklearn oktatóanyagban csak két hiperparamétert választasz, mindegyikhez két értékkel, mert az XGBoost betanítása sokáig tart, és minden extra rácspont növeli a várakozási időt.

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

Ezután egy új folyamatot építesz az XGBoost osztályozóval és 600 becslővel. Az n_estimators önmagában is hangolható, és a magas érték túlillesztéshez vezethet. Kipróbálhatsz más értékeket is, de vedd figyelembe, hogy ez órákig is eltarthat. Minden más paraméter megtartja az alapértelmezett értéket.

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

A keresztvalidációt a Stratified K-Folds keresztvalidátorral javíthatod. Itt csak három hajtogatást használunk a számítás felgyorsítása érdekében, némi minőségi veszteséggel; a jobb eredmények érdekében növeld ezt 5-re vagy 10-re a saját gépeden. A modell négy iteráción keresztül van betanítva.

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)

A véletlenszerű keresés készen áll, így betaníthatja a modellt.

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

Amint látható, az XGBoost jobban teljesít, mint a korábbi logisztikus regresszió.

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)

Hozzon létre DNN-t az MLPClassifier segítségével a scikit-learnben

Végül, magával a scikit-learn metódussal is betaníthatsz egy neurális hálózatot. A metódus ugyanaz, mint bármely más osztályozó esetében, a becslő pedig az MLPClassifier.

from sklearn.neural_network import MLPClassifier

Az alábbi hálózatot a következőképpen definiáljuk:

  • Ádám megoldó
  • ReLU aktiválási funkció
  • Alfa = 0.0001
  • 150 darabos tételméret
  • Két rejtett réteg 200, illetve 100 neuronnal
model_dnn = make_pipeline(
    preprocess,
    MLPClassifier(solver='adam',
                  alpha=0.0001,
                  activation='relu',
                    batch_size=150,
                    hidden_layer_sizes=(200, 100),
                    random_state=1))

A rétegek számának módosításával javíthatja a modell minőségét.

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

DNN regressziós pontszám: 0.821253

LIME: Bízzon modelljében

Most, hogy van egy jó modelled, szükséged van egy módszerre, amellyel megbízhatsz benne. A gépi tanulási algoritmusokat, különösen a véletlenszerű erdőket és a neurális hálózatokat, fekete doboz modelleknek nevezik: működnek, de senki sem látja, miért.

Három kutató épített egy eszközt, amely megmutatja, hogyan jut el a számítógép egy predikcióhoz. A tanulmányuk a következő: „Miért bízzak benned?”, és az általuk közzétett algoritmust Lokálisan Értelmezhető Modell-Agnosztikus Magyarázatoknak (LIME) nevezik.

Vegyünk egy példát. Néha nem tudjuk biztosan, hogy egy gépi tanuláson alapuló jóslat megbízható-e. Egy orvos nem fogadhat el egy diagnózist pusztán azért, mert egy számítógép állította elő, és tudnunk kell, hogy egy modell megbízható-e, mielőtt bevezetnénk a gyártásba.

Képzeljük el, hogy láthatjuk, miért adott egy osztályozó egy predikciót, még olyan bonyolult modellek esetén is, mint a neurális hálózatok, a véletlenszerű erdők vagy a tetszőleges kernellel rendelkező SVM-ek. Sokkal könnyebb megbízni egy predikcióban, ha láthatóak a mögötte álló okok, és ugyanilyen könnyebb eldönteni, hogy mikor nem szabad megbízni egy modellben. A LIME megmondja, hogy mely jellemzők befolyásolták az osztályozó döntését.

Adatok előkészítése

Van néhány dolog, amit meg kell változtatnod a LIME futtatásához PythonElőször telepítsd a lime-ot a terminálban a pip install lime paranccsal.

A Lime egy LimeTabularExplainer objektumot használ a modell lokális közelítéséhez. Ehhez az objektumhoz a következők szükségesek:

  • egy adathalmaz numpy formátum
  • A jellemzők neve: feature_names
  • Az osztályok neve: class_names
  • A kategorikus jellemzők oszlopának indexe: categorical_features
  • Az egyes kategorikus jellemzők csoportjának neve: categorical_names

Hozza létre a NumPy vonatkészletet

A df_train fájlt nagyon könnyen másolhatod és konvertálhatod pandából NumPy-ba.

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

Szerezd meg az osztály nevét

A címke a unique() függvénnyel érhető el. A következőt kell látnia:

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

A kategorikus jellemzőoszlopok indexelése

Használd a korábban tanult módszert az egyes csoportok nevének lekéréséhez. A címkét LabelEncoderrel kódolod, és a műveletet minden kategorikus jellemzőn megismételed.

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

Most, hogy az adathalmaz elkészült, létrehozhatja az alábbi Scikit tanulási példákban bemutatott különböző adathalmazokat. Az adatokat itt a folyamaton kívül alakítjuk át, hogy elkerüljük a LIME-mal kapcsolatos hibákat: a LimeTabularExplainernek átadott betanító halmaznak egy karakterláncok nélküli NumPy tömbnek kell lennie, és a fenti metódus már létrehozott egyet.

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)

A pipeline-t az XGBoost által talált optimális paraméterekkel készítheted el.

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

Figyelmeztetést kapsz. Ez elmagyarázza, hogy nem kell címkekódolót létrehoznod a folyamat előtt. Ha nem használsz LIME-ot, akkor a Scikit-learn gépi tanulásról szóló útmutató első részében leírt metódus rendben van. Egyébként tartsd meg ezt a megközelítést: először hozz létre egy kódolt adathalmazt, majd alkalmazd az egyszer használatos kódolót a folyamaton belül.

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)

Mielőtt a LIME-ot működésbe hoznád, hozz létre egy NumPy tömböt, amely a helytelenül osztályozott sorok jellemzőit tartalmazza. Ezt a listát később felhasználhatod annak megértéséhez, hogy mi vezette félre az osztályozót.

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)

Ezután létrehozol egy lambda függvényt, amely kiolvassa az új adatokra vonatkozó predikciót a modellből. Hamarosan szükséged lesz rá.

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

A pandas dataframe-et NumPy tömbbé alakítod.

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)

Most válassz ki egy véletlenszerű háztartást a teszthalmazból, és nézd meg mind a jóslatot, mind azt, hogy a számítógép hogyan jutott el hozzá.

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

A magyarázó elemet az explain_instance függvénnyel együtt használhatod a modell mögötti érvelés vizsgálatához. Az általa megjelenített diagram alább látható.

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

A LIME magyarázó táblázata bemutatja a helyesen előrejelzett háztartás jellemzőinek hozzájárulásait

Az osztályozó helyesen jósolta meg a háztartást: a jövedelem valóban meghaladja az 50 ezer dollárt.

Az első dolog, amit meg kell jegyezni, hogy az osztályozó nem túl biztos önmagában. 64%-os valószínűséggel jósolja meg az 50 ezer dollár feletti jövedelmet, és ezt a 64%-ot a tőkenyereség és a családi állapot határozza meg. A kék szín negatívan járul hozzá a pozitív osztályhoz, a narancssárga vonal pedig pozitívan.

Az osztályozó habozik, mivel ennek a háztartásnak a tőkenyeresége nulla, miközben a tőkenyereség általában jó előrejelzője a vagyonnak. A háztartás emellett heti 40 óránál kevesebbet dolgozik. Az életkor, a foglalkozás és a nem mind pozitívan járul hozzá.

Ha a családi állapot egyedülálló lenne, az osztályozó 50 ezer alatti jövedelmet jósolt volna (0.64 – 0.18 = 0.46).

Most próbálj meg egy másik háztartást, olyat, amelyet rosszul osztályoztak. A hozzá tartozó magyarázó táblázat a kódot követi.

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 magyarázó táblázat a háztartáshoz, amelyet az osztályozó helytelenül címkézett fel

Az osztályozó 50 ezer alatti jövedelmet jósolt, ami téves. Ez a háztartás szokatlan: sem tőkenyereség, sem tőkeveszteség nem történt, a személy elvált, közel 60 éves és iskolázott, azaz az education_num > 12. Az általános mintát követve az osztályozó 50 ezer alá sorolta a háztartást.

Játssz a LIME-mal, és rengeteg durva hibát fogsz észrevenni az osztályozóban. A könyvtár szerzőjének GitHub repójában további dokumentáció található a kép- és szövegosztályozáshoz.

Scikit-learn parancsreferencia

Az alábbiakban a scikit-learn 0.20-as és újabb verzióira vonatkozó hasznos parancsok listája található.

Feladat Függvény vagy osztály
A vonat/teszt adatkészlet létrehozása train_test_split
Építs csővezetéket
Jelölje ki az oszlopokat, és alkalmazza az átalakítást oszloptranszformátor készítése
Az átalakítás típusa
Szabványosítás StandardScaler
Min-max skálázás MinMaxScaler
Normalizálni Normalizáló
Hiányzó értékek pótlása SimpleIputer
Átalakítás kategorikus OneHotEncoder
Illessze és alakítsa át az adatokat fit_transform
Készítse el a csővezetéket make_pipeline
Alapmodell
Logisztikus regresszió Logisztikus regresszió
XGBoost XGBClassifier
Neurális háló MLPC-osztályozó
Rács keresés GridSearchCV
Véletlenszerű keresés Véletlenszerű keresés CV

GYIK

Telepítsd a jelenlegi stabil kiadást a pip install -U scikit-learn vagy a conda install -c conda-forge scikit-learn paranccsal. A fenti lépésekben használt fejlesztői build csak 2018-ban volt szükséges, amikor a make_column_transformer még nem jelent meg; mostantól minden stabil verzióban megtalálható.

A fit függvény olyan paramétereket tanul meg, mint az oszlopátlag és a szórás. A transform függvény ezeket alkalmazza az adatokra. A fit_transform függvény mindkettőt egyetlen hívásban végzi el, és mindig csak a tanulóhalmazt szabad érintenie, soha nem a teszthalmazt.

Egy skálázó vagy kódoló teljes adathalmazra való illesztése lehetővé teszi, hogy a teszthalmaz statisztikái elérjék a modellt. Egy folyamat minden transzformátort újrailleszt minden keresztellenőrzési hajtáson belül, így a kitartott sorok láthatatlanok maradnak a pontozás pillanatáig.

Automatikusan kiegészíti az ismerős alakzatokat: a ColumnTransformer blokkokat, a paraméterrácsokat és a GridSearchCV által várt dupla aláhúzású neveket. RevNe nézzen meg semmi verzióérzékenyet, mivel a javaslatok gyakran régebbi argumentumneveket reprodukálnak, például a sparse_output helyett.

Nem teljesen. Az automatizált keresőeszközök gyorsabban keresnek egy rácsot és kiszűrik a gyenge jelölteket, de továbbra is te választod ki a keresési teret, a pontozási metrikát és a keresztellenőrzési sémát. Ezek a döntések fontosabbak, mint maga a keresési algoritmus.

Nem. A betanítás a CPU-n fut, és n_jobs segítségével párhuzamosítja a processzormagokat. Egy kísérleti Array API réteg lehetővé teszi, hogy korlátozott számú becslő elfogadjon GPU-tömböket, de TensorFlow és hasonló keretrendszerek továbbra is a GPU opció.

Igen. Hívjuk meg a set_output(transform=”pandas”) függvényt egy transzformátoron vagy egy egész csővezetéken, és az eredmény megtartja az oszlopneveket ahelyett, hogy egy üres értéket adna vissza. numpy tömb, ami sokkal könnyebbé teszi a ColumnTransformer kimenetének vizsgálatát.

Add át a class_weight=”balanced” értéket az azt elfogadó becslőknek, mintavételezd újra egy társkönyvtárral, például a balanced-learn-nel, és pontozd a pontosság, a visszahívás vagy az F1 mérték alapján a sima pontosság helyett.

Foglald össze ezt a bejegyzést a következőképpen: