Scikit-Learn Eğitimi: Nasıl Kurulur ve Scikit-Learn Örnekleri

⚡ Akıllı Özet

Scikit-learn açık kaynaklı bir yazılımdır. Python Veri ön işleme, sınıflandırma, regresyon, kümeleme ve model seçimini tek bir tutarlı tahminci arayüzü altında birleştiren kütüphane; bu sayede ham verilerden puanlanmış tahminlere kadar eksiksiz bir makine öğrenimi iş akışı kısa, okunabilir ve tekrarlanabilir hale gelir.

  • 🔘 Kurulum: Conda ve pip ikisi de çalışıyor ve mevcut kararlı sürüm zaten burada kullanılan tüm dönüştürücüleri içeriyor.
  • ☑️ İşlenen veri seti: Bu kılavuzdaki her örnek, 32,561 satırdan oluşan UCI yetişkin nüfus sayımı dosyasından yola çıkarak oluşturulmuştur.
  • Boru hatları: `make_column_transformer` fonksiyonu, sayısal sütunları ölçeklendirir ve kategorik sütunları tek bir nesne içinde one-hot kodlama yöntemiyle işler.
  • 🧪 Ayarlama: GridSearchCV, tüm parametre ızgarasını tararken, RandomizedSearchCV ise örnekleme yaparak çok daha kısa sürede işlemi tamamlar.
  • Üç model: Lojistik regresyon puanı 0.850891, XGBoost 0.873157 ve MLPClassifier ağı 0.821253'tür.
  • ⚠️ Açıklanabilirlik: LIME, yanlış tahminler de dahil olmak üzere, tek bir tahminin hangi özellikler sayesinde doğru sınıfa yöneldiğini gösterir.

Scikit-learn'de kurulum adımları ve örnek çözümler içeren eğitim videosu.

Scikit-learn nedir?

Scikit-öğrenme açık kaynaklı Python için kütüphane makine öğrenmeKNN, gradyan artırma, rastgele orman ve SVM gibi iyi bilinen algoritmaları destekler ve bunların üzerine inşa edilmiştir. Dizi Scikit-learn, Kaggle yarışmalarında ve önde gelen teknoloji şirketlerinde yaygın olarak kullanılmaktadır. Ön işleme, boyut indirgeme, sınıflandırma, regresyon, kümeleme ve model seçimi gibi konuları kapsar.

Scikit-learn, açık kaynaklı kütüphaneler arasında en iyi dokümantasyona sahip olanlardan biridir. Hatta etkileşimli bir tahmin grafiği bile sunmaktadır. Doğru tahminciyi seçmekBu, veri setinizin boyutundan yola çıkarak denemeye değer algoritmaların kısa bir listesini oluşturmanıza yardımcı olur.

Aşağıdaki şekil, Scikit-learn'ün nasıl çalıştığını göstermektedir.

Scikit-learn'ün makine öğrenimi iş akışında nasıl çalıştığı

Scikit-learn kullanımı zor değildir ve mükemmel sonuçlar verir. Ancak, işlemci üzerinde eğitim yapar: iş, GPU yerine n_jobs argümanı ile çekirdekler arasında paralelleştirilir. Bununla derin öğrenme algoritması çalıştırmak mümkündür, ancak özellikle nasıl kullanılacağını zaten biliyorsanız, nadiren en uygunudur. TensorFlow.

Scikit-learn Nasıl İndirilir ve Kurulur

Şimdi bunda Python Bu Scikit-learn eğitiminde, Scikit-learn'ü nasıl indirip kuracağınızı öğreneceksiniz:

Seçenek 1: AWS

Scikit-learn, AWS üzerinde kullanılabilir. Scikit-learn'ün önceden yüklendiği bir Docker imajı, kurulum işini tamamen ortadan kaldırır.

Geliştirici sürümünü yüklemek için aşağıdaki komutu çalıştırın. Jupyter:

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

Seçenek 2: Mac veya Windows Anaconda'yı kullanma

