การเรียนรู้ของเครื่อง (Machine Learning)


1. ภาพรวมและประเภทของ Machine Learning
Machine Learning (ML) หรือการเรียนรู้ของเครื่องจักร คือสาขาหนึ่งของปัญญาประดิษฐ์ (AI) ที่ทำให้คอมพิวเตอร์ “เรียนรู้” จากข้อมูลได้เอง โดยไม่ต้องเขียนโปรแกรมกำหนดกฎทุกอย่างล่วงหน้า จุดต่างสำคัญจากการเขียนโปรแกรมแบบดั้งเดิมคือ โปรแกรมแบบดั้งเดิมรับ “ข้อมูล + กฎ” แล้วให้ “คำตอบ” แต่ Machine Learning รับ “ข้อมูล + คำตอบ (ตัวอย่าง)” แล้วสร้าง “กฎ” ที่เรียกว่า “โมเดล (Model)” ขึ้นมาเอง
ตัวอย่างการใช้งานใกล้ตัว เช่น ระบบกรองอีเมลขยะ ระบบแนะนำสินค้า/วิดีโอ การพยากรณ์ยอดขาย การตรวจจับใบหน้า และการแบ่งกลุ่มลูกค้าเพื่อทำการตลาด โดย ML แบ่งเป็น 3 ประเภทหลัก ดังตาราง
ประเภท | ลักษณะข้อมูล | ตัวอย่างงาน | อัลกอริทึมที่ใช้บ่อย |
Supervised Learning (แบบมีผู้สอน) | มีเฉลย (Label) กำกับทุกตัวอย่าง | ทำนายราคาบ้าน (Regression), จำแนกอีเมลขยะ (Classification) | Linear/Logistic Regression, Decision Tree, KNN |
Unsupervised Learning (แบบไม่มีผู้สอน) | ไม่มีเฉลย ให้หาโครงสร้างเอง | แบ่งกลุ่มลูกค้า, ลดมิติข้อมูล | K-Means, Hierarchical Clustering |
Reinforcement Learning (แบบเสริมกำลัง) | เรียนรู้จากการลองผิดลองถูกและรางวัล | หุ่นยนต์เดิน, AI เล่นเกม | Q-Learning |
วิธีเลือกประเภทอย่างง่าย ให้ถามว่า “ข้อมูลมีเฉลยหรือไม่” ถ้ามีเฉลยและเฉลยเป็นตัวเลขต่อเนื่อง ให้ใช้ Regression ถ้าเฉลยเป็นกลุ่ม/ประเภท ให้ใช้ Classification แต่ถ้าไม่มีเฉลยเลย ให้ใช้ Clustering
2. วงจรการพัฒนาโมเดล (CRISP-DM)
CRISP-DM (Cross-Industry Standard Process for Data Mining) เป็นกระบวนการมาตรฐาน 6 ขั้นตอน ที่ใช้พัฒนางาน ML อย่างเป็นระบบ ดังนี้
ขั้นที่ 1 Business Understanding (เข้าใจปัญหา) – กำหนดเป้าหมายให้ชัดเจน เช่น “ต้องการทำนายว่าลูกค้าคนใดมีแนวโน้มยกเลิกบริการ”
ขั้นที่ 2 Data Understanding (เข้าใจข้อมูล) – สำรวจว่ามีข้อมูลอะไรบ้าง กี่แถว กี่คอลัมน์ คุณภาพเป็นอย่างไร ด้วยการวิเคราะห์เชิงสำรวจ (EDA)
ขั้นที่ 3 Data Preparation (เตรียมข้อมูล) – ทำความสะอาด เติมค่าที่หายไป เข้ารหัสข้อมูล และปรับสเกล ขั้นนี้มักใช้เวลามากที่สุด (60–80% ของงาน)
ขั้นที่ 4 Modeling (สร้างโมเดล) – เลือกอัลกอริทึมที่เหมาะสมและฝึก (Fit) โมเดลด้วยข้อมูล Train
ขั้นที่ 5 Evaluation (ประเมินผล) – วัดผลด้วยตัวชี้วัด เช่น Accuracy, F1 เพื่อตัดสินว่าโมเดลดีพอสำหรับใช้งานจริงหรือไม่
ขั้นที่ 6 Deployment (นำไปใช้งาน) – นำโมเดลไปใช้งานจริงและติดตามผลอย่างต่อเนื่อง
ข้อสังเกต: CRISP-DM เป็น “วงจร” ไม่ใช่เส้นตรง หากประเมินแล้วผลไม่ดี สามารถวนกลับไปปรับปรุงขั้นก่อนหน้า เช่น เตรียมข้อมูลใหม่หรือเปลี่ยนอัลกอริทึมได้
3. การเตรียมข้อมูล (Data Preparation) ทีละขั้นตอน
คุณภาพของโมเดลขึ้นอยู่กับคุณภาพของข้อมูลโดยตรง (Garbage in, garbage out) การเตรียมข้อมูลจึงมี 4 ขั้นตอนหลัก ดังนี้
3.1 การจัดการค่าที่หายไป (Missing Value)
ขั้นแรกให้ตรวจนับค่าว่างในแต่ละคอลัมน์ก่อน จากนั้นเลือกวิธีจัดการ 1 ใน 3 วิธี คือ (1) ลบแถวทิ้ง เมื่อค่าที่หายมีจำนวนน้อยมาก (2) เติมค่าเฉลี่ยหรือมัธยฐาน สำหรับข้อมูลตัวเลข (3) เติมฐานนิยม (ค่าที่พบบ่อยที่สุด) สำหรับข้อมูลประเภทข้อความ
3.2 การจัดการค่าผิดปกติ (Outlier) ด้วยวิธี IQR
คำนวณ IQR = Q3 − Q1 แล้วกำหนดขอบเขตปกติเป็น [Q1 − 1.5×IQR, Q3 + 1.5×IQR] ค่าที่อยู่นอกขอบเขตนี้ถือเป็น Outlier ตัวอย่าง: ถ้า Q1 = 10 และ Q3 = 20 จะได้ IQR = 10 ขอบเขตปกติคือ −5 ถึง 35 ดังนั้นค่า 80 จึงเป็น Outlier ที่ควรตรวจสอบหรือตัดทิ้ง
3.3 การเข้ารหัสตัวแปรเชิงคุณภาพ (Encoding)
คอมพิวเตอร์คำนวณได้เฉพาะตัวเลข จึงต้องแปลงข้อความเป็นตัวเลขก่อน มี 2 วิธีหลัก คือ Label Encoding แทนค่าด้วยเลขลำดับ (เช่น เล็ก=0 กลาง=1 ใหญ่=2 เหมาะกับข้อมูลที่มีลำดับ) และ One-Hot Encoding สร้างคอลัมน์ใหม่เป็น 0/1 ต่อหนึ่งค่า (เหมาะกับข้อมูลไม่มีลำดับ เช่น สี จังหวัด)
3.4 การปรับสเกลข้อมูล (Feature Scaling)
ใช้เมื่อคุณลักษณะมีหน่วยต่างกันมาก เช่น อายุ (0–100) กับรายได้ (0–100,000) มี 2 สูตรหลัก คือ Min-Max Normalization: x' = (x − min) / (max − min) ให้ค่าอยู่ในช่วง 0–1 และ Z-score Standardization: z = (x − μ) / σ ให้ค่าเฉลี่ยเป็น 0 ส่วนเบี่ยงเบนมาตรฐานเป็น 1 ตัวอย่าง: คะแนน 75 เมื่อค่าเฉลี่ย = 60 และ σ = 10 จะได้ z = (75 − 60) / 10 = 1.5
ข้อควรระวัง: ต้องแบ่งข้อมูล Train/Test ก่อน แล้วจึง Fit Scaler กับข้อมูล Train เท่านั้น มิฉะนั้นข้อมูลของชุดทดสอบจะรั่วเข้าไปในการฝึก (Data Leakage) ทำให้ผลประเมินดีเกินจริง
4. อัลกอริทึม Supervised Learning
อัลกอริทึมพื้นฐานที่ควรรู้จักและหลักการทำงานโดยย่อ แสดงดังตาราง
อัลกอริทึม | หลักการทำงานโดยย่อ | เหมาะกับงาน |
Linear Regression | ลากเส้นตรง y = a + bx ให้พอดีกับข้อมูลมากที่สุด | ทำนายค่าต่อเนื่อง เช่น ราคา ยอดขาย |
Logistic Regression | คำนวณความน่าจะเป็นด้วยฟังก์ชัน Sigmoid (ค่า 0–1) | จำแนก 2 กลุ่ม เช่น ผ่าน/ไม่ผ่าน |
Decision Tree | สร้างกฎ “ถ้า–แล้ว” เป็นลำดับชั้นเหมือนกิ่งต้นไม้ | งานจำแนกที่ต้องอธิบายเหตุผลได้ง่าย |
K-Nearest Neighbors (KNN) | ดูเพื่อนบ้านที่ใกล้ที่สุด K ตัว แล้วโหวตเสียงข้างมาก | ข้อมูลขนาดเล็ก (ต้องปรับสเกลก่อนเสมอ) |
4.1 ตัวชี้วัดงานจำแนกประเภท (Classification Metrics)
การประเมินเริ่มจากตารางความสับสน (Confusion Matrix) ซึ่งเปรียบเทียบค่าจริงกับค่าที่โมเดลทำนาย
| ทำนาย: Positive | ทำนาย: Negative |
ค่าจริง: Positive | TP (ถูก) | FN (ผิด) |
ค่าจริง: Negative | FP (ผิด) | TN (ถูก) |
• Accuracy (ความถูกต้องรวม) = (TP + TN) / จำนวนทั้งหมด
• Precision (ความแม่นยำ) = TP / (TP + FP) — ที่ทำนายว่า Positive ถูกจริงกี่ส่วน
• Recall (ความครบถ้วน) = TP / (TP + FN) — ของจริงที่เป็น Positive จับได้กี่ส่วน
• F1-Score = 2 × (Precision × Recall) / (Precision + Recall) — ค่าเฉลี่ยประสานของทั้งสอง
ตัวอย่างการคำนวณ: จากข้อมูลทดสอบ 100 ตัวอย่าง ได้ TP = 40, FN = 5, FP = 10, TN = 45 จะได้ Accuracy = (40 + 45) / 100 = 0.85, Precision = 40 / 50 = 0.80, Recall = 40 / 45 ≈ 0.89 และ F1 = 2(0.80)(0.89) / (0.80 + 0.89) ≈ 0.84
4.2 ตัวชี้วัดงานทำนายค่าต่อเนื่อง (Regression Metrics)
MAE (Mean Absolute Error) คือค่าเฉลี่ยของ |ค่าจริง − ค่าทำนาย| ส่วน RMSE (Root Mean Squared Error) คือรากที่สองของค่าเฉลี่ยความคลาดเคลื่อนกำลังสอง ซึ่งลงโทษความคลาดเคลื่อนขนาดใหญ่มากกว่า MAE ทั้งสองค่ายิ่งต่ำยิ่งดี
4.3 ตัวอย่างโค้ดฝึกโมเดลจำแนกดอกไอริส
5. อัลกอริทึม Unsupervised Learning
5.1 K-Means Clustering
K-Means แบ่งข้อมูลออกเป็น K กลุ่มโดยพยายามให้ผลรวมระยะห่างภายในกลุ่ม (WCSS) ต่ำที่สุด มีขั้นตอนการทำงาน 4 ขั้น คือ
ขั้นที่ 1 สุ่มตำแหน่งจุดศูนย์กลาง (Centroid) จำนวน K จุด
ขั้นที่ 2 จัดข้อมูลแต่ละจุดเข้ากลุ่มของ Centroid ที่อยู่ใกล้ที่สุด
ขั้นที่ 3 คำนวณ Centroid ใหม่จากค่าเฉลี่ยของสมาชิกในกลุ่ม
ขั้นที่ 4 ทำซ้ำขั้นที่ 2–3 จนกว่า Centroid จะไม่เปลี่ยนตำแหน่ง
5.2 การเลือกจำนวนกลุ่ม K ที่เหมาะสม
ใช้ Elbow Method โดยพล็อตค่า WCSS เทียบกับค่า K = 1, 2, 3, ... แล้วเลือกจุดที่กราฟเริ่มหักลดลงช้า (จุดข้อศอก) หรือใช้ Silhouette Score (ช่วง −1 ถึง 1 ยิ่งใกล้ 1 กลุ่มยิ่งแยกจากกันชัด)
5.3 Hierarchical Clustering
สร้างกลุ่มแบบลำดับชั้นโดยรวมกลุ่มที่ใกล้กันทีละคู่ แล้วแสดงผลเป็นแผนภาพต้นไม้ (Dendrogram) ผู้ใช้เลือกจำนวนกลุ่มได้โดย “ตัด” ต้นไม้ที่ระดับความสูงที่ต้องการ
6. การประเมินและปรับจูนโมเดล
6.1 การแบ่งข้อมูล
แบ่งข้อมูลเป็น 3 ส่วน คือ Train (ใช้สอนโมเดล) Validation (ใช้ปรับจูน) และ Test (ใช้สอบจริง ใช้ครั้งเดียวตอนท้าย) ด้วยอัตราส่วน 70:15:15 หรือ 60:20:20 ถ้าข้อมูลน้อยอาจแบ่งเพียง Train/Test 80:20 แล้วใช้ Cross Validation แทน Validation
6.2 Overfitting และ Underfitting
อาการ | คะแนน Train | คะแนน Test | วิธีแก้ |
Underfitting (โมเดลง่ายเกินไป) | ต่ำ | ต่ำ | เพิ่มความซับซ้อนของโมเดล เพิ่มคุณลักษณะ |
Overfitting (จำข้อสอบ) | สูงมาก | ต่ำกว่ามาก | ลดความซับซ้อน เพิ่มข้อมูล ใช้ Cross Validation |
พอดี (Good Fit) | ดี | ใกล้เคียง Train | — |
6.3 k-fold Cross Validation
แบ่งข้อมูลเป็น k ส่วนเท่า ๆ กัน (นิยม k = 5 หรือ 10) แล้วผลัดกันใช้ 1 ส่วนเป็นชุดทดสอบ อีก k−1 ส่วนเป็นชุดฝึก ทำครบ k รอบแล้วเฉลี่ยผล วิธีนี้ให้ผลน่าเชื่อถือกว่าการแบ่งครั้งเดียว เพราะทุกตัวอย่างได้เป็นชุดทดสอบ 1 ครั้ง
6.4 การปรับจูนไฮเปอร์พารามิเตอร์ (Hyperparameter Tuning)
import pandas as pd
df = pd.read_csv('data.csv')
print(df.isnull().sum()) # นับค่าว่างแต่ละคอลัมน์
df = df.dropna() # วิธีที่ 1: ลบแถวที่มีค่าว่าง
df['age'] = df['age'].fillna(df['age'].mean()) # วิธีที่ 2: เติมค่าเฉลี่ย
Q1 = df['income'].quantile(0.25)
Q3 = df['income'].quantile(0.75)
IQR = Q3 - Q1
df = df[(df['income'] >= Q1 - 1.5*IQR) & (df['income'] <= Q3 + 1.5*IQR)]
df = pd.get_dummies(df, columns=['color']) # One-Hot Encodingfrom sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train_s = scaler.fit_transform(X_train) # fit กับ Train เท่านั้น
X_test_s = scaler.transform(X_test) # Test ใช้ transform อย่างเดียวfrom sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y)
model = DecisionTreeClassifier(max_depth=3, random_state=42)
model.fit(X_train, y_train) # ฝึกโมเดล
y_pred = model.predict(X_test) # ทำนายข้อมูลทดสอบ
print('Accuracy =', accuracy_score(y_test, y_pred))
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
wcss = []
for k in range(1, 11):
km = KMeans(n_clusters=k, random_state=42, n_init=10)
km.fit(X)
wcss.append(km.inertia_) # inertia_ คือค่า WCSS
plt.plot(range(1, 11), wcss, marker='o')
plt.xlabel('K'); plt.ylabel('WCSS'); plt.show()
from sklearn.model_selection import cross_val_score, GridSearchCV
scores = cross_val_score(model, X, y, cv=5)
print('mean =', scores.mean(), ' std =', scores.std())
param_grid = {'max_depth': [2, 3, 4, 5], 'min_samples_leaf': [1, 2, 4]}
grid = GridSearchCV(DecisionTreeClassifier(random_state=42),
param_grid, cv=5)
grid.fit(X_train, y_train)
print(grid.best_params_, grid.best_score_)