6.1 วัตถุประสงค์การเรียนรู้
บทนี้เน้นการเรียนรู้การจำแนกข้อมูลในงานเหมืองข้อมูล โดยใช้ ต้นไม้ตัดสินใจ (Decision Tree) เป็นอัลกอริทึมหลัก เพราะเป็นโมเดลที่อธิบายง่าย เห็นกฎการตัดสินใจชัดเจน และเหมาะสำหรับผู้เริ่มต้นเรียน Classification
Learning Objectives
บทนี้ช่วยให้ผู้เรียนเข้าใจภาพรวมของการจำแนกข้อมูล และสามารถสร้างโมเดล Decision Tree พร้อมประเมินผลได้อย่างถูกต้อง
เมื่อเรียนจบบทนี้ ผู้เรียนควรทำได้
- อธิบายความหมายของ Classification และ Regression ได้
- อธิบาย Feature, Attribute, Label และ Target ได้
- เข้าใจกระบวนการสร้างโมเดลแบบ Supervised Learning
- แบ่งข้อมูลเป็น Training Data และ Testing Data ได้
- สร้างโมเดล Decision Tree ด้วย Python ได้
- ประเมินผลด้วย Accuracy, Precision, Recall, F1-score และ Confusion Matrix ได้
6.2 แนวคิดพื้นฐานของ Supervised Learning
Supervised Learning หรือการเรียนรู้แบบมีผู้สอน คือวิธีการเรียนรู้ของเครื่องที่ใช้ข้อมูลตัวอย่างซึ่งมีคำตอบกำกับไว้แล้ว โมเดลจะเรียนรู้ความสัมพันธ์ระหว่างข้อมูลนำเข้าและคำตอบจริง เพื่อนำไปทำนายข้อมูลใหม่ที่ยังไม่เคยเห็นมาก่อน
โมเดลเรียนรู้จากข้อมูลที่มีคำตอบกำกับไว้แล้ว จากนั้นนำโมเดลที่ฝึกได้ไปทำนายข้อมูลใหม่
ข้อมูลนำเข้า + คำตอบที่ถูกต้อง
ชุดข้อมูลต้องมีทั้ง Feature และ Label เช่น อายุ รายได้ ประวัติซื้อสินค้า และคำตอบว่า Churn หรือไม่ Churn
นำไปฝึกโมเดล
โมเดลเรียนรู้รูปแบบ ความสัมพันธ์ และเงื่อนไขที่เชื่อมโยง Feature กับ Target
โมเดลทำนายข้อมูลใหม่
เมื่อมีข้อมูลลูกค้ารายใหม่ โมเดลจะทำนายผลลัพธ์ เช่น มีแนวโน้มเลิกใช้บริการหรือไม่
คำศัพท์สำคัญ
Input / Feature
ข้อมูลนำเข้าที่ใช้ให้โมเดลเรียนรู้ เช่น อายุ รายได้ เพศ อาชีพ จำนวนครั้งที่ซื้อสินค้า
Output / Label
คำตอบจริงที่กำกับข้อมูล เช่น ผ่าน/ไม่ผ่าน ซื้อ/ไม่ซื้อ Spam/Not Spam
Target
ชื่อตัวแปรเป้าหมายที่ต้องการทำนาย เช่น Churn ส่วน Label คือค่าจริงในคอลัมน์นั้น เช่น Yes/No
Training / Testing Data
Training ใช้ฝึกโมเดล ส่วน Testing ใช้ทดสอบว่าโมเดลทำนายข้อมูลใหม่ได้ดีเพียงใด
| ตัวอย่างงาน | Feature | Target / Label |
|---|---|---|
| ทำนายลูกค้า Churn | อายุ รายได้ จำนวนครั้งที่ซื้อ ระยะเวลาสมาชิก | Churn: Yes/No |
| ทำนายความเสี่ยงสินเชื่อ | อายุ อาชีพ รายได้ รายจ่าย ประวัติชำระเงิน | Risk: ต่ำ/กลาง/สูง |
| จำแนกอีเมล Spam | คำสำคัญ ความยาวข้อความ ผู้ส่ง ลิงก์ | Spam / Not Spam |
| ทำนายผลการเรียน | เวลาเรียน คะแนนเก็บ คะแนนสอบ | ผ่าน / ไม่ผ่าน |
6.3 Classification และ Regression
Prediction คือกระบวนการทำนายผลลัพธ์ของข้อมูลใหม่ โดยแบ่งเป็น 2 ประเภทหลัก คือ Classification และ Regression
Classification ทำนายเป็นคลาสหรือประเภท ส่วน Regression ทำนายเป็นค่าตัวเลขต่อเนื่อง
| ประเภท | ผลลัพธ์ | ตัวอย่าง | อัลกอริทึมที่พบได้บ่อย |
|---|---|---|---|
| Classification | กลุ่มหรือประเภท | ผ่าน/ไม่ผ่าน, ซื้อ/ไม่ซื้อ, Spam/Not Spam | Decision Tree, KNN, SVM, Random Forest, Naive Bayes |
| Regression | ค่าตัวเลขต่อเนื่อง | ยอดขาย ราคา รายได้ อุณหภูมิ | Linear Regression, SVR, Random Forest Regressor |
งาน Classification มีการประยุกต์ใช้กว้างขวาง เช่น การจำแนกภาพ การจำแนกข้อความ การวิเคราะห์ความรู้สึก การจำแนกโรค และการตรวจจับการบุกรุกระบบคอมพิวเตอร์
6.4 กระบวนการของการจำแนกข้อมูล
การทำ Classification ควรดำเนินงานเป็นระบบ ตั้งแต่เข้าใจเป้าหมายจนถึงนำผลลัพธ์ไปใช้สนับสนุนการตัดสินใจ
Business Understanding
กำหนดปัญหาว่าต้องการจำแนกอะไร เช่น ลูกค้าที่จะยกเลิกบริการ ผู้เรียนที่เสี่ยงสอบไม่ผ่าน หรือผู้ขอกู้ที่เสี่ยง
Data Understanding
สำรวจแหล่งข้อมูล ตัวแปร Feature, Target และคุณภาพของข้อมูล
Data Preparation
ลบข้อมูลซ้ำ จัดการค่าว่าง แปลงข้อมูลข้อความเป็นตัวเลข และเลือก Feature ที่เหมาะสม
Split Data
แบ่งข้อมูลเป็น Training Data และ Testing Data เช่น 70:30 หรือ 80:20
Model Training
ฝึกโมเดล Classification เช่น Decision Tree, Random Forest, KNN หรือ SVM
Testing, Evaluation และ Recommendation
ทดสอบโมเดล ประเมินผล และแปลผลเป็นข้อเสนอแนะเชิงธุรกิจหรือเชิงวิชาการ
6.5 เทคนิคที่ใช้ในการ Classification
Classification มีหลายเทคนิค แต่ละเทคนิคมีจุดเด่นแตกต่างกัน ผู้สอนสามารถเลือกให้เหมาะกับวัตถุประสงค์ของบทเรียนและลักษณะข้อมูล
| เทคนิค | หลักการโดยย่อ | จุดเด่น |
|---|---|---|
| Decision Tree | ใช้เงื่อนไขแตกแขนงเหมือนต้นไม้ | เข้าใจง่าย อธิบายเป็นกฎได้ |
| Random Forest | รวมผลจาก Decision Tree หลายต้น | แม่นยำกว่าและลด Overfitting |
| Logistic Regression | คำนวณความน่าจะเป็นของแต่ละกลุ่ม | เหมาะกับปัญหา 2 กลุ่ม อธิบายง่าย |
| Naive Bayes | ใช้หลักความน่าจะเป็นและ Bayes' Theorem | เร็ว เหมาะกับข้อความและข้อมูลมิติสูง |
| KNN | ดูข้อมูลที่อยู่ใกล้ที่สุดจำนวน K ตัว แล้วโหวต | หลักการง่าย ไม่ต้องสร้างโมเดลซับซ้อน |
| SVM | หาเส้นแบ่งกลุ่มหรือ Hyperplane ที่ดีที่สุด | เหมาะกับข้อมูลหลายมิติ |
| Neural Network | เรียนรู้ผ่านโหนดหลายชั้น | เหมาะกับข้อมูลซับซ้อน เช่น ภาพ เสียง ข้อความ |
6.6 Decision Tree หรือต้นไม้ตัดสินใจ
Decision Tree คืออัลกอริทึมการเรียนรู้แบบมีผู้สอนที่ใช้โครงสร้างแบบต้นไม้ในการตัดสินใจ โดยเริ่มจาก Root Node แล้วแบ่งข้อมูลออกเป็นกลุ่มย่อยตามเงื่อนไขของ Feature จนได้ผลลัพธ์สุดท้ายที่ Leaf Node
Decision Tree แสดงเงื่อนไขเป็นกิ่งก้าน ทำให้ผู้เรียนเห็นเหตุผลการตัดสินใจของโมเดลได้ชัดเจน
ตัวอย่างกฎแบบ Decision Tree
- ถ้าคะแนนสอบ >= 50 → ทำนายว่า “ผ่าน”
- ถ้าคะแนนสอบ < 50 → ทำนายว่า “ไม่ผ่าน”
- ถ้ารายได้มากกว่า 30,000 บาท และประวัติชำระหนี้ดี → “อนุมัติสินเชื่อ”
- ถ้าประวัติชำระหนี้ไม่ดี → “ไม่อนุมัติสินเชื่อ”
ส่วนประกอบของ Decision Tree
Root Node
โหนดเริ่มต้นด้านบนสุด มักเป็น Feature ที่แบ่งข้อมูลได้ดีที่สุด
Internal Node
โหนดภายในที่ใช้ตั้งเงื่อนไขเพื่อตัดสินใจต่อ
Branch
เส้นกิ่งที่แสดงผลจากเงื่อนไข เช่น ใช่/ไม่ใช่ มาก/น้อย
Leaf Node
โหนดปลายทางที่ให้คำตอบหรือคลาส เช่น ผ่าน, ไม่ผ่าน, Spam, Not Spam
Entropy, Information Gain และ Gini Index
การสร้าง Decision Tree ต้องเลือก Feature ที่แบ่งข้อมูลได้ดีที่สุด โดยนิยมใช้ตัววัด เช่น Entropy, Information Gain และ Gini Index
Feature ที่ดีควรลดความปะปนของคลาส ทำให้โหนดลูกมีความบริสุทธิ์มากขึ้น
Entropy ใช้วัดความไม่แน่นอนของข้อมูลในโหนด หาก Entropy ต่ำ แปลว่าข้อมูลในโหนดนั้นมีความบริสุทธิ์สูงหรือแบ่งคลาสได้ดี
Information Gain ใช้วัดว่าเมื่อแบ่งข้อมูลด้วย Feature หนึ่งแล้ว ความไม่แน่นอนลดลงมากเพียงใด Feature ที่ให้ Information Gain สูงมักถูกเลือกใช้ก่อน
Gini Index ใช้วัดความปะปนของคลาสในโหนด ค่า Gini ต่ำแปลว่าโหนดมีความบริสุทธิ์สูง ใน scikit-learn ค่าเริ่มต้นของ DecisionTreeClassifier มักใช้ Gini เป็นเกณฑ์แบ่งข้อมูล
ข้อดีและข้อจำกัด
ข้อดี
- เข้าใจง่ายและอธิบายเป็นกฎได้
- ใช้กับข้อมูลเชิงกลุ่มและเชิงตัวเลขได้
- เหมาะกับการสอน Classification เบื้องต้น
- ช่วยให้เห็น Feature สำคัญที่ใช้ตัดสินใจ
ข้อจำกัด
- มีโอกาส Overfitting หากต้นไม้ลึกเกินไป
- ผลลัพธ์ไวต่อการเปลี่ยนแปลงของข้อมูล
- ถ้าข้อมูลน้อยหรือไม่สมดุล อาจทำนายผิดพลาด
- ควรใช้ Validation และปรับพารามิเตอร์ร่วมด้วย
6.7 การเตรียมข้อมูลสำหรับ Decision Tree
การเตรียมข้อมูลเป็นขั้นตอนสำคัญก่อนสร้างโมเดล เพราะ Decision Tree จะเรียนรู้จากข้อมูลที่เตรียมไว้ หากข้อมูลผิดพลาด โมเดลก็อาจเรียนรู้ผิดและทำนายผิดตามไปด้วย
ตรวจสอบจำนวนข้อมูล
ควรมีข้อมูลมากพอ เช่น อย่างน้อย 1,000 รายการในงานฝึกปฏิบัติ เพื่อให้การแบ่ง Train/Test มีความหมาย
ตรวจสอบ Missing Values
จัดการค่าว่างด้วยการลบ แทนค่าด้วยค่าเฉลี่ย/ฐานนิยม หรือวิธีที่เหมาะกับบริบท
ตรวจสอบ Duplicate Data
ลบข้อมูลซ้ำเพื่อลดอคติและความผิดพลาดในการฝึกโมเดล
Encoding Categorical Data
แปลงข้อมูลข้อความ เช่น เพศ รายได้ การศึกษา การทำงาน เป็นตัวเลขด้วย LabelEncoder หรือ OneHotEncoder
กำหนด X และ y
X คือ Feature ทั้งหมด ส่วน y คือ Target ที่ต้องการทำนาย เช่น Churn
แบ่ง Train/Test
ใช้ train_test_split แบ่งข้อมูล เช่น 80% สำหรับฝึก และ 20% สำหรับทดสอบ
6.8 การสร้างโมเดล Decision Tree ด้วย Python
ตัวอย่างต่อไปนี้เป็นแนวทางสร้างโมเดล Decision Tree สำหรับทำนาย Churn ของลูกค้า โดยใช้ Python, Pandas และ scikit-learn
ตัวอย่างที่ 1: สร้างชุดข้อมูลตัวอย่าง 1,000 รายการ
import pandas as pd
import numpy as np
np.random.seed(42)
data = {
'อายุ': np.random.randint(18, 65, size=1000),
'เพศ': np.random.choice(['ชาย', 'หญิง'], size=1000),
'รายได้': np.random.choice(['น้อย', 'มาก'], size=1000),
'การศึกษา': np.random.choice(['ปริญญาตรี', 'มัธยม', 'ปริญญาโท'], size=1000),
'การทำงาน': np.random.choice(['ทำงาน', 'ไม่ทำงาน'], size=1000),
'Churn': np.random.choice(['ใช่', 'ไม่'], p=[0.2, 0.8], size=1000)
}
df = pd.DataFrame(data)
df.to_excel('decision_tree_dataset_01.xlsx', index=False)
ตัวอย่างที่ 2: สร้าง Pipeline ด้วย OneHotEncoder และ DecisionTreeClassifier
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
from sklearn.pipeline import Pipeline
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
# Load dataset
df = pd.read_excel('decision_tree_dataset_01.xlsx')
# กำหนด Feature และ Target
X = df.drop('Churn', axis=1)
y = df['Churn']
cat_cols = ['เพศ', 'รายได้', 'การศึกษา', 'การทำงาน']
num_cols = ['อายุ']
preprocess = ColumnTransformer(
transformers=[
('cat', OneHotEncoder(handle_unknown='ignore'), cat_cols),
('num', 'passthrough', num_cols)
]
)
model = DecisionTreeClassifier(
max_depth=5,
random_state=42,
class_weight='balanced'
)
pipe = Pipeline(steps=[
('preprocess', preprocess),
('model', model)
])
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
pipe.fit(X_train, y_train)
y_pred = pipe.predict(X_test)
print('Accuracy:', accuracy_score(y_test, y_pred))
print('Confusion Matrix:')
print(confusion_matrix(y_test, y_pred))
print('Classification Report:')
print(classification_report(y_test, y_pred))
ตัวอย่างที่ 3: ทำนายข้อมูลใหม่ที่โมเดลยังไม่เคยเห็น
unseen_data = pd.DataFrame([
{'อายุ': 30, 'เพศ': 'ชาย', 'รายได้': 'มาก', 'การศึกษา': 'มัธยม', 'การทำงาน': 'ไม่ทำงาน'},
{'อายุ': 50, 'เพศ': 'หญิง', 'รายได้': 'น้อย', 'การศึกษา': 'มัธยม', 'การทำงาน': 'ไม่ทำงาน'},
{'อายุ': 22, 'เพศ': 'หญิง', 'รายได้': 'มาก', 'การศึกษา': 'ปริญญาโท', 'การทำงาน': 'ไม่ทำงาน'}
])
pred = pipe.predict(unseen_data)
unseen_data['ผลการทำนาย Churn'] = pred
print(unseen_data)
ตัวอย่าง Decision Tree กับข้อมูล Iris
ชุดข้อมูล Iris เป็นชุดข้อมูลยอดนิยมสำหรับทดลอง Classification เพราะมีข้อมูลดอก Iris 3 ชนิด และมี Feature เช่น sepal length, sepal width, petal length และ petal width โมเดล Decision Tree สามารถสร้างกฎ เช่น ถ้า petal width น้อยกว่าค่าหนึ่ง ให้จัดเป็น Iris setosa เป็นต้น
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier, export_text
iris = load_iris()
X = iris.data
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
clf = DecisionTreeClassifier(random_state=42)
clf.fit(X_train, y_train)
accuracy = clf.score(X_test, y_test)
print(f"Accuracy: {accuracy:.2f}")
rules = export_text(clf, feature_names=iris.feature_names)
print(rules)
ข้อควรระวังเรื่อง Accuracy 100%
ถ้าโมเดลได้ Accuracy = 1.00 หรือ 100% ควรตรวจสอบว่าเกิด Overfitting หรือไม่ โดยดูขนาดข้อมูล วิธีแบ่งข้อมูล ความซ้ำของข้อมูล และควรทดลอง Cross-validation เพื่อประเมินให้รอบคอบขึ้น
ต้องการนำ Classification ไปใช้กับข้อมูลจริง?
Siam2Dev ช่วยออกแบบชุดข้อมูล สร้างโมเดล Decision Tree / Random Forest / SVM ทำ Dashboard และรายงานผลสำหรับธุรกิจ งานวิจัย และการเรียนการสอน
6.9 การประเมินผลโมเดล Classification
หลังสร้างโมเดลแล้ว ต้องประเมินผลว่าโมเดลทำนายได้ดีเพียงใด โดยเฉพาะเมื่อข้อมูลไม่สมดุล เช่น คลาส Churn มีน้อยกว่า Non-Churn การดู Accuracy เพียงอย่างเดียวอาจทำให้เข้าใจผิดได้
Confusion Matrix ช่วยให้เห็นว่าโมเดลผิดพลาดแบบใด ไม่ควรดู Accuracy เพียงค่าเดียวโดยเฉพาะเมื่อข้อมูลไม่สมดุล
Confusion Matrix
| ค่าประเมิน | ความหมาย |
|---|---|
| True Positive (TP) | ทำนายว่าเป็นคลาสบวก และเป็นจริง |
| True Negative (TN) | ทำนายว่าเป็นคลาสลบ และเป็นจริง |
| False Positive (FP) | ทำนายว่าเป็นคลาสบวก แต่จริง ๆ ไม่ใช่ |
| False Negative (FN) | ทำนายว่าเป็นคลาสลบ แต่จริง ๆ เป็นคลาสบวก |
Precision เหมาะเมื่อสนใจว่าคำทำนายที่โมเดลบอกว่าเป็นคลาสบวกนั้นถูกมากแค่ไหน ส่วน Recall เหมาะเมื่อสนใจว่าระบบจับคลาสบวกจริงได้ครบมากแค่ไหน เช่น งานคัดกรองโรคหรือจับลูกค้า Churn มักต้องให้ความสำคัญกับ Recall
6.10 Validation และ Cross-validation
Validation คือการตรวจสอบว่าโมเดลสามารถทำนายข้อมูลใหม่ได้ดีจริง ไม่ใช่เพียงจำข้อมูลฝึกเท่านั้น
Cross-validation ช่วยลดความเอนเอียงจากการแบ่งข้อมูลเพียงครั้งเดียว และเหมาะเมื่อข้อมูลมีไม่มาก
Hold-out Method
แบ่งข้อมูลเป็น Training Data และ Testing Data หนึ่งครั้ง เช่น 80:20 หรือ 70:30
Cross-validation
แบ่งข้อมูลเป็นหลายส่วน เช่น 5-fold หรือ 10-fold แล้วสลับกันทดสอบ เพื่อให้ผลประเมินน่าเชื่อถือขึ้น
Overfitting
โมเดลเรียนรู้ข้อมูลฝึกมากเกินไป ทำนาย Training ได้ดี แต่ทำนายข้อมูลใหม่ไม่ดี
Underfitting
โมเดลง่ายเกินไป จับรูปแบบสำคัญไม่ได้ ทำให้ทำนายได้ไม่ดีทั้ง Training และ Testing
ตัวอย่าง 5-fold Cross-validation
from sklearn.model_selection import cross_val_score, KFold
from sklearn.tree import DecisionTreeClassifier
import numpy as np
X = [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10], [11, 12], [13, 14], [15, 16]]
y = [0, 0, 0, 0, 1, 1, 1, 1]
model = DecisionTreeClassifier(random_state=42, max_depth=3)
kfold = KFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_val_score(model, X, y, cv=kfold)
print("Cross-Validation Scores:", scores)
print("Average Cross-Validation Score:", np.mean(scores))
6.11 แบบฝึกหัดท้ายบท
- อธิบายความแตกต่างระหว่าง Classification และ Regression พร้อมยกตัวอย่างอย่างละ 2 ตัวอย่าง
- จากข้อมูลนักศึกษา ให้ระบุว่า Feature, Target และ Label คืออะไร
- จงอธิบายส่วนประกอบของ Decision Tree ได้แก่ Root Node, Branch และ Leaf Node
- ทำไม Decision Tree จึงเข้าใจง่ายกว่าโมเดลบางประเภท เช่น Neural Network?
- จงสร้างข้อมูลตัวอย่างอย่างน้อย 1,000 รายการ สำหรับทำนาย Churn ของลูกค้า
- ใช้ Python สร้าง DecisionTreeClassifier และรายงาน Accuracy, Confusion Matrix และ Classification Report
- ถ้าโมเดลได้ Accuracy 100% ควรตรวจสอบอะไรบ้าง?
- เปรียบเทียบ Hold-out Method กับ Cross-validation
สรุปบทเรียน
บทนี้แสดงให้เห็นว่า Classification เป็นเทคนิคสำคัญของเหมืองข้อมูลที่ใช้ทำนายผลลัพธ์เป็นกลุ่มหรือประเภท โดย Decision Tree เป็นโมเดลที่เหมาะสำหรับเริ่มต้น เพราะอธิบายง่ายและแสดงผลเป็นกฎการตัดสินใจได้ชัดเจน อย่างไรก็ตาม ผู้เรียนต้องเตรียมข้อมูลอย่างถูกต้อง ประเมินผลด้วยหลายตัวชี้วัด และระวังปัญหา Overfitting เมื่อโมเดลมีความซับซ้อนเกินไป