Decision Tree เป็นอัลกอริทึมที่นำไปใช้หลักกับสถานการณ์การจัดประเภทข้อมูล (data classification) เป็นโครงสร้างต้นไม้ที่แต่ละโหนดแทนคุณลักษณะ (features) และแต่ละขอบ (edge) แทนการตัดสินใจ เริ่มจากโหนดราก (root node) เราจะประเมินคุณลักษณะเพื่อการจัดประเภทและตัดสินใจเดินตามขอบเฉพาะ ทุกครั้งที่ข้อมูลใหม่เข้ามา วิธีเดียวกันจะถูกนำไปใช้ซ้ำๆ และข้อสรุปสุดท้ายจะถูกทำเมื่อคุณลักษณะที่จำเป็นทั้งหมดถูกศึกษาหรือนำไปใช้กับสถานการณ์การจัดประเภท ดังนั้น Decision Tree algorithm เป็นโมดัล supervised learning ที่ใช้ในการทำนายตัวแปรตาม (dependent variable) ด้วยชุดตัวแปรฝึก (training variables)
ตัวอย่าง
เราจะใช้ข้อมูลทดสอบยา (drug test data) ที่มีอยู่ที่ Kaggle ในขั้นตอนแรก เราจะอ่านข้อมูลจากไฟล์ CSV โดยใช้ pandas และดูเนื้อหาและโครงสร้างของมัน
import pandas as pd
datainput = pd.read_csv("drug.csv", delimiter=",")
# https://www.kaggle.com/gangliu/drugsets
print(datainput)
การรันโค้ดข้างต้นให้ผลลัพธ์ดังนี้:
Age Sex BP Cholesterol Na_to_K Drug 0 23 F HIGH HIGH 25.355 drugY 1 47 M LOW HIGH 13.093 drugC 2 47 M LOW HIGH 10.114 drugC 3 28 F NORMAL HIGH 7.798 drugX 4 61 F LOW HIGH 18.043 drugY .. ... .. ... ... ... ... 195 56 F LOW HIGH 11.567 drugC 196 16 M LOW HIGH 12.006 drugC 197 52 M NORMAL HIGH 9.894 drugX [200 rows x 6 columns]
การเตรียมข้อมูล (Pre-processing)
ในขั้นตอนต่อไป เราเตรียมข้อมูลข้างต้นเพื่อรับค่าตัวเลขสำหรับค่าข้อความต่างๆ ที่เรามีในข้อมูล นี่มีประโยชน์สำหรับการฝึกและทดสอบข้อมูลตัวอย่างเกี่ยวกับการตัดสินใจใช้ยาบางชนิดสำหรับค่าที่กำหนดของอายุ เพศ BP เป็นต้น
ตัวอย่าง
import numpy as np
import pandas as pd
from sklearn.metrics import confusion_matrix
datainput = pd.read_csv("drug.csv", delimiter=",")
X = datainput[['Age', 'Sex', 'BP', 'Cholesterol', 'Na_to_K']].values
from sklearn import preprocessing
label_gender = preprocessing.LabelEncoder()
label_gender.fit(['F', 'M'])
X[:, 1] = label_gender.transform(X[:, 1])
label_BP = preprocessing.LabelEncoder()
label_BP.fit(['LOW', 'NORMAL', 'HIGH'])
X[:, 2] = label_BP.transform(X[:, 2])
label_Chol = preprocessing.LabelEncoder()
label_Chol.fit(['NORMAL', 'HIGH'])
X[:, 3] = label_Chol.transform(X[:, 3])
# พิมพ์ 6 เรคคอร์ดแรก
print(X[0:6])
การรันโค้ดข้างต้นให้ผลลัพธ์ดังนี้ -
[[23 0 0 0 25.355] [47 1 1 0 13.093] [47 1 1 0 10.113999999999999] [28 0 2 0 7.797999999999999] [61 0 1 0 18.043] [22 0 2 0 8.607000000000001]]
การแปลงตัวแปรตาม (Dependent Variable)
ต่อไป เรายังแปลงตัวแปรตามเป็นค่าตัวเลขด้วย เพื่อให้สามารถใช้ในชุดข้อมูลฝึกและชุดข้อมูลประเมินผลได้
ตัวอย่าง
import pandas as pd
datainput = pd.read_csv("drug.csv", delimiter=",")
X = datainput[['Age', 'Sex', 'BP', 'Cholesterol', 'Na_to_K']].values
y = datainput["Drug"]
print(y[0:6])
เอาต์พุต
การรันโค้ดข้างต้นให้ผลลัพธ์ดังนี้:
0 drugY 1 drugC 2 drugC 3 drugX 4 drugY 5 drugX Name: Drug, dtype: object
การฝึกข้อมูล (Training the Dataset)
ต่อไป เราใช้ 30 เปอร์เซ็นต์ของข้อมูลที่ให้มาเป็นชุดข้อมูลฝึก (training data set) นี่จะเป็นพื้นฐานสำหรับการสร้างการจัดประเภทสำหรับ 70 เปอร์เซ็นต์ที่เหลือซึ่งเราจะเรียกว่า test data
ตัวอย่าง
import pandas as pd
from sklearn.model_selection import train_test_split
datainput = pd.read_csv("drug.csv", delimiter=",")
X = datainput[['Age', 'Sex', 'BP', 'Cholesterol', 'Na_to_K']].values
y = datainput["Drug"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=3)
print(X_train.shape)
print(X_test.shape)
print(y_train.shape)
print(y_test.shape)
เอาต์พุต
การรันโค้ดข้างต้นให้ผลลัพธ์ดังนี้:
(140, 5) (60, 5) (140,) (60,)
ผลลัพธ์จากชุดข้อมูลที่ฝึกแล้ว
ต่อไป เราสามารถนำ Decision Tree ไปใช้เพื่อดูผลลัพธ์สำหรับชุดข้อมูลที่ฝึกแล้ว ที่นี่เราสร้างต้นไม้จากอินพุตที่เรามี โดยใช้เกณฑ์ (criterion) ชื่อ entropy และสุดท้ายเราคำนวณความแม่นยำของ Decision Tree
ตัวอย่าง
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn import metrics
datainput = pd.read_csv("drug.csv", delimiter=",")
X = datainput[['Age', 'Sex', 'BP', 'Cholesterol', 'Na_to_K']].values
# Data Preprocessing
from sklearn import preprocessing
label_gender = preprocessing.LabelEncoder()
label_gender.fit(['F', 'M'])
X[:, 1] = label_gender.transform(X[:, 1])
label_BP = preprocessing.LabelEncoder()
label_BP.fit(['LOW', 'NORMAL', 'HIGH'])
X[:, 2] = label_BP.transform(X[:, 2])
label_Chol = preprocessing.LabelEncoder()
label_Chol.fit(['NORMAL', 'HIGH'])
X[:, 3] = label_Chol.transform(X[:, 3])
y = datainput["Drug"]
# train_test_split
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=3)
drugTree = DecisionTreeClassifier(criterion="entropy", max_depth=4)
drugTree.fit(X_train, y_train)
predicted = drugTree.predict(X_test)
print(predicted)
print("\nDecisionTrees's Accuracy: ", metrics.accuracy_score(y_test, predicted))
เอาต์พุต
การรันโค้ดข้างต้นให้ผลลัพธ์ดังนี้:
['drugY' 'drugX' 'drugX' 'drugX' 'drugX' 'drugC' 'drugY' 'drugA' 'drugB' 'drugA' 'drugY' 'drugA' 'drugY' 'drugY' 'drugX' 'drugY' 'drugX' 'drugX' 'drugB' 'drugX' 'drugX' 'drugY' 'drugY' 'drugY' 'drugX' 'drugB' 'drugY' 'drugY' 'drugA' 'drugX' 'drugB' 'drugC' 'drugC' 'drugX' 'drugX' 'drugC' 'drugY' 'drugX' 'drugX' 'drugX' 'drugA' 'drugY' 'drugC' 'drugY' 'drugA' 'drugY' 'drugY' 'drugY' 'drugY' 'drugY' 'drugB' 'drugX' 'drugY' 'drugX' 'drugY' 'drugY' 'drugA' 'drugX' 'drugY' 'drugX'] DecisionTrees's Accuracy: 0.9833333333333333