<jupyter_start><jupyter_text>Decision TreesKali ini kita akan lakukan klasifikasi dengan menggunakan algoritma DTree. Kita akan buat model dari data historis pasien. Seperti biasa, kita import library terlebih dahulu:<jupyter_code>import numpy as np 
import pandas as pd
from sklearn.tree import DecisionTreeClassifier<jupyter_output><empty_output><jupyter_text>Bayangkan kalau kita adalah peneliti dibidang medis (bayangkan saja, jangan sampai beneran, bahaya!). Kita punya data dari semua pasien yang punya penyakit yang sama namun mereka di treatmen dengan obat yang berbeda-beda. Ada yang cocok obat A, ada yang cocok obat B, obat C, dst. Tugas kita adalah buat model yang tepat supaya digunakan untuk prediksi pasien-pasien di masa depan dengan penyakit yang sama. Data2 pasien berisi umur (Age), jenis kelamin (Sex), tekanan darah (Blood Pressure), dan kolesterol (Cholesterol).Kalo data sampelnya dalam bentuk klasifikasi biner maka kita dapat dengan mudah menggunakan algoritma DT3 (decision tree) untuk prediksi kelas dari pasien di masa mendatang.Nah untuk kasus ini, kita butuh untuk download contoh dataset. Datasetnya kita ambil dari IBM Object Storage.<jupyter_code>!wget -O drug200.csv https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/ML0101ENv3/labs/drug200.csv<jupyter_output>--2020-10-19 04:45:45--  https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/ML0101ENv3/labs/drug200.csv
Resolving s3-api.us-geo.objectstorage.softlayer.net (s3-api.us-geo.objectstorage.softlayer.net)... 67.228.254.196
Connecting to s3-api.us-geo.objectstorage.softlayer.net (s3-api.us-geo.objectstorage.softlayer.net)|172.16.31.10|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 6027 (5.9K) [text/csv]
Saving to: ‘drug200.csv’

drug200.csv         100%[===================>]   5.89K  --.-KB/s    in 0s      

2020-10-19 04:45:45 (832 MB/s) - ‘drug200.csv’ saved [6027/6027]<jupyter_text>Nah sekarang kita baca data **drug200.csv** dengan dataframe pandas:<jupyter_code>my_data = pd.read_csv("drug200.csv", delimiter=",")
my_data[0:5]<jupyter_output><empty_output><jupyter_text>Pre-processingKita beri nama my_data untuk nyalin data dari drug.csv dengan 2 variabel utama  X  sebagai  Feature Matrix  dan  y  sebagai  response vector (target) . Nah berhubung kolom2 tidak semua berisi nilai numerik jadi kita harus ubah dulu ke nilai numerik, atau terpaksa kita drop/hapus.<jupyter_code>X = my_data[['Age', 'Sex', 'BP', 'Cholesterol', 'Na_to_K']].values
X[0:5]<jupyter_output><empty_output><jupyter_text>Beberapa kolom dalam dataset berisi nilai kategorial, contoh: __Sex__ dan __BP__. Sayang sekali di **Sklearn Decision Trees** gak bisa tangani variabel yang kategorial, makanya kita harus konversi nilai2 kategorial dengan __pandas.get_dummies()__.<jupyter_code>from sklearn import preprocessing
le_sex = preprocessing.LabelEncoder()
le_sex.fit(['F','M'])
X[:,1] = le_sex.transform(X[:,1]) 


le_BP = preprocessing.LabelEncoder()
le_BP.fit([ 'LOW', 'NORMAL', 'HIGH'])
X[:,2] = le_BP.transform(X[:,2])


le_Chol = preprocessing.LabelEncoder()
le_Chol.fit([ 'NORMAL', 'HIGH'])
X[:,3] = le_Chol.transform(X[:,3]) 

