Machine Learning ด้วย Python : การใช้ Ensemble Learning เพื่อประสานการทำงานของหลายโมเดล (scikit-learn)
บทความนี้เป็นบทความที่ต่อกันจากบทความที่แล้วที่ผมเขียนไว้เรื่องการสร้าง Decision Tree ครับ ถ้าใครยังไม่อ่านสามารถเข้าไปอ่านได้ที่ลิ้งค์ข้างล่างนี้เลย
![](https://nonthakon-blog.fly.dev/content/images/fit/c/160/160/0-uxjdim1ckkmuk09k.png)
เท้าความกันก่อนครับ ในบทความที่แล้วเราสร้าง model ขึ้นมา model นึง ซึ่งเป็นโมเดลที่ช่วยให้การตัดสินใจเป็นไปได้ง่ายขึ้น เพราะเราสามารถสร้างภาพ flow ของการตัดสินใจใดๆซักอย่างขึ้นมาได้ง่ายๆเลย
แต่จริงๆแล้วนั้น model ที่ใช้แนวคิด Decision Tree ในการ train นั้นส่วนใหญ่แล้วมีแนวโน้มที่จะ overfitted ในข้อมูลแต่ละชุดได้ ซึ่งการ overfitted นั้นเป็นหนึ่งในปัญหาที่สำคัญและมองข้ามไม่ได้
![](https://nonthakon-blog.fly.dev/content/images/max/800/0-xtyzyqvx-cuv5azk.png)
ในบทความนี้ผมจะพูดถึงแนวคิดนึงที่เรียกว่า Ensemble Learning และต่อยอด code เดิมจากบทความที่แล้วที่เขียนไว้ด้วยครับ
Ensemble Learning คืออะไร?
ในเมื่อการทำ model ขึ้นมาซัก model นึงอาจจะทำให้ผลมีความผิดพลาดไปบ้าง แล้วทำไมเราถึงไม่สร้างหลายๆ model ขึ้นมาแล้วให้มันมาโหวตกันว่าผลอันไหนกันแน่ที่ถูกต้องล่ะ ?
นี่คือแนวคิดคร่าวๆของ Ensemble Learning ครับ
สำหรับรูปแบบหนึ่งของ Ensemble Learning ที่มีความนิยมมากที่สุดก็คือการทำ Random Forrest ซึ่งมันคือการนำ model Decision Tree หลายๆตัวมาทำงานประสานกันเพื่อช่วยกันโหวตผลลัพท์
![](https://nonthakon-blog.fly.dev/content/images/max/800/0-eu0z9w7cgma4154b.jpg)
เขียนโปรแกรมกันดีกว่า
สำหรับโค้ดการเตรียมชุดข้อมูลผมยกมาจากบทความที่แล้ว (ที่ลิงค์ไว้ตอนต้น) นะครับimport numpy as np
import pandas as pd
from sklearn import treeinput_file = “running.csv”
df = pd.read_csv(input_file, header = 0)d = {‘Y’: 1, ’N’: 0}
df[‘go out?’] = df[‘go out?’].map(d)
df[‘is raining’] = df[‘is raining’].map(d)
df[‘is hot’] = df[‘is hot’].map(d)
df[‘sick?’] = df[‘sick?’].map(d)
df[‘work’] = df[‘work’].map(d)
df[‘stadium close’] = df[‘stadium close’].map(d)y = df[“go out?”]
X = df[[‘is raining’,
‘is hot’,
‘sick?’,
‘work’,
‘stadium close’,
‘last time go out(day)’]]
ถ้าเราอยากใช้ Random Forest แทน Decision Tree เราก็สามารถใช้ RandomForrest ที่มีใน scikit-learn ได้เลยfrom sklearn.ensemble import RandomForestClassifierclf = RandomForestClassifier(n_estimators=10)
clf = clf.fit(X, y)
ผมสร้างโมเดล RandomForrest ขึ้นมาโดยเลือกจำนวน DecisionTree เป็น 10clf.predict([[0, 1, 1, 1, 1, 2]])
การสั่งให้ model ประเมินผลก็เหมือนกับโมเดลทั่วๆไปครับ ในที่นี้ผมได้ผลลัพธ์เป็น 0 ซึ่งแปลว่าไม่
การทำ Ensemble Learning ไม่ได้จำกัดอยู่กับแค่ Decision Tree เท่านั้น แต่เราสามารถเลือกใช้ model หลายแบบมาทำงานร่วมกันได้ด้วย อาจจะผสม Neural Network ร่วมกับ Support Vector Machine หรือใช้ Logistic Regression ผสมกับ K-Nearest Neighbour ก็ได้ ขึ้นกับเราครับ