Anaconda kurulumu hakkında bilgi edinmek için lütfen şuraya bakın: TensorFlow nasıl indirilir ve kurulur?.

Bu kılavuz yazıldığı sırada scikit geliştiricileri, o zamanki mevcut sürümde bulunan sorunları gideren bir geliştirme sürümü yayınlamıştı, bu nedenle aşağıdaki adımlar bu geliştirme sürümünü kullanmaktadır. Bugün yeni bir makinede, mevcut kararlı sürüm zaten burada kullanılan tüm dönüştürücüleri içermektedir ve pip install -U scikit-learn yeterlidir.

Conda Environment ile scikit-learn nasıl kurulur

Scikit-learn'ü conda ortamıyla kurduysanız, 0.20 sürümüne güncellemek için aşağıdaki adımları izleyin.

Adım 1) TensorFlow ortamını etkinleştirin.

source activate hello-tf

Adım 2) conda komutunu kullanarak scikit-learn'ü kaldırın.

conda remove scikit-learn

3. Adım) Geliştirici sürümünü yükleyin

Gerekli kütüphanelerle birlikte scikit-learn geliştirici sürümünü yükleyin.

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

NOT: Windows kullanıcıların ihtiyacı var Microsoft Görsel C++ 14. Bunu alabilirsiniz. okuyun.

Makine Öğrenimi ile Scikit-Learn Örneği

Bu Scikit eğitimi iki bölüme ayrılmıştır:

  1. Scikit-learn ile makine öğrenimi
  2. LIME ile modelinize nasıl güvenebilirsiniz?

Birinci bölüm, bir işlem hattı oluşturmayı, bir model yaratmayı ve hiperparametreleri ayarlamayı ayrıntılı olarak ele alırken, ikinci bölüm model yorumlamasını kapsamaktadır.

Adım 1) Verileri içe aktarın

Bu Scikit learn eğitiminde yetişkin nüfus sayımı veri setini kullanacaksınız.

Aşağıdaki kodda dosya doğrudan UCI Makine Öğrenimi Deposundan okunmaktadır, bu nedenle manuel indirmeye gerek yoktur. Tanımlayıcı istatistiklerle ilgileniyorsanız, Dive ve Overview araçlarına göz atmaya değer. Bkz. Bu eğitimde Dalış ve Genel Bakış hakkında daha fazla bilgi edinmek için.

Veri setini pandas ile içe aktarıyorsunuz. Sürekli değişkenleri ondalık sayı formatına dönüştürmeniz gerektiğini unutmayın.

Bu veri seti, CATE_FEATURES'da listelenen sekiz kategorik değişken içermektedir:

  • çalışma sınıfı
  • eğitim
  • evlilik
  • işgal
  • ilişki
  • yarış
  • seks
  • ana vatan

Ayrıca CONTI_FEATURES'da listelenen altı sürekli değişkeni de içerir:

  • yaş
  • fnlwgt
  • eğitim_num
  • Sermaye kazancı
  • sermaye_kaybı
  • saat_hafta

Burada listeler elle dolduruluyor, böylece hangi sütunların kullanıldığını daha net bir şekilde görebilirsiniz. Kategorik veya sürekli sütunların listesini oluşturmanın daha hızlı bir yolu şöyledir:

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

Verileri içe aktarmak için gereken kod:

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

Çerçeve üzerinde describe() işlevini çağırmak, altı ardışık sütun için özet istatistikleri döndürür:

yaş fnlwgt eğitim_num Sermaye kazancı sermaye_kaybı saat_hafta
saymak 32561.000000 3.256100e + 04 32561.000000 32561.000000 32561.000000 32561.000000
ortalama 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
dk 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
maksimum 90.000000 1.484705e + 06 16.000000 99999.000000 4356.000000 99.000000

native_country özelliğinin benzersiz değerlerinin sayısını kontrol edebilirsiniz. Sadece bir hane Hollanda'dan geliyor. Bu hane hiçbir bilgi içermiyor ve eğitim sırasında hata verecektir.

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

Bu bilgilendirici olmayan satırı veri kümesinden çıkarabilirsiniz:

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