X[0:5]<jupyter_output><empty_output><jupyter_text>Nah sekarang kita tambahkan satu kolom dengan nama **Drug**<jupyter_code>y = my_data["Drug"]
y[0:5]<jupyter_output><empty_output><jupyter_text>--- Setting Decision TreeSeperti biasa kita mulai dengan **import**.<jupyter_code>from sklearn.model_selection import train_test_split<jupyter_output><empty_output><jupyter_text>Nah,  train_test_split  akan berisi 4 parameter. Kita beri nama:X_trainset, X_testset, y_trainset, y_testset   Train_test_split  butuh nilai parameter: X, y, test_size=0.3, and random_state=3.  Nilai X dan y bentuknya array dan dibutuhkan sebelum di-**split**.Test_size adalah rasio dari dataset testing, dan random_state untuk memastikan apakah sudah dipisahkan (**split**) dengan sama.<jupyter_code>X_trainset, X_testset, y_trainset, y_testset = train_test_split(X, y, test_size=0.3, random_state=3)<jupyter_output><empty_output><jupyter_text>ModelingPertama, kita buat *instance* dari DecisionTreeClassifier dan kita namakan drugTree.<jupyter_code>drugTree = DecisionTreeClassifier(criterion="gini", max_depth = 10)
drugTree # it shows the default parameters<jupyter_output><empty_output><jupyter_text>Selanjutnya, kita lakukan **fit data** dengan nilai training feature matrix  X_trainset  dan training response vector  y_trainset<jupyter_code>drugTree.fit(X_trainset,y_trainset)<jupyter_output><empty_output><jupyter_text>PredictionNah sekarang saatnya lakukan prediction berdasarkan testing dataset dan simpan ke predTree.<jupyter_code>predTree = drugTree.predict(X_testset)<jupyter_output><empty_output><jupyter_text>Kalau mau lihat hasil prediksi untuk dibandingkan dengan nilai asli, kita tinggal print saja predTree dan y_testset.<jupyter_code>print (predTree [0:5])
print (y_testset [0:5])<jupyter_output>['drugY' 'drugX' 'drugX' 'drugX' 'drugX']
40     drugY
51     drugX
139    drugX
197    drugX
170    drugX
Name: Drug, dtype: object<jupyter_text>EvaluationNah sekarang saatnya hitung akurasi dari model yang kita buat.<jupyter_code>from sklearn import metrics
import matplotlib.pyplot as plt
print("Akurasi dengan model DecisionTrees: ", metrics.accuracy_score(y_testset, predTree))<jupyter_output>Akurasi dengan model DecisionTrees:  0.9833333333333333<jupyter_text>Latihan Coba hitung akurasinya dengan **Jaccard Index**!<jupyter_code>#Tulis kodingmu di sini....<jupyter_output><empty_output><jupyter_text>VisualizationTerakhir, tinggal buat visualisasi dari tree-nya<jupyter_code>!apt-get -qq install -y graphviz && pip install -q pydotplus
from sklearn.externals.six import StringIO
import pydotplus
import matplotlib.image as mpimg
from sklearn import tree
%matplotlib inline 
dot_data = StringIO()
filename = "drugtree.png"
featureNames = my_data.columns[0:5]
targetNames = my_data["Drug"].unique().tolist()
out=tree.export_graphviz(drugTree,feature_names=featureNames, out_file=dot_data, class_names= np.unique(y_trainset), filled=True,  special_characters=True,rotate=False)  
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())  
graph.write_png(filename)
img = mpimg.imread(filename)
plt.figure(figsize=(10, 20))
plt.imshow(img,interpolation='nearest')<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.10517241379310345, 'fraction_numerical': 0.029153605015673982, 'mean_word_length': 6.762773722627737, 'pattern_counts': {'":': 0, '<': 58, '<?xml version=': 0, '>': 59, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 2, 'substrings_counts': 1, 'word_list_counts': {'cursed_substrings.json': 1, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '15', 'dir': 'jupyter-structured-clean-dedup', 'id': '218898', 'license': 'MIT', 'n_tokens_mistral': 2558, 'n_tokens_neox': 2358, 'n_words': 552, 'path': 'Metdat-science/Pertemuan 10/5b. Classification dengan DTree.ipynb', 'repo_name': 'nathanaeleyd/-Metodologi-Data-Science', 'size': '6382'}