Machine Learning ด้วย Python : การใช้ Ensemble Learning เพื่อประสานการทำงานของหลายโมเดล (scikit-learn)

บทความนี้เป็นบทความที่ต่อกันจากบทความที่แล้วที่ผมเขียนไว้เรื่องการสร้าง Decision Tree ครับ ถ้าใครยังไม่อ่านสามารถเข้าไปอ่านได้ที่ลิ้งค์ข้างล่างนี้เลย

Machine Learning ด้วย Python : การทำ Decision Tree เพื่อช่วยในการตัดสินในด้วย scikit-learn
สวัสดีครับทุกท่าน สำหรับบทความนี้เป็นการทำ Decision Tree ด้วย scikit-learn ครับ ซึ่งเจ้า Decision Tree…

เท้าความกันก่อนครับ ในบทความที่แล้วเราสร้าง model ขึ้นมา model นึง ซึ่งเป็นโมเดลที่ช่วยให้การตัดสินใจเป็นไปได้ง่ายขึ้น เพราะเราสามารถสร้างภาพ flow ของการตัดสินใจใดๆซักอย่างขึ้นมาได้ง่ายๆเลย

แต่จริงๆแล้วนั้น model ที่ใช้แนวคิด Decision Tree ในการ train นั้นส่วนใหญ่แล้วมีแนวโน้มที่จะ overfitted ในข้อมูลแต่ละชุดได้ ซึ่งการ overfitted นั้นเป็นหนึ่งในปัญหาที่สำคัญและมองข้ามไม่ได้

overfit คือการที่ model มีความสามารถในการประเมินข้อมูลชุดๆหนึ่งมากเกินไป จนอาจทำให้ประเมินแนวโน้มผิดพลาดได้

ในบทความนี้ผมจะพูดถึงแนวคิดนึงที่เรียกว่า Ensemble Learning และต่อยอด code เดิมจากบทความที่แล้วที่เขียนไว้ด้วยครับ


Ensemble Learning คืออะไร?

ในเมื่อการทำ model ขึ้นมาซัก model นึงอาจจะทำให้ผลมีความผิดพลาดไปบ้าง แล้วทำไมเราถึงไม่สร้างหลายๆ model ขึ้นมาแล้วให้มันมาโหวตกันว่าผลอันไหนกันแน่ที่ถูกต้องล่ะ ?

นี่คือแนวคิดคร่าวๆของ Ensemble Learning ครับ

สำหรับรูปแบบหนึ่งของ Ensemble Learning ที่มีความนิยมมากที่สุดก็คือการทำ Random Forrest ซึ่งมันคือการนำ model Decision Tree หลายๆตัวมาทำงานประสานกันเพื่อช่วยกันโหวตผลลัพท์


เขียนโปรแกรมกันดีกว่า

สำหรับโค้ดการเตรียมชุดข้อมูลผมยกมาจากบทความที่แล้ว (ที่ลิงค์ไว้ตอนต้น) นะครับ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 ก็ได้ ขึ้นกับเราครับ