Daha sonra sürekli özelliklerin konumunu bir listede saklarsınız. Boru hattını oluşturmak için bir sonraki adımda buna ihtiyacınız olacak.

Aşağıdaki kod, CONTI_FEATURES tablosundaki tüm sütun adlarını döngüye alarak her bir konumu (yani sütun numarasını) okur ve bunu conti_features adlı bir listeye ekler.

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

Sonraki blok, kategorik değişkenler için aynı işlemi gerçekleştirir.

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

Şimdi veri setinin kendisine bakalım. Her kategorik özellik bir metin dizesidir ve bir modele metin dizesi değeri verilemez, bu nedenle veri seti kukla değişkenlerle dönüştürülmelidir.

df_train.head(5)

Aslında, her özellik için her gruba bir sütun gerekiyor. Öncelikle, gereken toplam sütun sayısını hesaplamak için aşağıdaki kodu çalıştırın.

print(df_train[CATE_FEATURES].nunique(),
      'There are',sum(df_train[CATE_FEATURES].nunique()), 'groups in the whole dataset')
workclass          9
education         16
marital            7
occupation        15
relationship       6
race               5
sex                2
native_country    41
dtype: int64 There are 101 groups in the whole dataset

Yukarıda gösterildiği gibi, veri setinin tamamı 101 grup içermektedir. Sadece "iş sınıfı" özelliği bile dokuz gruba sahiptir. Aşağıdaki kodla grupların adlarını listeleyebilirsiniz; unique() fonksiyonu her kategorik özelliğin farklı değerlerini döndürür.

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

Bu nedenle eğitim veri seti 101 + 6 sütun içerecektir: tekil kodlama grupları artı altı sürekli özellik.

Scikit-learn, dönüştürme işlemini iki adımda halledebilir:

  1. Dizeyi bir kimliğe dönüştürün. State-gov, ID 1 olur; Self-emp-not-inc, ID 2 olur ve bu şekilde devam eder. LabelEncoder bunu sizin için yapar.
  2. Her bir kimlik numarasını yeni bir sütuna taşıyın. Veri setinde 101 grup kimlik numarası olduğundan, her kategorik özellik grubunu yakalayan 101 sütun olacaktır. Scikit-learn bu işlem için OneHotEncoder'ı sağlar.

Adım 2) Eğitim/test setini oluşturun

Veri seti hazır olduğuna göre, onu 80/20 oranında bölün: %80'i eğitim seti, %20'si test seti.

`train_test_split` fonksiyonunu kullanabilirsiniz. İlk argüman özelliklerin veri çerçevesi, ikincisi ise etikettir. Test setinin boyutunu `test_size` ile ayarlarsınız.

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)

Adım 3) Boru hattını oluşturun

Bu işlem hattı, modele tutarlı verilerle beslemeyi kolaylaştırır. Buradaki fikir, ham verileri her işlemi sırayla gerçekleştiren tek bir nesne üzerinden geçirmektir.

Bu veri setiyle, sürekli değişkenleri standartlaştırmanız ve kategorik değişkenleri dönüştürmeniz gerekiyor. Herhangi bir işlem bir işlem hattı içinde yer alabilir: eksik değerler ortalama veya medyan ile değiştirilebilir ve yeni değişkenler oluşturulabilir.

İki seçeneğiniz var: iki işlemi de doğrudan kodlayabilirsiniz veya bir işlem hattı oluşturabilirsiniz. Doğrudan kodlama, test verilerinin istatistiklere sızmasına ve zaman içinde tutarsızlıklara yol açabilir, bu nedenle işlem hattı daha iyi bir seçenektir.

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

Bu işlem hattı, lojistik sınıflandırıcıya veri göndermeden önce iki işlem gerçekleştirir:

  1. Değişkeni standartlaştır: StandardScaler()
  2. Kategorik özellikleri dönüştürün: OneHotEncoder(sparse=False)

