Menganalisis model ML keuangan yang di-deploy di Cloud AI Platform dengan What-If Tool

1. Ringkasan

Di lab ini, Anda akan menggunakan What-if Tool untuk menganalisis model XGBoost yang dilatih pada data keuangan dan di-deploy di Cloud AI Platform.

Yang Anda pelajari

Anda akan mempelajari cara:

  • Melatih model XGBoost pada set data hipotek publik di AI Platform Notebooks
  • Men-deploy model XGBoost ke AI Platform
  • Menganalisis model menggunakan What-if Tool

Total biaya untuk menjalankan lab ini di Google Cloud adalah sekitar $1.

2. Penjelasan singkat tentang XGBoost

XGBoost adalah framework machine learning yang menggunakan pohon keputusan dan gradient boosting untuk membuat model prediktif. Model ini bekerja dengan menggabungkan beberapa pohon keputusan berdasarkan skor yang terkait dengan berbagai node daun dalam pohon.

Diagram di bawah adalah visualisasi model pohon keputusan sederhana yang mengevaluasi apakah pertandingan olahraga harus dimainkan berdasarkan prakiraan cuaca:

308a0bfc70733abf.png

Mengapa kita menggunakan XGBoost untuk model ini? Meskipun jaringan neural tradisional telah terbukti berperforma terbaik pada data tidak terstruktur seperti gambar dan teks, pohon keputusan sering kali berperforma sangat baik pada data terstruktur seperti set data hipotek yang akan kita gunakan dalam codelab ini.

3. Menyiapkan lingkungan Anda

Anda memerlukan project Google Cloud Platform dengan penagihan yang diaktifkan untuk menjalankan codelab ini. Untuk membuat project, ikuti petunjuk di sini.

Langkah 1: Aktifkan Cloud AI Platform Models API

Buka bagian Model AI Platform di Konsol Cloud Anda, lalu klik Aktifkan jika belum diaktifkan.

d0d38662851c6af3.png

Langkah 2: Aktifkan Compute Engine API

Buka Compute Engine dan pilih Aktifkan jika belum diaktifkan. Anda akan memerlukan ini untuk membuat instance notebook.

Langkah 3: Buat instance AI Platform Notebooks

Buka bagian AI Platform Notebooks di Cloud Console Anda, lalu klik Instance Baru. Kemudian, pilih jenis instance TF Enterprise 2.x terbaru tanpa GPU:

7d16190440ab2e9c.png

Gunakan opsi default, lalu klik Buat. Setelah instance dibuat, pilih Open JupyterLab:

772f8868d3841ba0.png

Langkah 4: Instal XGBoost

Setelah instance JupyterLab Anda terbuka, Anda harus menambahkan paket XGBoost.

Untuk melakukannya, pilih Terminal dari peluncur:

28dcf2790ce77c96.png

Kemudian, jalankan perintah berikut untuk menginstal XGBoost versi terbaru yang didukung oleh Cloud AI Platform:

pip3 install xgboost==0.90

Setelah selesai, buka instance Notebook Python 3 dari peluncur. Anda siap untuk mulai menggunakan notebook.

Langkah 5: Impor paket Python

Di sel pertama notebook Anda, tambahkan impor berikut dan jalankan sel. Anda dapat menjalankannya dengan menekan tombol panah kanan di menu atas atau menekan command-enter:

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. Mendownload dan memproses data

Kita akan menggunakan set data hipotek dari ffiec.gov untuk melatih model XGBoost. Kami telah melakukan beberapa praproses pada set data asli dan membuat versi yang lebih kecil untuk Anda gunakan dalam melatih model. Model akan memprediksi apakah permohonan hipotek tertentu akan disetujui atau tidak.

Langkah 1: Download set data yang telah diproses sebelumnya

Kami telah menyediakan versi set data untuk Anda di Google Cloud Storage. Anda dapat mendownloadnya dengan menjalankan perintah gsutil berikut di notebook Jupyter:

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

Langkah 2: Baca set data dengan Pandas

Sebelum membuat DataFrame Pandas, kita akan membuat dict dari jenis data setiap kolom agar Pandas membaca set data kita dengan benar:

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

Selanjutnya, kita akan membuat DataFrame, dengan meneruskan jenis data yang kita tentukan di atas. Penting untuk mengacak data jika set data asli diurutkan dengan cara tertentu. Kita menggunakan utilitas sklearn bernama shuffle untuk melakukannya, yang kita impor di sel pertama:

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() memungkinkan kita melihat pratinjau lima baris pertama set data di Pandas. Anda akan melihat sesuatu seperti ini setelah menjalankan sel di atas:

29106b71103235a6.png

