What-if Aracı ile Cloud AI Platform'da dağıtılan bir finansal ML modelini analiz etme

1. Genel Bakış

Bu laboratuvarda, finansal verilere göre eğitilen ve Cloud AI Platform'da dağıtılan bir XGBoost modelini analiz etmek için What-if Aracı'nı kullanacaksınız.

Öğrendikleriniz

Öğrenecekleriniz:

  • AI Platform Notebooks'ta herkese açık ipotek veri kümesi üzerinde XGBoost modelini eğitme
  • XGBoost modelini AI Platform'a dağıtma
  • What-if aracını kullanarak modeli analiz etme

Bu laboratuvarı Google Cloud'da çalıştırmanın toplam maliyeti yaklaşık 1 ABD dolarıdır.

2. XGBoost ile ilgili kısa bilgiler

XGBoost, tahmine dayalı modeller oluşturmak için karar ağaçlarını ve gradyan artırmayı kullanan bir makine öğrenimi çerçevesidir. Bir ağaçtaki farklı yaprak düğümleriyle ilişkili puana dayanarak birden fazla karar ağacını bir araya getirir.

Aşağıdaki diyagramda, bir spor maçının hava durumu tahminine göre oynanıp oynanmaması gerektiğini değerlendiren basit bir karar ağacı modelinin görselleştirmesi gösterilmektedir:

308a0bfc70733abf.png

Bu model için neden XGBoost kullanıyoruz? Geleneksel nöral ağların en iyi performansı resimler ve metin gibi yapılandırılmamış verilerde gösterdiği görse de karar ağaçları, bu codelab'de kullanacağımız ipotek veri kümesi gibi yapılandırılmış verilerde genellikle çok iyi performans gösterir.

3. Ortamınızı ayarlama

Bu codelab'i çalıştırmak için faturalandırmanın etkin olduğu bir Google Cloud Platform projesine ihtiyacınız var. Proje oluşturmak için buradaki talimatları uygulayın.

1. Adım: Cloud AI Platform Models API'yi etkinleştirin

Cloud Console'un AI Platform Modelleri bölümüne gidin ve etkinleştirilmemişse Etkinleştir'i tıklayın.

d0d38662851c6af3.png

2. Adım: Compute Engine API'yi etkinleştirin

Compute Engine'e gidin ve zaten etkinleştirilmemişse Etkinleştir'i seçin. Not defteri örneğinizi oluşturmak için buna ihtiyacınız olacaktır.

3. Adım: AI Platform Notebooks örneği oluşturun

Cloud Console'un AI Platform Notebooks bölümüne gidin ve New Instance'ı (Yeni Örnek) tıklayın. Ardından GPU'suz en son TF Enterprise 2.x örnek türünü seçin:

7d16190440ab2e9c.png

Varsayılan seçenekleri kullanın ve ardından Oluştur'u tıklayın. Örnek oluşturulduktan sonra JupyterLab'i aç'ı seçin:

772f8868d3841ba0.png

4. Adım: XGBoost'u yükleyin

JupyterLab örneğiniz açıldıktan sonra XGBoost paketini eklemeniz gerekir.

Bunu yapmak için başlatıcıdan Terminal'i seçin:

28dcf2790ce77c96.png

Ardından aşağıdaki komutu çalıştırarak Cloud AI Platform tarafından desteklenen en son XGBoost sürümünü yükleyin:

pip3 install xgboost==0.90

Bu işlem tamamlandıktan sonra başlatıcıdan bir Python 3 Notebook örneği açın. Not defterinizi kullanmaya başlamaya hazırsınız.

5. Adım: Python paketlerini içe aktarın

Not defterinizin ilk hücresine aşağıdaki içe aktarma işlemlerini ekleyin ve hücreyi çalıştırın. Üst menüde sağ ok tuşuna veya Command-Enter tuşuna basarak çalıştırabilirsiniz:

import pandas as pd
import xgboost as xgb
import numpy as np
import collections
import witwidget

from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, confusion_matrix
from sklearn.utils import shuffle
from witwidget.notebook.visualization import WitWidget, WitConfigBuilder