Her iki adımı da `make_column_transformer` fonksiyonuyla gerçekleştiriyorsunuz. Bu kılavuz yazıldığında, bu fonksiyon scikit-learn'ün yayınlanmış sürümünde (0.19) bulunmuyordu, bu nedenle geliştirici sürümü kullanıldı; 0.20'den beri her kararlı sürümde yer almaktadır.

`make_column_transformer` oldukça basittir: Hangi sütunları dönüştüreceğinizi ve hangi dönüşümü uygulayacağınızı belirtirsiniz. Sürekli özellikleri standartlaştırmak için şunları geçirirsiniz:

  • make_column_transformer içindeki conti_features, StandardScaler()
    • conti_features: ardışık sütunların listesi
    • StandardScaler: bu sütunları standartlaştırır.

`make_column_transformer` içindeki `OneHotEncoder` nesnesi etiketleri otomatik olarak kodlar.

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

Sürüm notu: Yukarıdaki bloktaki iki argüman ilerledi. Mevcut sürümler önce transformatörü, sonra kolonları bekliyor ve seyrek yeniden adlandırıldı seyrek_çıktı scikit-learn 1.2'de vardı ve 1.4'te kaldırıldı, bu nedenle daha yeni kod şu şekilde okunuyor: OneHotEncoder(sparse_output=False).

İşlem hattının çalışıp çalışmadığını fit_transform ile test edebilirsiniz. Çıktının 26048, 107 şeklinde olması gerekir.

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

Veri dönüştürücü hazır. `make_pipeline` komutuyla işlem hattını oluşturuyorsunuz ve veriler dönüştürüldükten sonra lojistik regresyona besliyorsunuz.

model = make_pipeline(
    preprocess,
    LogisticRegression())

Scikit-learn ile bir model eğitmek oldukça kolaydır: işlem hattında fit fonksiyonunu çağırın. Doğruluk oranını score metodu ile yazdırabilirsiniz.

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

Son olarak, her sınıfın olasılığını döndüren predict_proba fonksiyonu ile sınıfları tahmin edebilirsiniz. İki olasılığın toplamının bire eşit olduğunu unutmayın.

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

Adım 4) Izgara aramasında boru hattımızı kullanma

Modelin yapısını belirleyen değerler olan hiperparametrelerin ayarlanması zahmetli ve yorucu olabilir.

Modeli değerlendirmenin bir yolu, eğitim veri setinin boyutunu değiştirmek ve performansı ölçmek, bu işlemi on kez tekrarlayarak puan dağılımını görmektir. Bu çok fazla manuel çalışma gerektirir.

Bunun yerine, scikit-learn sizin için parametre ayarlaması ve çapraz doğrulama işlemlerini gerçekleştiren fonksiyonlar sunar.

Çapraz doğrulama

Çapraz doğrulama, eğitim sırasında eğitim veri setinin n kez katmanlara ayrılması ve modelin n kez değerlendirilmesi anlamına gelir. Eğer cv 10 olarak ayarlanırsa, model on kez eğitilir ve değerlendirilir. Her turda sınıflandırıcı rastgele seçilen dokuz katman üzerinde eğitilir ve onuncu katman değerlendirme için saklanır.

ızgara arama

Her sınıflandırıcının ayarlanabilecek hiperparametreleri vardır. Değerleri tek tek deneyebilir veya bir parametre ızgarası ayarlayabilirsiniz. scikit-learn dokümantasyonu, lojistik sınıflandırıcının kabul ettiği tüm parametreleri listeler. Eğitimi hızlı tutmak için, bu örnek yalnızca düzenlemeyi kontrol eden C parametresini ayarlar. Bu parametre pozitif olmalıdır ve küçük bir değer, düzenleyiciye daha fazla ağırlık verir.

GridSearchCV nesnesini kullanırsınız; bu nesne, ayarlanacak hiperparametrelerin bir sözlüğünü alır. Her hiperparametreyi ve denemek istediğiniz değerleri listeleyin. C'yi ayarlamak için şunu yazarsınız:

  • 'logisticregression__C': [0.001, 0.01, 0.1, 1.0] — parametre adının önüne küçük harflerle yazılmış sınıflandırıcı adı ve iki alt çizgi eklenmiştir.

