Inilah saatnya mengotori tangan kita, keluarkan selembar kertas dan siapkan pulpen karena kita akan membuat sebuah karya seni. Bukan pohon yang biasa dibuat Picasso, melainkan pohon keputusan dan bukan sekadar gambar simpul. Kanvas A4 akan dilukis dengan matematika. Kami akan menyelesaikan masalah pohon keputusan secara manual dan menggunakan API sklearn. Kami akan memplot pohon yang dibangun menggunakan kedua pendekatan tersebut dan melihat seberapa miripnya keduanya.

Pohon Keputusan Dengan Tangan

Di bagian ini, kita akan membangun pohon keputusan menggunakan pengetahuan matematika kita dan bukan dengan perpustakaan yang sudah ditulis sebelumnya. Data yang kami gunakan adalah contoh dari Dataset Diabetes India Pima. Kita dapat melihat contoh kumpulan data di bawah ini:

Data di atas berisi dua variabel fitur, tekanan darah diastolik (mm Hg) yang dikodekan sebagai DBP dan usia dalam tahun. Variabel targetnya adalah Diabetes yang merupakan variabel biner yang menunjukkan apakah pasien menderita diabetes atau tidak.

Dalam pohon keputusan normal untuk setiap pemisahan, setiap fitur tersedia untuk dipertimbangkan dan untuk mendapatkan variabel dan ambang batas optimal untuk pemisahan, kami akan menggunakan Gini Impurity untuk membandingkan, jika Anda ingin kejelasan tentang Gini Impurity baca blog terakhir saya Pohon Keputusan: Semua tentangnya!. Variabel numerik kontinu, pertama-tama kita akan mengurutkan fitur-fiturnya dalam urutan menaik dan kemudian kita menghitung rata-rata setiap suku yang berdekatan dan menghitung Indeks Gini untuk semua nilai tersebut dan membandingkannya.

Mari kita mulai dengan DBP. Array yang diurutkan adalah 40, 50, 64, 66, 66, 72, 74. Sekarang hitung mean dari setiap suku yang berdekatan, misalnya 40+50/2; 45, demikian pula untuk suku berikutnya yang berdekatan 50 dan 64 kita akan mendapatkan 57 iklan dan seterusnya. Array terakhir terlihat seperti 45, 57, 65, 66, 69 dan 73.

Pengotor Gini jika kita mengambil DBP dengan ambang batas 45 yang berarti DBP≤45 adalah:

Seperti yang dapat Anda lihat dari gambar di atas, kami menghitung jumlah titik data yang diklasifikasikan dengan benar dan salah diklasifikasikan dalam hasil pemisahan dan menghitung pengotor Gini untuk kedua anak tersebut. Jumlah tertimbang anak kiri dan kanan adalah pengotor Gini dari pembagian tersebut. Kami menetapkan bobot sebagai proporsi titik data di node anak. Kami mengulangi proses ini untuk setiap cara berdekatan yang kami dapatkan sebelumnya.

Tabel di atas menunjukkan Pengotor Gini untuk setiap nilai dan kita dapat melihat bahwa ambang batas adalah yang terbaik karena ini memperhitungkan Pengotor Gini paling sedikit untuk fitur DBP. Kami akan melakukan prosedur yang sama untuk usia.

Dari dua tabel ini, kita dapat mengamati bahwa fitur DBP pada ambang batas 65 memberikan pemisahan paling murni atau Pengotor Gini minimum, sehingga node pertama kita akan memiliki DBP≤65.

Anak kiri mewakili kondisi yang benar dan anak kanan mewakili kondisi yang salah. Anak kiri adalah node murni karena semua titik data di dalamnya berasal dari kelas yang sama atau kita dapat mengatakan orang-orang dalam data sampel kita yang memiliki DBP kurang dari atau sama dengan 65 menderita diabetes. Ketidakmurnian ada pada anak yang tepat dan kita akan melanjutkan dan menemukan hasil pemisahan tersebut menjadi anak-anak yang lebih murni atau kita berhenti di sini.

Kita ulangi proses pemisahan sekali lagi untuk anak kanan, ingat operasi ini sekarang akan terjadi pada empat titik data di anak kanan. Berikut data yang terdapat pada anak kanan:

Saat melakukan penghitungan, kami menemukan Age≤41.5 adalah fitur dan ambang batas optimal untuk pemisahan berikutnya. Pohon keputusan kita akan terlihat seperti ini:

Ini adalah kerja keras yang berat, tetapi akhirnya kami berhasil. Apakah Anda memperhatikan bagaimana pohon ini cocok dengan pohon kita? Terkadang hal ini menyebabkan pemasangan yang berlebihan. Itu adalah masalah untuk blog lain. Mari kita fokus saja pada bagaimana membangun pohon keputusan di pohon pertama. Pohon kita, yang ditunjukkan di atas, memiliki kedalaman 2.

Kami sekarang akan membangun pohon keputusan pada data yang sama tetapi menggunakan API sklearn.

Pohon Keputusan menggunakan API Sklearn

Jika Anda membaca blog saya, Anda akan tahu apa yang pertama kali kita lakukan saat mengimplementasikan pembelajaran mesin dengan python! Jika Anda sudah dapat menebaknya sekarang, ya, kami akan mengimpor perpustakaan.

import pandas as pd
import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import plot_tree
import matplotlib.pyplot as plt
%matplotlib inline

Bagus sekali! Untuk melakukan analisis apa pun, kami memerlukan data untuk melakukannya dan data yang digunakan di atas ada di GitHub saya, di mana Anda akan menemukan kode untuk hampir semua blog saya. Mari kita baca datanya:

#Reading our data
df = pd.read_csv('https://raw.githubusercontent.com/aamir09/Machine-Learning-/main/data/dtree.csv')
df.head()

Keluaran:

Sekarang setelah kita memiliki data, penting untuk memisahkan matriks desain, X dan variabel respons y. Design Matrix hanyalah nama lain untuk fitur.

#Seperate data in feature and target variable
X = df.drop(['Diabetic'],axis=1)
y = df.Diabetic

Fantastis! Kami telah melakukan pekerjaan dasar kami sampai sekarang. Sudah waktunya bagi sklearn api untuk melakukan tugasnya dan menyesuaikan pohon keputusan pada data kita. Ingatlah untuk menggunakan kedalaman maksimum pohon sebagai 2 karena kita harus membandingkan pohon ini dengan yang kita bangun dari awal.

#Creating a decision tree classifier with max-depth 2
dtree = DecisionTreeClassifier(max_depth=2)
dtree.fit(X,y)

Ini adalah momen besarnya sekarang. Kami akan merencanakan pohon kami dan melihat apakah kerja keras kami membuahkan hasil atau tidak, semoga saja. Menunggu untuk itu!!!!!

#Plotting our tree
fig,ax = plt.subplots(dpi=100,figsize=(20,5))
plot_tree(dtree,max_depth=2,feature_names=['DBP','Age'],class_names=['Non-Diabetic','Diabetic'])

Jelas kodenya didahulukan, dan kami menggunakan fungsi plot_tree dari sklearn API. Anda dapat menyesuaikan nama kolom, nama kelas, sejauh mana Anda ingin memplot pohon, dan banyak lagi. Saat yang kita tunggu telah tiba dan pohonnya terlihat seperti:

Amati titik pisahnya yang sama persis. Pengotor Gini yang disediakan di sini oleh sklearn adalah untuk node tertentu dan jika Anda menghitungnya, Anda tahu bahwa sebelum memberi bobot, kami mendapatkan hal yang sama untuk node anak. Daripada menggunakan Gini pengotor, kita juga bisa membangunnya berdasarkan entropi, yang memang lebih menghukum pengotor. Alih-alih pengotor Gini, hitung entropi, pembobotan bekerja dengan cara yang persis sama dan saat membuat objek untuk pengklasifikasi atau regressor, masukkan kriteria = 'entropi' ke dalam parameter dan itu akan berfungsi dengan baik. Perhatikan juga pada gambar di atas bahwa di setiap node jumlah sampel diberikan sebagai sampel dan jumlah setiap kategori diberikan sebagai nilai. Baca variabel nilai sebagai [hitungan 0, hitungan 1]. Variabel kelas memberikan keluaran akhir dari node dan kita mengetahui bahwa keluaran akhir dari node adalah kelas mayoritas yang ada di node tersebut.

Kode untuk pembuatan plot di atas adalah:

Jika Anda menghadapi masalah, kunjungi repositori saya, Machine Learning untuk mengetahui kodenya dan Anda akan menemukannya di file DecisionTree.ipynb.