1. Ringkasan
Di lab ini, Anda akan menggunakan What-If Tool untuk menganalisis model XGBoost yang dilatih dengan data keuangan dan di-deploy di Cloud AI Platform.
Yang Anda pelajari
Anda akan mempelajari cara:
- Latih 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 XGBoost
XGBoost adalah framework machine learning yang menggunakan hierarki keputusan dan peningkatan gradien untuk membangun model prediktif. Cara kerjanya adalah dengan menggabungkan beberapa pohon keputusan berdasarkan skor yang terkait dengan node daun yang berbeda dalam sebuah pohon.
Diagram di bawah adalah visualisasi model pohon keputusan sederhana yang mengevaluasi apakah pertandingan olahraga harus dimainkan berdasarkan perkiraan cuaca:
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 AI Platform Models di Cloud Console Anda, lalu klik Enable jika belum diaktifkan.
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: Membuat instance AI Platform Notebooks
Buka bagian AI Platform Notebooks di Konsol Cloud Anda, lalu klik New Instance. Kemudian, pilih jenis instance TF Enterprise 2.x terbaru tanpa GPU:
Gunakan opsi default, lalu klik Create. Setelah instance dibuat, pilih Open JupyterLab:
Langkah 4: Instal XGBoost
Setelah instance JupyterLab terbuka, Anda harus menambahkan paket XGBoost.
Untuk melakukannya, pilih Terminal dari peluncur:
Lalu, 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 sudah siap untuk mulai membuat 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 pra-pemrosesan pada set data asli dan membuat versi yang lebih kecil untuk Anda gunakan dalam melatih model. Model ini 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 {i>dataset<i} dengan Pandas
Sebelum membuat DataFrame Pandas, kita akan membuat dikte untuk setiap jenis data kolom sehingga Pandas membaca set data 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 telah kita tentukan di atas. Penting untuk mengacak data jika {i>dataset<i} asli diurutkan dengan cara tertentu. Kita menggunakan utilitas sklearn
yang disebut shuffle
untuk melakukannya, yang telah diimpor 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 tampilan seperti ini setelah menjalankan sel di atas:
Ini adalah fitur yang akan kita gunakan untuk melatih model. Jika men-scroll hingga bagian akhir, Anda akan melihat kolom terakhir approved
, yang merupakan hal yang kami prediksi. Nilai 1
menunjukkan aplikasi tertentu disetujui, dan 0
menunjukkan aplikasi ditolak.
Untuk melihat distribusi nilai yang disetujui / ditolak dalam set data dan membuat array numpy 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% dari set data berisi aplikasi yang disetujui.
Langkah 3: Membuat kolom contoh untuk nilai kategori
{i>Dataset<i} ini berisi campuran nilai kategorikal dan numerik, tetapi XGBoost mengharuskan semua fitur berupa numerik. Daripada merepresentasikan nilai kategoris menggunakan encoding one-hot, 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 "blue" (biru) dan "merah", get_dummies
akan mengubah kolom ini menjadi 2 kolom bernama "color_blue" dan "color_red" dengan semua nilai boolean 0 dan 1.
Untuk membuat kolom contoh fitur kategorial kita, 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
dalam gambar di bawah) yang dibagi menjadi beberapa kolom:
Langkah 4: Memisahkan data ke dalam set pelatihan dan pengujian
Konsep penting dalam machine learning adalah pemisahan 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 untuk 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 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()
serta meneruskan data dan label pelatihan.
model.fit(x_train, y_train)
Langkah 2: Evaluasi akurasi model Anda
Sekarang kita dapat menggunakan model yang telah dilatih untuk menghasilkan prediksi pada data uji 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')
Akurasi biasanya sekitar 87%, tetapi akurasi Anda akan sedikit berbeda 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
Model kita sudah berfungsi secara lokal, tetapi akan lebih baik jika kita dapat membuat prediksi 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-tama, mari kita tentukan beberapa variabel lingkungan yang akan kita gunakan pada seluruh codelab ini. Isi nilai di bawah ini 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 kita melakukan deployment.
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:
Langkah 3: Membuat dan men-deploy model
Kita hampir siap untuk men-deploy model. Perintah gcloud ai-platform
berikut akan membuat model baru dalam 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'
Selama proses ini berjalan, periksa bagian model di konsol AI Platform Anda. Anda akan melihat versi baru di-deploy di sana:
Setelah deployment berhasil diselesaikan, Anda akan melihat tanda centang hijau di tempat indikator lingkaran berputar pemuatan. Proses deploy akan memerlukan waktu 2-3 menit.
Langkah 4: Uji model yang di-deploy
Untuk memastikan model yang di-deploy berfungsi, lakukan pengujian menggunakan gcloud untuk membuat prediksi. Pertama, simpan file JSON dengan contoh pertama dari set pengujian kita:
%%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 di 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 What-If Tool
Untuk menghubungkan What-If Tool ke model AI Platform, Anda harus meneruskan subset contoh pengujian Anda bersama dengan nilai kebenaran dasar untuk contoh tersebut. Mari kita buat array Numpy yang berisi 500 contoh pengujian bersama dengan label kebenaran dasar:
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 What-If Tool mengharapkan daftar skor untuk setiap class dalam model kita (dalam kasus ini 2). Karena model hanya menampilkan satu nilai dari 0 ke 1, kita mengubahnya ke format yang benar di 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 perlu waktu satu menit untuk memuat visualisasi. Saat dimuat, Anda akan melihat tampilan berikut:
Sumbu y menunjukkan prediksi model, dengan 1
sebagai prediksi approved
dengan keyakinan tinggi, dan 0
adalah prediksi denied
dengan keyakinan tinggi. Sumbu x hanyalah penyebaran semua titik data yang dimuat.
Langkah 2: Pelajari setiap titik data
Tampilan default di What-If Tool 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.
Pada contoh di bawah ini, kami memilih titik data yang mendekati nilai minimum 0,5. Permohonan hipotek yang terkait dengan titik data khusus 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 mengetahui apa yang akan terjadi pada prediksi model jika pinjaman ini berasal dari HUD:
Seperti yang dapat kita lihat di bagian kiri bawah What-If Tool, mengubah fitur ini akan menurunkan prediksi approved
model secara signifikan sebesar 32%. Hal ini dapat menunjukkan bahwa agensi yang menjadi sumber pinjaman memiliki dampak yang kuat pada output model, tetapi kita harus melakukan analisis lebih lanjut untuk memastikannya.
Di bagian kiri bawah UI, kita juga dapat melihat nilai kebenaran dasar untuk setiap titik data dan membandingkannya dengan prediksi model:
Langkah 3: Analisis kontrafaktual
Selanjutnya, klik titik data mana pun dan gerakkan penggeser Tampilkan titik data kontrafaktual terdekat ke kanan:
Memilih opsi ini akan menampilkan titik data yang memiliki nilai fitur paling mirip dengan nilai fitur asli yang Anda pilih, tetapi prediksi sebaliknya. Kemudian Anda dapat men-scroll nilai fitur untuk melihat perbedaan antara kedua titik data tersebut (perbedaan ditandai dengan warna hijau dan tebal).
Langkah 4: Lihat plot dependensi parsial
Untuk melihat pengaruh setiap fitur terhadap prediksi model secara keseluruhan, centang kotak Partial dependence plots dan pastikan Global partial dependence plots dipilih:
Di sini kita dapat melihat bahwa pinjaman yang berasal dari HUD memiliki kemungkinan yang sedikit lebih besar untuk ditolak. Grafik ini adalah bentuk ini karena kode agensi adalah fitur boolean, sehingga nilai hanya boleh 0 atau 1.
applicant_income_thousands
adalah fitur numerik, dan dalam plot dependensi parsial kita dapat melihat bahwa pendapatan yang lebih tinggi sedikit meningkatkan kemungkinan permohonan disetujui, tetapi hanya sekitar $200 ribu. Setelah $200 ribu, fitur ini tidak akan memengaruhi prediksi model.
Langkah 5: Pelajari keseluruhan performa dan keadilan
Berikutnya, buka Performa & Tab Keadilan. Hal ini menunjukkan statistik performa keseluruhan pada hasil model pada set data yang disediakan, termasuk matriks konflik, kurva PR, dan kurva ROC.
Pilih mortgage_status
sebagai Fitur Kebenaran Dasar untuk melihat matriks konfusi:
Matriks konfusi ini menunjukkan prediksi yang benar dan salah dari model kita sebagai persentase dari total. Jika Anda menjumlahkan kotak Ya / Prediksi Ya Aktual dan Tidak Aktual / Tidak Aktual, jumlahnya akan memiliki akurasi yang sama dengan model Anda (sekitar 87%).
Anda juga dapat bereksperimen dengan penggeser nilai minimum, menaikkan dan menurunkan skor klasifikasi positif yang perlu ditampilkan model sebelum memutuskan untuk memprediksi approved
untuk pinjaman, dan melihat bagaimana hal tersebut mengubah akurasi, positif palsu, dan negatif palsu. Dalam hal ini, akurasi tertinggi adalah di sekitar nilai minimum 0,55.
Selanjutnya, di menu dropdown Slice by di sebelah kiri, pilih loan_purpose_Home_purchase
:
Sekarang Anda akan melihat performa pada dua subkumpulan data: "0" irisan menunjukkan kapan pinjaman bukan untuk pembelian rumah, dan "1" adalah untuk saat pinjaman untuk pembelian rumah. Periksa akurasi, postif palsu, dan rasio negatif palsu antara kedua irisan tersebut untuk mencari perbedaan performa.
Jika Anda memperluas baris untuk melihat matriks konflik, Anda dapat melihat bahwa model memprediksi "disetujui" untuk ~70% aplikasi pinjaman untuk pembelian rumah dan hanya 46% pinjaman yang bukan untuk pembelian rumah (persentase persisnya akan bervariasi pada model Anda):
Jika Anda memilih Kemiripan demografi dari tombol pilihan di sebelah kiri, kedua nilai minimum tersebut akan disesuaikan sehingga model akan memprediksi approved
untuk persentase pendaftar yang serupa di kedua bagian. Apa pengaruhnya terhadap akurasi, positif palsu, dan negatif palsu untuk setiap irisan?
Langkah 6: Pelajari distribusi fitur
Terakhir, buka tab Features pada What-If Tool. Langkah ini menunjukkan distribusi nilai untuk setiap fitur dalam set data Anda:
Anda dapat menggunakan {i>tab<i} ini untuk memastikan {i>dataset<i} Anda seimbang. Misalnya, tampaknya pinjaman dalam {i>dataset<i} yang berasal dari Badan Layanan Pertanian sangat sedikit. Untuk meningkatkan akurasi model, kami dapat mempertimbangkan untuk menambahkan lebih banyak pinjaman dari agensi tersebut jika datanya tersedia.
Kami telah menjelaskan beberapa ide eksplorasi What-If Tool di sini. Jangan ragu untuk terus mencoba alat ini, ada banyak area lainnya untuk dijelajahi!
8. Pembersihan
Jika ingin terus menggunakan notebook ini, sebaiknya nonaktifkan saat tidak digunakan. Dari UI Notebooks di Konsol Cloud, pilih notebook, lalu pilih Stop:
Jika ingin menghapus semua resource yang telah dibuat di lab ini, cukup hapus instance notebook, bukan menghentikannya.
Dengan menggunakan menu Navigasi di Konsol Cloud, jelajahi Penyimpanan dan hapus kedua bucket yang Anda buat untuk menyimpan aset model.