Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

การใช้งาน Decision Tree ด้วย Python

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