Berikut adalah fitur yang akan kita gunakan untuk melatih model kita. Jika men-scroll hingga ke bagian akhir, Anda akan melihat kolom terakhir approved, yang merupakan hal yang kita prediksi. Nilai 1 menunjukkan bahwa aplikasi tertentu disetujui, dan 0 menunjukkan bahwa aplikasi tersebut ditolak.

Untuk melihat distribusi nilai yang disetujui / ditolak dalam set data dan membuat array numpy dari label, jalankan perintah berikut:

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

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

Sekitar 66% set data berisi aplikasi yang disetujui.

Langkah 3: Membuat kolom dummy untuk nilai kategoris

Set data ini berisi campuran nilai kategoris dan numerik, tetapi XGBoost mengharuskan semua fitur bersifat numerik. Daripada merepresentasikan nilai kategoris menggunakan one-hot encoding, untuk model XGBoost, kita akan memanfaatkan fungsi get_dummies Pandas.

get_dummies mengambil kolom dengan beberapa kemungkinan nilai dan mengonversinya menjadi serangkaian kolom yang masing-masing hanya berisi 0 dan 1. Misalnya, jika kita memiliki kolom "warna" dengan kemungkinan nilai "biru" dan "merah", get_dummies akan mengubahnya menjadi 2 kolom bernama "color_blue" dan "color_red" dengan semua nilai boolean 0 dan 1.

Untuk membuat kolom dummy untuk fitur kategoris, jalankan kode berikut:

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

data.head()

Saat melihat pratinjau data kali ini, Anda akan melihat fitur tunggal (seperti purchaser_type yang digambarkan di bawah) yang dibagi menjadi beberapa kolom:

83aacfaad626e538.png

Langkah 4: Memisahkan data menjadi set pelatihan dan pengujian

Konsep penting dalam machine learning adalah pemisahan data pelatihan / pengujian. Kita akan mengambil sebagian besar data dan menggunakannya untuk melatih model, dan kita akan menyisihkan sisanya untuk menguji model pada data yang belum pernah dilihat sebelumnya.

Tambahkan kode berikut ke notebook Anda, yang menggunakan fungsi Scikit Learn train_test_split untuk membagi data kita:

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

Sekarang Anda siap membangun dan melatih model.

5. Membangun, melatih, dan mengevaluasi model XGBoost

Langkah 1: Tentukan dan latih model XGBoost

Membuat model di XGBoost itu mudah. Kita akan menggunakan class XGBClassifier untuk membuat model, dan hanya perlu meneruskan parameter objective yang tepat untuk tugas klasifikasi tertentu. Dalam hal ini, kita menggunakan reg:logistic karena kita memiliki masalah klasifikasi biner dan kita ingin model menghasilkan satu nilai dalam rentang (0,1): 0 untuk tidak disetujui dan 1 untuk disetujui.

Kode berikut akan membuat model XGBoost:

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

Anda dapat melatih model dengan satu baris kode, memanggil metode fit() dan meneruskan data dan label pelatihan ke dalamnya.

model.fit(x_train, y_train)

Langkah 2: Evaluasi akurasi model Anda

Sekarang kita dapat menggunakan model terlatih untuk membuat prediksi pada data pengujian dengan fungsi predict().

Kemudian, kita akan menggunakan fungsi accuracy_score Scikit Learn untuk menghitung akurasi model berdasarkan performanya pada data pengujian. Kita akan meneruskan nilai kebenaran dasar bersama dengan nilai prediksi model untuk setiap contoh dalam set pengujian:

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

Anda akan melihat akurasi sekitar 87%, tetapi akurasi Anda akan sedikit bervariasi karena selalu ada elemen keacakan dalam machine learning.

Langkah 3: Simpan model Anda

Untuk men-deploy model, jalankan kode berikut untuk menyimpannya ke file lokal:

model.save_model('model.bst')

6. Men-deploy model ke Cloud AI Platform

Kita telah membuat model berfungsi secara lokal, tetapi akan lebih baik jika kita dapat membuat prediksi di model tersebut dari mana saja (bukan hanya notebook ini). Pada langkah ini, kita akan men-deploy-nya ke cloud.

Langkah 1: Buat bucket Cloud Storage untuk model kita

Pertama, mari kita tentukan beberapa variabel lingkungan yang akan kita gunakan di seluruh codelab ini. Isi nilai di bawah dengan nama project Google Cloud Anda, nama bucket Cloud Storage yang ingin Anda buat (harus unik secara global), dan nama versi untuk versi pertama model Anda:

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

Sekarang kita siap membuat bucket penyimpanan untuk menyimpan file model XGBoost. Kita akan mengarahkan Cloud AI Platform ke file ini saat men-deploy.

Jalankan perintah gsutil ini dari dalam notebook Anda untuk membuat bucket:

!gsutil mb $MODEL_BUCKET

Langkah 2: Salin file model ke Cloud Storage

Selanjutnya, kita akan menyalin file model tersimpan XGBoost ke Cloud Storage. Jalankan perintah gsutil berikut:

!gsutil cp ./model.bst $MODEL_BUCKET

Buka browser penyimpanan di Konsol Cloud Anda untuk mengonfirmasi bahwa file telah disalin:

31e2567fa0117214.png

Langkah 3: Buat dan deploy model

Kita hampir siap men-deploy model. Perintah gcloud ai-platform berikut akan membuat model baru di project Anda. Kita akan menyebutnya xgb_mortgage:

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

Sekarang saatnya men-deploy model. Kita dapat melakukannya dengan perintah gcloud ini:

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

Saat ini berjalan, periksa bagian model di konsol AI Platform Anda. Anda akan melihat versi baru Anda di-deploy di sana:

342875ba92becad1.png

Setelah deployment berhasil diselesaikan, Anda akan melihat tanda centang hijau di tempat indikator pemuatan berada. Deployment akan memakan waktu 2-3 menit.

Langkah 4: Uji model yang di-deploy

Untuk memastikan model yang di-deploy berfungsi, uji menggunakan gcloud untuk membuat prediksi. Pertama, simpan file JSON dengan contoh pertama dari set pengujian kami:

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

Uji model Anda dengan menjalankan kode ini:

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

print(prediction)

Anda akan melihat prediksi model Anda dalam output. Contoh khusus ini disetujui, jadi Anda akan melihat nilai yang mendekati 1.

7. Menggunakan What-If Tool untuk menafsirkan model Anda

Langkah 1: Buat visualisasi Alat Simulasi

Untuk menghubungkan Alat Simulasi ke model AI Platform, Anda perlu meneruskan subset contoh pengujian beserta nilai kebenaran nyata untuk contoh tersebut. Mari buat array Numpy dari 500 contoh pengujian kita beserta label kebenaran nyatanya:

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

Membuat instance What-If Tool semudah membuat objek WitConfigBuilder dan meneruskan model AI Platform yang ingin kita analisis.

Kita menggunakan parameter adjust_prediction opsional di sini karena Alat Simulasi mengharapkan daftar skor untuk setiap kelas dalam model kita (dalam hal ini 2). Karena model kita hanya menampilkan satu nilai dari 0 hingga 1, kita mengubahnya ke format yang benar dalam fungsi ini:

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)

Perhatikan bahwa visualisasi akan memerlukan waktu satu menit untuk dimuat. Saat dimuat, Anda akan melihat tampilan berikut:

4c0b00e6afcdbe01.png

Sumbu y menunjukkan prediksi model, dengan 1 menjadi prediksi approved dengan keyakinan tinggi, dan 0 menjadi prediksi denied dengan keyakinan tinggi. Sumbu x hanyalah rentang semua titik data yang dimuat.

Langkah 2: Jelajahi setiap titik data

Tampilan default di Alat Simulasi adalah tab Editor titik data. Di sini, Anda dapat mengklik setiap titik data untuk melihat fiturnya, mengubah nilai fitur, dan melihat bagaimana perubahan tersebut memengaruhi prediksi model pada setiap titik data.

Dalam contoh di bawah, kita memilih titik data yang mendekati batas 0,5. Permohonan hipotek yang terkait dengan titik data tertentu ini berasal dari CFPB. Kami mengubah fitur tersebut menjadi 0 dan juga mengubah nilai agency_code_Department of Housing and Urban Development (HUD) menjadi 1 untuk melihat apa yang akan terjadi pada prediksi model jika pinjaman ini berasal dari HUD:

717620d6a1330479.png

Seperti yang dapat kita lihat di bagian kiri bawah Alat Simulasi, perubahan fitur ini menurunkan prediksi approved model secara signifikan sebesar 32%. Hal ini dapat menunjukkan bahwa lembaga yang memberikan pinjaman memiliki dampak yang besar pada output model, tetapi kita perlu melakukan analisis lebih lanjut untuk memastikannya.

Di bagian kiri bawah UI, kita juga dapat melihat nilai kebenaran nyata untuk setiap titik data dan membandingkannya dengan prediksi model:

60ff20ae80ed5e27.png

Langkah 3: Analisis kontrafaktual

Selanjutnya, klik titik data mana pun dan geser penggeser Tampilkan titik data kontrafaktual terdekat ke kanan:

ae64fd7abefe5449.png

Memilih opsi ini akan menampilkan titik data yang memiliki nilai fitur paling serupa dengan titik data asli yang Anda pilih, tetapi prediksi yang berlawanan. Kemudian, Anda dapat men-scroll nilai fitur untuk melihat perbedaan kedua titik data (perbedaan ditandai dengan warna hijau dan tebal).