Model dört farklı değer deneyecek: 0.001, 0.01, 0.1 ve 1. 10 katlı çapraz doğrulama (cv=10) ile eğitiliyor.

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

Artık GridSearchCV fonksiyonunu grid ve cv parametreleriyle kullanarak modeli eğitebilirsiniz.

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

Çıktı:

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)

Sürüm notu: the kimlik Bu çıktıda görünen argüman, scikit-learn 0.22 sürümünde kullanımdan kaldırılmış ve 0.24 sürümünde tamamen silinmiştir; bu nedenle mevcut sürümlerde GridSearchCV çağrısından basitçe çıkarılmalıdır.

En iyi parametrelere erişmek için best_params_ ifadesini kullanırsınız.

grid_clf.best_params_

Çıktı:

{'logisticregression__C': 1.0}

Modeli dört farklı düzenleme değeriyle eğittikten sonra, en uygun parametre şu şekilde elde edilir:

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

grid aramasından en iyi lojistik regresyon: 0.850891

Tahmin edilen olasılıklara erişmek için:

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

Scikit-learn ile XGBoost Modeli

Şimdi piyasadaki en güçlü sınıflandırıcılardan birini deneyelim. XGBoost, rastgele orman algoritmasının gradyan artırma yöntemiyle geliştirilmiş bir versiyonudur. Teorik altyapısı bu yazının kapsamı dışındadır. Python Scikit eğitimine bakabilirsiniz, ancak XGBoost'un birçok Kaggle yarışmasını kazandığını unutmayın. Ortalama büyüklükteki bir veri kümesinde, derin öğrenme algoritması kadar iyi veya daha iyi performans gösterebilir.

Sınıflandırıcıyı eğitmek zordur çünkü çok sayıda parametre içerir. Elbette, bu parametreleri sizin için seçmesi için GridSearchCV'yi kullanabilirsiniz.

Burada daha iyi bir seçenek RandomizedSearchCV'dir. GridSearchCV, ızgara büyük olduğunda yavaşlar çünkü arama alanı eklenen her parametreyle birlikte büyür. RandomizedSearchCV ise her yinelemede her hiperparametrenin değerlerini rastgele örnekler, böylece 1,000 yineleme 1,000 kombinasyonu değerlendirir. Bunun dışında GridSearchCV'ye çok benzer şekilde çalışır.

xgboost kütüphanesini içe aktarmanız gerekiyor. Eğer kütüphane kurulu değilse, pip3 install xgboost komutunu çalıştırın veya bir dosya içinden kurun. Jupyter İçinde şunlar bulunan bir defter:

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

Ardından sınıflandırıcıyı ve iki arama yardımcısını içe aktarın:

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

Bu Scikit'teki bir sonraki adım Python Bu eğitimde amaç, ayarlanacak parametreleri belirtmektir. Resmi XGBoost dokümanında bunların tümü listelenmiştir. Bu eğitimin amacı doğrultusunda, Python Sklearn eğitiminde, XGBoost'un eğitimi uzun sürdüğü ve her ekstra ızgara noktasının bekleme süresini uzattığı için, her biri iki değere sahip yalnızca iki hiperparametre seçiyorsunuz.

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

Ardından XGBoost sınıflandırıcı ve 600 tahminleyici ile yeni bir işlem hattı oluşturursunuz. n_estimators değeri ayarlanabilir ve yüksek bir değer aşırı uyumlanmaya yol açabilir. Başka değerler de deneyebilirsiniz, ancak bunun saatler sürebileceğini unutmayın. Diğer tüm parametreler varsayılan değerlerini korur.

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

Katmanlı K-Katlı çapraz doğrulama yöntemiyle çapraz doğrulamayı iyileştirebilirsiniz. Burada hesaplamayı hızlandırmak için sadece üç katman kullanılmıştır, bu da kalite açısından bir miktar kayba yol açar; daha iyi sonuçlar için kendi makinenizde bunu 5 veya 10'a çıkarın. Model dört yineleme üzerinden eğitilir.

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)