4. Verileri indirme ve işleme

XGBoost modelini eğitmek için ffiec.gov'dan alınan bir ipotek veri kümesi kullanacağız. Orijinal veri kümesinde bazı ön işlemler gerçekleştirdik ve modeli eğitmek için kullanmanız için daha küçük bir sürüm oluşturduk. Model, belirli bir ipotek başvurusunun onaylanıp onaylanmayacağını tahmin eder.

1. Adım: Önceden işlenmiş veri kümesini indirin

Google Cloud Storage'da veri kümesinin bir sürümünü sizin için hazırladık. Jupyter not defterinizde aşağıdaki gsutil komutunu çalıştırarak indirebilirsiniz:

!gsutil cp 'gs://mortgage_dataset_files/mortgage-small.csv' .

2. Adım: Veri kümesini Pandas ile okuyun

Pandas DataFrame'imizi oluşturmadan önce Pandas'ın veri kümemizi doğru bir şekilde okuyabilmesi için her sütunun veri türüne ait bir dikte oluşturacağız:

COLUMN_NAMES = collections.OrderedDict({
 'as_of_year': np.int16,
 'agency_code': 'category',
 'loan_type': 'category',
 'property_type': 'category',
 'loan_purpose': 'category',
 'occupancy': np.int8,
 'loan_amt_thousands': np.float64,
 'preapproval': 'category',
 'county_code': np.float64,
 'applicant_income_thousands': np.float64,
 'purchaser_type': 'category',
 'hoepa_status': 'category',
 'lien_status': 'category',
 'population': np.float64,
 'ffiec_median_fam_income': np.float64,
 'tract_to_msa_income_pct': np.float64,
 'num_owner_occupied_units': np.float64,
 'num_1_to_4_family_units': np.float64,
 'approved': np.int8
})

Ardından, yukarıda belirttiğimiz veri türlerini ileterek bir DataFrame oluşturacağız. Orijinal veri kümesi belirli bir şekilde sıralanmışsa verilerimizi karıştırmak önemlidir. Bunu yapmak için, ilk hücrede içe aktardığımız shuffle adında bir sklearn yardımcı programı kullanıyoruz:

data = pd.read_csv(
 'mortgage-small.csv',
 index_col=False,
 dtype=COLUMN_NAMES
)
data = data.dropna()
data = shuffle(data, random_state=2)
data.head()

data.head(), veri kümemizin ilk beş satırını Pandas'ta önizlememize olanak tanıyor. Yukarıdaki hücreyi çalıştırdıktan sonra şuna benzer bir sonuç görürsünüz:

29106b71103235a6.png

Bunlar, modelimizi eğitmek için kullanacağımız özelliklerdir. Ekranın en sonuna kadar kaydırırsanız son approved sütununu görürsünüz. Bu, bizim tahmin ettiğimiz şeydir. 1 değeri belirli bir uygulamanın onaylandığını, 0 ise reddedildiğini belirtir.

Veri kümesindeki onaylanmış / reddedilen değerlerin dağılımını görmek ve bir dizi etiket oluşturmak için aşağıdaki komutu çalıştırın:

# Class labels - 0: denied, 1: approved
print(data['approved'].value_counts())

labels = data['approved'].values
data = data.drop(columns=['approved'])

Veri kümesinin yaklaşık% 66'sı onaylanmış uygulamalar içermektedir.

3. Adım: Kategorik değerler için model sütun oluşturma

Bu veri kümesi kategorik ve sayısal değerlerin bir karışımını içerir, ancak XGBoost tüm özelliklerin sayısal olmasını gerektirir. XGBoost modelimizde, kategorik değerleri tek kullanımlık kodlama kullanarak göstermek yerine, Pandas get_dummies işlevinden yararlanacağız.

get_dummies, birden çok olası değer içeren bir sütunu alır ve her biri yalnızca 0 ve 1'lerden oluşan bir sütun serisine dönüştürür. Örneğin, "color" (renk) olası "mavi" değerleriyle ve "kırmızı", get_dummies, bunu "color_blue" adında 2 sütuna dönüştürür. ve "color_red" boole 0 ve 1 değerleriyle birlikte kullanın.