Langkah 4: Lihat plot ketergantungan parsial

Untuk melihat pengaruh setiap fitur terhadap prediksi model secara keseluruhan, centang kotak Plot ketergantungan parsial dan pastikan Plot ketergantungan parsial global dipilih:

72117b5ceb683841.png

Di sini kita dapat melihat bahwa pinjaman yang berasal dari HUD memiliki kemungkinan yang sedikit lebih tinggi untuk ditolak. Grafik ini berbentuk demikian karena kode lembaga adalah fitur boolean, sehingga nilainya hanya dapat berupa 0 atau 1.

applicant_income_thousands adalah fitur numerik, dan dalam plot ketergantungan parsial, kita dapat melihat bahwa pendapatan yang lebih tinggi sedikit meningkatkan kemungkinan permohonan disetujui, tetapi hanya hingga sekitar $200 ribu. Setelah $200 ribu, fitur ini tidak memengaruhi prediksi model.

Langkah 5: Pelajari performa dan keadilan secara keseluruhan

Selanjutnya, buka tab Performa & Keadilan. Bagian ini menampilkan statistik performa keseluruhan pada hasil model di set data yang diberikan, termasuk matriks kebingungan, kurva PR, dan kurva ROC.

Pilih mortgage_status sebagai Fitur Kebenaran Nyata untuk melihat matriks konfusi:

fe1384ee47699498.png

Matriks konfusi ini menunjukkan prediksi model kita yang benar dan salah sebagai persentase dari total. Jika Anda menjumlahkan kotak Ya Aktual / Ya yang Diprediksi dan Tidak Aktual / Tidak yang Diprediksi, jumlahnya akan sama dengan akurasi model Anda (sekitar 87%).

Anda juga dapat bereksperimen dengan penggeser batas, menaikkan dan menurunkan skor klasifikasi positif yang perlu ditampilkan model sebelum memutuskan untuk memprediksi approved untuk pinjaman, dan melihat bagaimana hal itu mengubah akurasi, positif palsu, dan negatif palsu. Dalam hal ini, akurasi tertinggi berada di sekitar nilai minimum .55.

Selanjutnya, di dropdown Slice by di sebelah kiri, pilih loan_purpose_Home_purchase:

f3f1858d627d57ab.png

Sekarang Anda akan melihat performa pada dua subset data Anda: slice "0" ditampilkan saat pinjaman bukan untuk pembelian rumah, dan slice "1" ditampilkan saat pinjaman untuk pembelian rumah. Periksa akurasi, rasio positif palsu, dan rasio negatif palsu antara dua slice untuk mencari perbedaan performa.

Jika Anda meluaskan baris untuk melihat matriks kebingungan, Anda dapat melihat bahwa model memprediksi "disetujui" untuk ~70% aplikasi pinjaman untuk pembelian rumah dan hanya 46% pinjaman yang bukan untuk pembelian rumah (persentase pastinya akan bervariasi pada model Anda):

318a8d5a8ffc6bea.png

Jika Anda memilih Paritas demografi dari tombol pilihan di sebelah kiri, kedua nilai minimum akan disesuaikan sehingga model memprediksi approved untuk persentase pelamar yang serupa di kedua irisan. Apa pengaruhnya terhadap akurasi, positif palsu, dan negatif palsu untuk setiap slice?

Langkah 6: Jelajahi distribusi fitur

Terakhir, buka tab Fitur di What-If Tool. Bagian ini menunjukkan distribusi nilai untuk setiap fitur dalam set data Anda:

48ab3c4879793324.png

Anda dapat menggunakan tab ini untuk memastikan set data Anda seimbang. Misalnya, tampaknya hanya sedikit pinjaman dalam set data yang berasal dari Farm Service Agency. Untuk meningkatkan akurasi model, kami dapat mempertimbangkan untuk menambahkan lebih banyak pinjaman dari lembaga tersebut jika datanya tersedia.

Kami telah menjelaskan beberapa ide eksplorasi Alat Perbandingan di sini. Jangan ragu untuk terus menggunakan alat ini, ada banyak area lain yang bisa dijelajahi.

8. Pembersihan

Jika Anda ingin terus menggunakan notebook ini, sebaiknya matikan notebook saat tidak digunakan. Dari UI Notebook di Konsol Cloud Anda, pilih notebook, lalu pilih Stop:

879147427150b6c7.png

Jika Anda ingin menghapus semua resource yang telah dibuat di lab ini, cukup hapus instance notebook, bukan menghentikannya.

Menggunakan menu Navigasi di Konsol Cloud, jelajahi Penyimpanan dan hapus kedua bucket yang Anda buat untuk menyimpan aset model.