Rastgele arama hazır, artık modeli eğitebilirsiniz.

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

Gördüğünüz gibi, XGBoost, önceki lojistik regresyondan daha iyi performans gösteriyor.

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)

Scikit-learn'de MLPClassifier ile DNN oluşturun

Son olarak, scikit-learn'ün kendisiyle bir sinir ağı eğitebilirsiniz. Yöntem, diğer sınıflandırıcılar için olduğu gibidir ve tahminleyici MLPClassifier'dır.

from sklearn.neural_network import MLPClassifier

Aşağıdaki ağ şu şekilde tanımlanmıştır:

  • Adem çözücü
  • ReLU aktivasyon işlevi
  • Alfa = 0.0001
  • Parti büyüklüğü 150
  • Sırasıyla 200 ve 100 nöronlu iki gizli katman
model_dnn = make_pipeline(
    preprocess,
    MLPClassifier(solver='adam',
                  alpha=0.0001,
                  activation='relu',
                    batch_size=150,
                    hidden_layer_sizes=(200, 100),
                    random_state=1))

Modelin performansını artırmak için katman sayısını değiştirebilirsiniz.

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

DNN regresyon puanı: 0.821253

LIME: Modelinize Güvenin

Artık iyi bir modeliniz olduğuna göre, ona güvenmenin bir yoluna ihtiyacınız var. Makine öğrenimi algoritmaları, özellikle rastgele ormanlar ve sinir ağları, kara kutu modelleri olarak bilinir: çalışırlar, ancak kimse neden çalıştıklarını göremez.

Üç araştırmacı, bilgisayarın bir tahmine nasıl ulaştığını gösteren bir araç geliştirdi. Makaleleri şu şekildedir: “Sana neden güvenmeliyim?”Yayınladıkları algoritma ise Yerel Yorumlanabilir Modelden Bağımsız Açıklamalar (LIME) olarak adlandırılıyor.

Bir örnek verelim. Bazen bir makine öğrenimi tahmininin güvenilir olup olmadığını bilemezsiniz. Bir doktor, bir bilgisayarın ürettiği bir teşhisi sırf bu yüzden kabul edemez ve bir modeli üretime geçirmeden önce güvenilir olup olmadığını bilmeniz gerekir.

Karmaşık sinir ağları, rastgele ormanlar veya keyfi çekirdeğe sahip SVM'ler gibi modeller için bile, herhangi bir sınıflandırıcının neden bir tahminde bulunduğunu görebildiğinizi hayal edin. Arkasındaki nedenler görünür olduğunda bir tahmine güvenmek çok daha kolaylaşır ve bir modele ne zaman güvenilmemesi gerektiğine karar vermek de aynı derecede kolaylaşır. LIME, sınıflandırıcının kararını hangi özelliklerin yönlendirdiğini size söyler.

Veri Hazırlama

LIME'ı çalıştırmak için değiştirmeniz gereken birkaç şey var. PythonÖncelikle, pip install lime komutuyla terminale lime'ı kurun.

Lime, modeli yerel olarak yaklaşık olarak hesaplamak için bir LimeTabularExplainer nesnesi kullanır. Bu nesne şunları gerektirir:

  • bir veri kümesi Dizi biçim
  • Özelliklerin adı: feature_names
  • Sınıfların adı: class_names
  • Kategorik özellikler sütununun dizini: categorical_features
  • Her bir kategorik özellik için grup adı: categorical_names

NumPy eğitim setini oluşturun.

Pandas'tan df_train'i NumPy'ye çok kolay bir şekilde kopyalayıp dönüştürebilirsiniz.

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

Sınıf adını alın

Etikete unique() fonksiyonu aracılığıyla erişilebilir. Şunu görmelisiniz:

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

Kategorik özellik sütunlarını indeksleyin.

Daha önce öğrendiğiniz yöntemi kullanarak her grubun adını alın. Etiketi LabelEncoder ile kodlayın ve işlemi her kategorik özellik üzerinde tekrarlayın.

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