Kategorik özelliklerimiz için model sütunlar oluşturmak üzere aşağıdaki kodu çalıştırın:

dummy_columns = list(data.dtypes[data.dtypes == 'category'].index)
data = pd.get_dummies(data, columns=dummy_columns)

data.head()

Bu defalık verileri önizlediğinizde, tek tek özelliklerin (aşağıda gösterilmiştir purchaser_type gibi) birden çok sütuna bölünmüş olduğunu görürsünüz:

83aacfaad626e538.png

4. adım: Verileri eğitim ve test kümelerine ayırma

Makine öğrenimindeki önemli kavramlardan biri eğitim / test dağılımıdır. Verilerimizin büyük bir kısmını alıp modelimizi eğitmek için kullanacağız. Kalan kısmını da modelimizi daha önce hiç görülmemiş veriler üzerinde test etmek için bir kenara ayıracağız.

Verilerimizi bölmek için Scikit Learn işlevini train_test_split kullanan aşağıdaki kodu not defterinize ekleyin:

x,y = data,labels
x_train,x_test,y_train,y_test = train_test_split(x,y)

Artık modelinizi oluşturup eğitmeye hazırsınız.

5. XGBoost modelini oluşturun, eğitin ve değerlendirin

1. Adım: XGBoost modelini tanımlayın ve eğitin

XGBoost'ta model oluşturmak basittir. Modeli oluşturmak için XGBClassifier sınıfını kullanacağız ve yalnızca özel sınıflandırma görevimiz için doğru objective parametresini iletmemiz gerekecek. Bu örnekte, ikili sınıflandırma sorunumuz olduğu ve modelin (0,1) aralığında tek bir değer üretmesini istediğimiz için reg:logistic kullanıyoruz: onaylanmamış için 0 ve onaylılar için 1.

Aşağıdaki kod bir XGBoost modeli oluşturur:

model = xgb.XGBClassifier(
    objective='reg:logistic'
)

fit() yöntemini çağırıp eğitim verilerini ve etiketlerini ileterek modeli tek bir kod satırıyla eğitebilirsiniz.

model.fit(x_train, y_train)

2. Adım: Modelinizin doğruluğunu değerlendirin

Artık predict() işleviyle test verilerimiz hakkında tahminler oluşturmak için eğitilen modelimizi kullanabiliriz.

Ardından, test verilerimize göre modelimizin doğruluğunu hesaplamak için Scikit Learn'in accuracy_score işlevini kullanacağız. Modele, kesin referans değerlerini, test kümemizdeki her örnek için modelin tahmin edilen değerleriyle birlikte iletiriz:

y_pred = model.predict(x_test)
acc = accuracy_score(y_test, y_pred.round())
print(acc, '\n')

Doğruluk oranını %87 civarında görürsünüz, ancak makine öğreniminde her zaman rastgelelik unsuru olduğu için sizin doğruluk oranınız biraz farklılık gösterir.

3. adım: Modelinizi kaydedin

Modeli dağıtmak için aşağıdaki kodu çalıştırarak modeli bir yerel dosyaya kaydedin:

model.save_model('model.bst')

6. Modeli Cloud AI Platform'a dağıtma

Modelimiz yerel olarak çalışıyor, ancak sadece bu not defterinde değil, her yerden tahmin yapabilseydik güzel olurdu. Bu adımda modeli buluta dağıtacağız.

1. Adım: Modelimiz için bir Cloud Storage paketi oluşturun

Öncelikle codelab'in geri kalanında kullanacağımız bazı ortam değişkenlerini tanımlayalım. Aşağıdaki değerlere Google Cloud projenizin adını, oluşturmak istediğiniz bulut depolama paketinin adını (genel olarak benzersiz olmalıdır) ve modelinizin ilk sürümünün sürüm adını girin:

# Update these to your own GCP project, model, and version names
GCP_PROJECT = 'your-gcp-project'
MODEL_BUCKET = 'gs://storage_bucket_name'
VERSION_NAME = 'v1'
MODEL_NAME = 'xgb_mortgage'

Şimdi XGBoost model dosyamızı depolamak için bir depolama paketi oluşturmaya hazırız. Dağıtım yaparken Cloud AI Platform'u bu dosyaya yönlendireceğiz.

Paket oluşturmak için not defterinizde şu gsutil komutunu çalıştırın:

!gsutil mb $MODEL_BUCKET

2. Adım: Model dosyasını Cloud Storage'a kopyalayın

Şimdi, XGBoost kayıtlı model dosyamızı Cloud Storage'a kopyalayacağız. Aşağıdaki gsutil komutunu çalıştırın:

!gsutil cp ./model.bst $MODEL_BUCKET

Dosyanın kopyalandığını onaylamak için Cloud Console'daki depolama tarayıcısına gidin:

31e2567fa0117214.png

3. Adım: Modeli oluşturun ve dağıtın

Modeli dağıtmaya neredeyse hazırız! Aşağıdaki ai-platform gcloud komutu, projenizde yeni bir model oluşturur. Buna xgb_mortgage adını vereceğiz:

!gcloud ai-platform models create $MODEL_NAME --region='global'

Şimdi sıra modeli dağıtmaya geldi. Bu işlemi şu gcloud komutuyla yapabiliriz:

!gcloud ai-platform versions create $VERSION_NAME \
--model=$MODEL_NAME \
--framework='XGBOOST' \
--runtime-version=2.1 \
--origin=$MODEL_BUCKET \
--python-version=3.7 \
--project=$GCP_PROJECT \
--region='global'

Bu çalışırken AI Platform konsolunuzun modeller bölümünü kontrol edin. Yeni sürümünüzün oradan dağıtıldığını göreceksiniz:

342875ba92becad1.png

Dağıtım başarıyla tamamlandığında yükleme döner simgesinin bulunduğu yerde yeşil bir onay işareti görürsünüz. Dağıtım işlemi 2-3 dakika sürer.

4. Adım: Dağıtılan modeli test edin

Dağıtılan modelinizin çalıştığından emin olmak için gcloud'u kullanarak tahminde bulunun. Öncelikle test grubumuzdaki ilk örneği kullanarak bir JSON dosyası kaydedin:

%%writefile predictions.json
[2016.0, 1.0, 346.0, 27.0, 211.0, 4530.0, 86700.0, 132.13, 1289.0, 1408.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0]

Şu kodu çalıştırarak modelinizi test edin:

prediction = !gcloud ai-platform predict --model=xgb_mortgage --region='global' --json-instances=predictions.json --version=$VERSION_NAME --verbosity=none

print(prediction)

Modelinizin tahminini çıkışta göreceksiniz. Söz konusu örnek onaylandığı için 1'e yakın bir değer görmeniz gerekir.

7. Modelinizi yorumlamak için What-if aracını kullanma

1. Adım: What-if Aracı görselleştirmesini oluşturun

What-if Aracı'nı AI Platform modellerinize bağlamak için araca, test örneklerinizin bir alt kümesini ve bu örneklerin kesin referans değerlerini iletmeniz gerekir. Kesin referans etiketleriyle birlikte 500 test örneğimizden oluşan bir Numpy dizisi oluşturalım:

num_wit_examples = 500
test_examples = np.hstack((x_test[:num_wit_examples].values,y_test[:num_wit_examples].reshape(-1,1)))

What-if aracını örneklendirmek için tek yapmanız gereken bir WitConfigBuilder nesnesi oluşturup analiz etmek istediğimiz AI Platform modeline iletmektir.

What-if Aracı, modelimizdeki her sınıf (bu senaryoda 2) için bir puan listesi beklediğinden burada isteğe bağlı adjust_prediction parametresini kullanıyoruz. Modelimiz yalnızca 0 ile 1 arasında tek bir değer döndürdüğünden, bu işlevde bunu doğru biçime dönüştürürüz:

def adjust_prediction(pred):
  return [1 - pred, pred]

config_builder = (WitConfigBuilder(test_examples.tolist(), data.columns.tolist() + ['mortgage_status'])
  .set_ai_platform_model(GCP_PROJECT, MODEL_NAME, VERSION_NAME, adjust_prediction=adjust_prediction)
  .set_target_feature('mortgage_status')
  .set_label_vocab(['denied', 'approved']))
WitWidget(config_builder, height=800)

Görselleştirmenin yüklenmesinin bir dakika süreceğini unutmayın. Yükleme işlemi tamamlandığında aşağıdakileri görürsünüz:

4c0b00e6afcdbe01.png

Y ekseni bize modelin tahminini gösterir. 1 değeri yüksek güvenilirlikli approved tahmini, 0 ise yüksek güvenli denied tahminidir. X ekseni, yalnızca yüklenen tüm veri noktalarının yayılımıdır.

2. adım: Veri noktalarını tek tek inceleyin

What-if Aracı'ndaki varsayılan görünüm Veri noktası düzenleyicisi sekmesidir. Burada herhangi bir veri noktasını tıklayarak özelliklerini görebilir, özellik değerlerini değiştirebilir ve bu değişikliğin modelin tek bir veri noktasıyla ilgili tahminini nasıl etkilediğini görebilirsiniz.

Aşağıdaki örnekte 0,5 eşiğine yakın bir veri noktası seçtik. Bu veri noktasıyla ilişkili ipotek başvurusunun kaynağı CFPB'dir. Bu özelliği 0 olarak, ayrıca bu kredinin HUD'den kaynaklanması halinde modelin tahminine ne olacağını görmek için agency_code_Department of Housing and Urban Development (HUD) değerini 1 olarak değiştirdik:

717620d6a1330479.png

What-if Aracı'nın sol alt bölümünde görebileceğiniz gibi, bu özelliği değiştirmek modelin approved tahminini %32 oranında önemli ölçüde düşürdü. Bu durum, kredinin kaynağı olan ajansın modelin çıktısı üzerinde güçlü bir etkiye sahip olduğunu gösterebilir. Ancak emin olmak için daha fazla analiz yapmamız gerek.

Kullanıcı arayüzünün sol alt bölümünde, her veri noktası için kesin referans değerini de görüp modelin tahminiyle karşılaştırabiliriz:

60ff20ae80ed5e27.png

3. Adım: Varsayımsal analiz

Ardından, herhangi bir veri noktasını tıklayın ve En yakın karşı olgusal veri noktasını göster kaydırma çubuğunu sağa kaydırın:

ae64fd7abefe5449.png

Bunu seçtiğinizde, seçtiğiniz orijinal değerle en benzer özellik değerlerine, ancak bunun tersi bir tahmine sahip veri noktası gösterilir. Daha sonra, iki veri noktasının nerede farklılaştığını görmek için özellik değerleri arasında gezinebilirsiniz (farklar yeşil ve kalın olarak vurgulanır).

4. adım: Kısmi bağımlılık grafiklerine bakın

Her bir özelliğin modelin genel tahminlerini nasıl etkilediğini görmek için Kısmi bağımlılık grafikleri kutusunu işaretleyin ve Genel kısmi bağımlılık grafikleri'nin seçildiğinden emin olun:

72117b5ceb683841.png

Burada, HUD'den kaynaklanan kredilerin reddedilme olasılığının biraz daha yüksek olduğunu görebiliriz. Ajans kodu bir boole özelliği olduğundan, değerler yalnızca tam olarak 0 veya 1 olabilir. Bu nedenle grafik bu şekildedir.

applicant_income_thousands sayısal bir özelliktir. Kısmi bağımlılık grafiğine göre daha yüksek gelirin başvurunun onaylanma olasılığını kısmen artırdığını fakat yaklaşık 200.000 ABD dolarını bulabildiğini görüyoruz. 200.000 ABD dolarından sonra bu özellik modelin tahminini etkilemez.

5. adım: Genel performans ve adalet hakkında bilgi edinin