Veri seti hazır olduğuna göre, aşağıdaki Scikit learn örneklerinde gösterilen farklı veri setlerini oluşturabilirsiniz. LIME ile ilgili hataları önlemek için veriler burada işlem hattının dışında dönüştürülür: LimeTabularExplainer'a iletilen eğitim seti, dize içermeyen bir NumPy dizisi olmalıdır ve yukarıdaki yöntem zaten böyle bir dizi oluşturmuştur.

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)

XGBoost tarafından bulunan en uygun parametrelerle işlem hattını oluşturabilirsiniz.

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

Bir uyarı alıyorsunuz. Bu uyarı, işlem hattından önce bir etiket kodlayıcı oluşturmanıza gerek olmadığını açıklıyor. LIME kullanmıyorsanız, bu Scikit-learn ile Makine Öğrenimi eğitiminin ilk bölümündeki yöntem uygundur. Aksi takdirde, şu yaklaşımı izleyin: önce kodlanmış bir veri seti oluşturun, ardından işlem hattı içinde tekil kodlayıcıyı uygulayın.

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)

LIME'ı kullanmaya başlamadan önce, yanlış sınıflandırılan satırların özelliklerini içeren bir NumPy dizisi oluşturun. Bu listeyi daha sonra sınıflandırıcıyı neyin yanılttığına dair bir fikir edinmek için kullanabilirsiniz.

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)

Ardından, yeni veriler için modelden tahmini alan bir lambda fonksiyonu oluşturursunuz. Buna kısa süre sonra ihtiyacınız olacak.

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

Pandas veri çerçevesini NumPy dizisine dönüştürüyorsunuz.

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)

Şimdi test verilerinden rastgele bir hane seçin ve hem tahmini hem de bilgisayarın bu tahmine nasıl ulaştığını inceleyin.

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

Modelin ardındaki mantığı incelemek için explain_instance ile birlikte explainer'ı kullanabilirsiniz. Oluşturduğu grafik aşağıda gösterilmiştir.

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

LIME açıklama grafiği, doğru tahmin edilen bir hanehalkı için özellik katkılarını göstermektedir.

Sınıflandırıcı bu hanehalkını doğru tahmin etti: gelir gerçekten de 50 binin üzerinde.

Öncelikle belirtmek gerekir ki, sınıflandırıcı kendinden pek emin değil. 50 doların üzerinde bir geliri %64 olasılıkla tahmin ediyor ve bu %64'lük oran sermaye kazancı ve medeni durumdan kaynaklanıyor. Mavi renk pozitif sınıfa negatif, turuncu çizgi ise pozitif katkıda bulunuyor.

Sınıflandırıcı, bu hanehalkının sermaye kazancının sıfır olması nedeniyle tereddüt ediyor; oysa sermaye kazancı genellikle zenginliğin iyi bir göstergesidir. Ayrıca hanehalkı haftada 40 saatten az çalışıyor. Yaş, meslek ve cinsiyetin hepsi olumlu katkıda bulunuyor.

Medeni durum bekar olsaydı, sınıflandırıcı 50 bin doların altında bir gelir tahmin ederdi (0.64 – 0.18 = 0.46).

Şimdi yanlış sınıflandırılmış başka bir haneyi deneyin. Bununla ilgili açıklama tablosu kodun ardından geliyor.

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)

Sınıflandırıcının yanlış etiketlendiği hane için LIME açıklama tablosu

Sınıflandırıcı, geliri 50'in altında tahmin etti ki bu yanlış. Bu hanehalkı alışılmadık bir durumda: ne sermaye kazancı ne de sermaye kaybı var, kişi boşanmış, 60 yaşına yakın ve eğitimli (eğitim_sayısı > 12). Genel örüntüyü takip ederek, sınıflandırıcı hanehalkını 50'in altında bir gelir seviyesine yerleştirdi.