Ardından, Performans ve Adalet sekmesini seçin. Bu, karışıklık matrisleri, PR eğrileri ve ROC eğrilerini de içeren, sağlanan veri kümesiyle ilgili model sonuçlarına ilişkin genel performans istatistiklerini gösterir.

Karışıklık matrisini görmek için Kesin Referans Özelliği olarak mortgage_status'yi seçin:

fe1384ee47699498.png

Bu karışıklık matrisi, modelimizin doğru ve yanlış tahminlerini toplamın yüzdesi olarak gösterir. Gerçek Evet / Tahmin Edilen Evet ve Gerçek Hayır / Tahmin Edilen Hayır karelerini topladığınızda, toplamının modelinizle aynı doğruluk oranına sahip olması gerekir (yaklaşık %87).

Ayrıca eşik kaydırma çubuğunu kullanarak, modelin kredi için approved tahminine karar vermeden önce döndürmesi gereken pozitif sınıflandırma puanını artırıp azaltabilir ve bunun doğruluğu, yanlış pozitif ve yanlış negatif değerleri nasıl değiştirdiğini görebilirsiniz. Bu durumda, doğruluk 0,55'lik bir eşik civarında en yüksek olur.

Sonra, soldaki Dilim ölçütü açılır listesinde loan_purpose_Home_purchase'yi seçin:

f3f1858d627d57ab.png

Artık verilerinizin iki alt kümesiyle ilgili performansı görürsünüz: "0" dilim, kredinin ev satın alma işlemi için olmadığı durumları gösterir. "1" dilimi, kredinin ev satın alma amaçlı olduğu durumlardır. Performansta fark olup olmadığını görmek için iki dilim arasındaki doğruluk, yanlış pozitif ve yanlış negatif oranı değerlerini kontrol edin.

Karışıklık matrislerine bakmak için satırları genişletirseniz, modelin "onaylandı" sonucunu tahmin ettiğini görebilirsiniz. ev satın alma işlemlerinde kredi başvurularının yaklaşık% 70'i ve ev satışına yönelik olmayan kredilerin yalnızca% 46'sı için geçerlidir (Tam yüzdeler modelinize göre değişiklik gösterir):

318a8d5a8ffc6bea.png

Soldaki radyo düğmelerinden Demografik denklik'i seçerseniz iki eşik, modelin her iki dilimdeki başvuru sahiplerinin benzer yüzdesi için approved değerini tahmin edecek şekilde ayarlanır. Bu durum, her bir dilim için doğruluk, yanlış pozitif ve yanlış negatif değerlerinde ne yapar?

6. Adım: Özellik dağıtımını keşfedin

Son olarak, What-if Aracı'nda Özellikler sekmesine gidin. Bu işlem, veri kümenizdeki her özellik için değerlerin dağılımını gösterir:

48ab3c4879793324.png

Veri kümenizin dengeli olduğundan emin olmak için bu sekmeyi kullanabilirsiniz. Örneğin, veri kümesinde Çiftlik Hizmetleri Kurumu'na ait çok az kredinin yer aldığı görülüyor. Model doğruluğunu iyileştirmek için, veriler mevcutsa ilgili ajanstan daha fazla kredi eklemeyi düşünebiliriz.

Aşağıda, What-if Tool'u keşfetmeyle ilgili birkaç fikir verilmiştir. Aracı kullanmaya devam edebilirsiniz. Keşfedilecek daha pek çok alan var.

8. Temizleme

Bu not defterini kullanmaya devam etmek istiyorsanız, kullanılmadığında devre dışı bırakmanız önerilir. Cloud Console'daki Not Defteri kullanıcı arayüzünden not defterini ve ardından Durdur'u seçin:

879147427150b6c7.png

Bu laboratuvarda oluşturduğunuz tüm kaynakları silmek istiyorsanız not defteri örneğini durdurmak yerine silin.

Cloud Console'daki gezinme menüsünü kullanarak Storage'a gidin ve model öğelerinizi depolamak için oluşturduğunuz her iki paketi de silin.