LIME'ı kendiniz deneyin ve sınıflandırıcıdan kaynaklanan birçok bariz hatayı fark edeceksiniz. Kütüphane yazarının GitHub deposunda görüntü ve metin sınıflandırması için ek belgeler bulunmaktadır.

Scikit-learn Komut Referansı

Aşağıda, scikit-learn 0.20 ve sonraki sürümleri için geçerli olan faydalı komutların bir listesi bulunmaktadır.

Görev Fonksiyon veya sınıf
Eğitim/test veri setini oluşturun. train_test_split
Bir boru hattı oluşturun
Sütunları seçin ve dönüşümü uygulayın. sütun dönüştürücü yap
Dönüşüm türü
Standartlaştırmak Standart Ölçekleyici
Minimum-maksimum ölçeklendirme MinMaksÖlçekleyici
Normalleştirmek Normalleştirici
Eksik değerleri doldurun. Simpilgisayar
Kategorik dönüştür OneHotKodlayıcı
Verileri sığdırın ve dönüştürün uyum_dönüşümü
Boru hattını yapın make_pipeline
Temel model
Lojistik regresyon Lojistik regresyon
XGBoost XGBSınıflandırıcı
Sinir ağı MLP Sınıflandırıcı
ızgara arama IzgaraAramaCV
Rastgele arama Rastgele AramaCV

SSS

Mevcut kararlı sürümü pip install -U scikit-learn veya conda install -c conda-forge scikit-learn komutlarıyla yükleyin. Yukarıdaki adımlarda kullanılan geliştirici sürümü yalnızca 2018 yılında, make_column_transformer henüz yayınlanmadığında gerekliydi; artık her kararlı sürümde yer almaktadır.

`fit` fonksiyonu sütun ortalaması ve standart sapma gibi parametreleri öğrenir. `transform` fonksiyonu ise bunları verilere uygular. `fit_transform` her ikisini de tek bir çağrıda yapar ve yalnızca eğitim veri setine dokunmalı, asla ayrı tutulan test veri setine dokunmamalıdır.

Tam veri kümesine bir ölçekleyici veya kodlayıcı uygulamak, test kümesi istatistiklerinin modele ulaşmasını sağlar. Bir işlem hattı, her çapraz doğrulama katmanı içindeki her dönüştürücüyü yeniden uygular, böylece tutulan satırlar puanlanana kadar görünmez kalır.

Tanıdık şekilleri otomatik olarak tamamlar: ColumnTransformer blokları, parametre ızgaraları ve GridSearchCV'nin beklediği çift alt çizgiyle başlayan isimler. RevSürüm hassasiyeti olan herhangi bir şeye dikkat edin, çünkü öneriler genellikle sparse_output yerine sparse gibi eski argüman adlarını yeniden üretir.

Tam olarak değil. Otomatik arama araçları bir ızgarayı daha hızlı keşfeder ve zayıf adayları eler, ancak yine de arama alanını, puanlama ölçütünü ve çapraz doğrulama yöntemini siz seçersiniz. Bu kararlar, arama algoritmasının kendisinden daha önemlidir.

Hayır. Eğitim CPU üzerinde çalışır ve n_jobs aracılığıyla çekirdekler arasında paralelleştirilir. Deneysel bir Array API katmanı, sınırlı sayıda tahmincinin GPU dizilerini kabul etmesine olanak tanır, ancak TensorFlow Benzer çerçeveler GPU seçeneği olarak kalmaya devam ediyor.

Evet. Bir dönüştürücü veya tüm bir işlem hattı üzerinde set_output(transform="pandas") çağrısını yaparsanız, sonuç sütun adlarını korur ve boş bir çıktı döndürmez. Dizi Bu sayede ColumnTransformer çıktısının incelenmesi çok daha kolay hale gelir.

`class_weight="balanced"` parametresini kabul eden tahminleyicilere iletin, `balanced-learn` gibi yardımcı bir kütüphane ile yeniden örnekleme yapın ve düz doğruluk yerine hassasiyet, geri çağırma veya F1 ölçüsü ile puanlayın.

Bu yazıyı şu şekilde özetleyin: