การรวมแบบจำลองด้วยการโหวต: โหวตแบบแข็งเทียบกับแบบนุ่ม
ผู้เรียนจะรวม KNN การถดถอยลอจิสติก และต้นไม้ตัดสินใจไว้ใน VotingClassifier และเปรียบเทียบการโหวตเสียงข้างมากแบบแข็งกับการเฉลี่ยความน่าจะเป็นแบบนุ่ม
การรวมแบบจำลองด้วยการโหวต: โหวตแบบแข็งเทียบกับแบบนุ่ม เป็นบทเรียน Machine Learning Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Machine Learning Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Machine Learning Academy มีบทเรียนทั้งหมด 4 บทเรียน
ชุดแบบจำลองแบบโหวตคืออะไร
ชุดแบบจำลองแบบโหวต จะรวมการทำนายจากแบบจำลองหลายประเภทที่ แตกต่างกัน เช่น การถดถอยโลจิสติก ตัวจำแนกเพื่อนบ้านใกล้สุด และต้นไม้ตัดสินใจ เพื่อสร้างการทำนายสุดท้ายเพียงหนึ่งรายการ ต่างจากการทำแบ็กกิงที่ใช้แบบจำลองประเภทเดียวกันหลายชุด ชุดแบบจำลองแบบโหวตใช้ประโยชน์จาก ความหลากหลายของสถาปัตยกรรมแบบจำลอง เนื่องจากแบบจำลองแต่ละแบบทำข้อผิดพลาดต่างชนิดกัน การรวมแบบจำลองจึงอาจให้ผลดีกว่าสมาชิกแต่ละตัว โดยเฉพาะกับชุดข้อมูลที่ไม่มีอัลกอริทึมใดโดดเด่นเพียงตัวเดียว
การโหวตแบบแข็ง: ใช้เสียงข้างมาก
ในการ โหวตแบบแข็ง แบบจำลองแต่ละตัวจะลงคะแนนให้ป้ายกำกับคลาส และคลาสที่ได้รับคะแนนมากที่สุดจะเป็นผู้ชนะ หากแบบจำลองสามตัวทำนายเป็น [cat, cat, dog] ชุดแบบจำลองจะทำนายเป็น cat การโหวตแบบแข็งเรียบง่ายและตีความได้ง่าย แต่ถือว่าแบบจำลองทุกตัวน่าเชื่อถือเท่ากันและไม่สนใจระดับความมั่นใจ แบบจำลองที่มีความมั่นใจเพียง 51% จะลงคะแนนเหมือนกับแบบจำลองที่มีความมั่นใจ 99% ซึ่งอาจนำไปสู่การตัดสินใจที่ไม่เหมาะสมเมื่อระดับความมั่นใจของแบบจำลองแตกต่างกันมาก
from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score
X, y = load_iris(return_X_y=True)
voter = VotingClassifier(
estimators=[
('lr', LogisticRegression(max_iter=1000)),
('knn', KNeighborsClassifier()),
('dt', DecisionTreeClassifier())
],
voting='hard'
)
scores = cross_val_score(voter, X, y, cv=5)
print('Hard Voting CV:', scores.mean().round(4))การโหวตแบบนุ่ม: หาค่าเฉลี่ยความน่าจะเป็น
ในการ โหวตแบบนุ่ม แบบจำลองแต่ละตัวจะแสดง ความน่าจะเป็นของคลาสแทนป้ายกำกับแบบตายตัว ชุดแบบจำลองจะหาค่าเฉลี่ยความน่าจะเป็นจากแบบจำลองทั้งหมด แล้วเลือกคลาสที่มีความน่าจะเป็นเฉลี่ยสูงสุด ตัวอย่างเช่น หากแบบจำลองสามตัวกำหนดความน่าจะเป็นให้กับสองคลาสเป็น [0.9, 0.1], [0.7, 0.3] และ [0.6, 0.4] ค่าเฉลี่ยจะเป็น [0.73, 0.27] และคลาส 0 จะเป็นผู้ชนะ โดยทั่วไปการโหวตแบบนุ่มให้ผลดีกว่าการโหวตแบบแข็ง เพราะใช้ข้อมูลเกี่ยวกับความมั่นใจของแต่ละแบบจำลองได้ละเอียดกว่า
from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score
X, y = load_iris(return_X_y=True)
voter = VotingClassifier(
estimators=[
('lr', LogisticRegression(max_iter=1000)),
('knn', KNeighborsClassifier()),
('svc', SVC(probability=True)) # probability=True required for soft vote
],
voting='soft'
)
scores = cross_val_score(voter, X, y, cv=5)
print('Soft Voting CV:', scores.mean().round(4))ข้อกำหนด: แบบจำลองทุกตัวต้องรองรับ predict_proba
การโหวตแบบนุ่มกำหนดให้แบบจำลองทุกตัวในชุดต้องให้ค่าประมาณความน่าจะเป็นผ่าน predict_proba() ตัวจำแนกส่วนใหญ่ใน scikit-learn รองรับความสามารถนี้มาแต่แรก (การถดถอยโลจิสติก, random forest, KNN และเบย์สอย่างง่าย) อย่างไรก็ตาม SVC จะไม่แสดงความน่าจะเป็นตามค่าเริ่มต้น — คุณต้องตั้งค่า probability=True ในตัวสร้าง ซึ่งจะเพิ่มการปรับมาตราส่วนของ Platt (ขั้นตอนการปรับเทียบ) และเพิ่มเวลาฝึก หากแบบจำลองใดไม่สามารถสร้างค่าความน่าจะเป็นได้ คุณต้องเปลี่ยนไปใช้การโหวตแบบแข็ง
การกำหนดน้ำหนักให้แบบจำลองแต่ละตัว
การโหวตทั้งแบบแข็งและแบบนุ่มรองรับพารามิเตอร์ weights ซึ่งช่วยให้คุณให้อิทธิพลมากขึ้นแก่แบบจำลองที่แม่นยำกว่า ตัวอย่างเช่น หากการถดถอยโลจิสติกมีความแม่นยำ 92% และ KNN มีความแม่นยำ 85% คุณอาจกำหนดน้ำหนักเป็น [2, 1] ในการโหวตแบบแข็ง คะแนนของแต่ละแบบจำลองจะถูกนับซ้ำตามน้ำหนักของแบบจำลองนั้น ในการโหวตแบบนุ่ม เวกเตอร์ความน่าจะเป็นของแต่ละแบบจำลองจะถูกคูณด้วยน้ำหนักก่อนนำมาหาค่าเฉลี่ย การเลือกน้ำหนักโดยอิงจากความแม่นยำในการตรวจสอบข้ามส่วนเป็นวิธีที่เรียบง่ายและมีประสิทธิภาพ
from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import cross_val_score
X, y = load_breast_cancer(return_X_y=True)
voter = VotingClassifier(
estimators=[
('lr', LogisticRegression(max_iter=1000)),
('knn', KNeighborsClassifier(n_neighbors=5)),
('dt', DecisionTreeClassifier(max_depth=5))
],
voting='soft',
weights=[2, 1, 1] # Trust LR twice as much
)
print('Weighted soft vote CV:', cross_val_score(voter, X, y, cv=5).mean().round(4))การเปรียบเทียบการโหวตแบบแข็ง แบบนุ่ม และแบบจำลองแต่ละตัว
การเปรียบเทียบโดยตรงระหว่างแบบจำลองแต่ละตัว การโหวตแบบแข็ง และการโหวตแบบนุ่มบนชุดข้อมูลเดียวกัน จะแสดงผลของการรวมแบบจำลองได้อย่างชัดเจน ในกรณีส่วนใหญ่ การโหวตแบบนุ่มให้ผลดีกว่าการโหวตแบบแข็ง และทั้งสองแบบให้ผลดีกว่าแบบจำลองเดี่ยวที่อ่อนที่สุด อย่างไรก็ตาม ชุดแบบจำลองอาจไม่ได้ดีกว่าแบบจำลองเดี่ยวที่แข็งแกร่งที่สุดเสมอไป — ผลลัพธ์ขึ้นอยู่กับว่าข้อผิดพลาดของแบบจำลองมีความสัมพันธ์กันมากเพียงใด หากแบบจำลองทุกตัวล้มเหลวกับตัวอย่างเดียวกัน การรวมแบบจำลองก็ไม่ก่อให้เกิดประโยชน์
from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import cross_val_score
X, y = load_breast_cancer(return_X_y=True)
estimators = [('lr', LogisticRegression(max_iter=1000)), ('knn', KNeighborsClassifier()), ('dt', DecisionTreeClassifier())]
for name, est in estimators:
print(f'{name}: {cross_val_score(est, X, y, cv=5).mean():.4f}')
for v in ['hard', 'soft']:
vc = VotingClassifier(estimators=estimators, voting=v)
print(f'Voting ({v}): {cross_val_score(vc, X, y, cv=5).mean():.4f}')การเลือกแบบจำลองเพื่อสร้างความหลากหลาย
หัวใจสำคัญของชุดแบบจำลองแบบโหวตที่มีประสิทธิภาพคือ ความหลากหลายของแบบจำลอง การรวมการถดถอยโลจิสติกสามแบบที่ใช้ค่าเริ่มต้นสุ่มต่างกันแทบไม่เพิ่มคุณค่า เพราะแบบจำลองเหล่านั้นจะทำผิดพลาดแบบเดียวกัน ชุดแบบจำลองที่มีประสิทธิภาพสูงสุดจะจับคู่แบบจำลองที่มีอคติเชิงอุปนัยแตกต่างกัน ได้แก่ แบบจำลองเชิงเส้น (การถดถอยโลจิสติก) แบบจำลองที่อิงอินสแตนซ์ (KNN) แบบจำลองที่อิงต้นไม้ (random forest) และอาจเพิ่มแบบจำลองที่อิงเคอร์เนล (SVM) แต่ละแบบมองข้อมูลผ่านมุมมองที่แตกต่างกันและทำข้อผิดพลาดต่างกัน ซึ่งจะหักล้างกันเมื่อหาค่าเฉลี่ย
VotingRegressor สำหรับเป้าหมายต่อเนื่อง
VotingRegressor ใช้แนวคิดเดียวกันกับการถดถอย โดยหาค่าเฉลี่ยการทำนายเชิงตัวเลขจากตัวถดถอยหลายตัว การถดถอยไม่มีแนวคิดการโหวตแบบแข็งหรือแบบนุ่ม — ผลลัพธ์จะเป็นค่าเฉลี่ยแบบมีน้ำหนักหรือไม่มีน้ำหนักของการทำนายแต่ละรายการเสมอ การรวมการถดถอย Ridge (เชิงเส้น), Random Forest (ชุดแบบจำลองต้นไม้) และ SVR (วิธีที่ใช้เคอร์เนล) มักให้ผลดีกว่าแบบจำลองเดี่ยวใด ๆ บนชุดข้อมูลตารางที่หลากหลาย
from sklearn.ensemble import VotingRegressor, RandomForestRegressor
from sklearn.linear_model import Ridge
from sklearn.svm import SVR
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import cross_val_score
import numpy as np
X, y = fetch_california_housing(return_X_y=True)
vr = VotingRegressor(estimators=[
('ridge', make_pipeline(StandardScaler(), Ridge())),
('rf', RandomForestRegressor(n_estimators=50, random_state=42)),
('svr', make_pipeline(StandardScaler(), SVR()))
])
rmse = np.sqrt(-cross_val_score(vr, X, y, scoring='neg_mean_squared_error', cv=3).mean())
print('VotingRegressor RMSE:', round(rmse, 4))ชุดแบบจำลองแบบโหวตในระบบใช้งานจริง
ชุดแบบจำลองแบบโหวตติดตั้งใช้งานได้ง่าย เพราะสามารถจัดเก็บแบบจำลองสมาชิกทั้งหมดพร้อมตัวครอบ VotingClassifier โดยใช้ joblib.dump() การอนุมานต้องเรียกใช้แบบจำลองสมาชิกทุกตัว ดังนั้นเวลาแฝงในการทำนายจะเพิ่มขึ้นตามจำนวนสมาชิกแบบเชิงเส้น สำหรับแอปพลิเคชันที่ไวต่อเวลาแฝง ให้จำกัดชุดแบบจำลองไว้ที่แบบจำลองที่แข็งแกร่งและรวดเร็ว 2-3 ตัว แทนการใช้แบบจำลองที่ช้าจำนวนมาก ควรวัดเวลาอนุมานจริงเสมอเป็นส่วนหนึ่งของการประเมินการติดตั้งใช้งาน
เมื่อชุดแบบจำลองแบบโหวตไม่ช่วยให้ดีขึ้น
ชุดแบบจำลองแบบโหวตให้ผลน่าผิดหวังเมื่อ: (1) แบบจำลองสมาชิกทุกตัวมีจุดบอดเหมือนกันและทำข้อผิดพลาดที่มีความสัมพันธ์กัน (2) แบบจำลองหนึ่งมีประสิทธิภาพเหนือกว่าแบบจำลองอื่นมาก และแบบจำลองที่อ่อนกว่าฉุดประสิทธิภาพของชุดลง (3) งานมีสัญญาณรบกวนต่ำมาก จนแบบจำลองเดี่ยวที่ปรับแต่งดีอยู่แล้วทำผลงานได้เกือบสมบูรณ์แบบ หรือ (4) ชุดข้อมูลมีขนาดเล็กเกินไป และความจุของแบบจำลองที่เพิ่มขึ้นทำให้เกิดการเรียนรู้เกินเท่านั้น ให้วินิจฉัยโดยเปรียบเทียบรูปแบบข้อผิดพลาดของแบบจำลองแต่ละตัวบนชุดตรวจสอบ — หากข้อผิดพลาดมีความสัมพันธ์กันสูง ให้ลองแทนที่แบบจำลองบางตัวด้วยสถาปัตยกรรมที่หลากหลายกว่า
การซ้อนแบบจำลองเทียบกับการโหวต
การโหวตใช้การรวมผลที่กำหนดไว้ล่วงหน้าและเลือกด้วยตนเอง (การลงคะแนนเสียงข้างมากหรือการหาค่าเฉลี่ย) ส่วน การซ้อนแบบจำลอง (หรือการทำให้เป็นทั่วไปแบบซ้อน) จะก้าวไปไกลกว่านั้น โดยฝึกผู้เรียนรู้ระดับเมตาให้รวมผลลัพธ์ของแบบจำลองพื้นฐานอย่างเหมาะสมที่สุด การทำนายแบบนอกส่วนตรวจสอบของแบบจำลองพื้นฐานจะกลายเป็นคุณลักษณะนำเข้าสำหรับผู้เรียนรู้ระดับเมตา วิธีนี้เพิ่มความยืดหยุ่น — ผู้เรียนรู้ระดับเมตาสามารถเรียนรู้ว่าแบบจำลอง A เชื่อถือได้กับตัวอย่างง่าย ๆ ขณะที่แบบจำลอง B ทำได้ดีกว่ากับตัวอย่างยาก การซ้อนแบบจำลองมักให้ผลดีกว่าการโหวต แต่ต้องใช้งานอย่างระมัดระวังมากขึ้นเพื่อหลีกเลี่ยงการรั่วไหลของข้อมูล
ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจแนวคิดชุดแบบจำลองแบบโหวตจากบทเรียนนี้
สรุปบทเรียน
ในบทเรียนนี้ คุณได้เรียนรู้ว่า: ชุดแบบจำลองแบบโหวตรวมแบบจำลองหลากหลายประเภทเพื่อลดข้อผิดพลาดที่มีความสัมพันธ์กัน การโหวตแบบแข็งใช้ป้ายกำกับจากเสียงข้างมาก ขณะที่การโหวตแบบนุ่มหาค่าเฉลี่ยของค่าประมาณความน่าจะเป็น และ ความหลากหลายของแบบจำลองคือองค์ประกอบสำคัญของชุดแบบจำลองแบบโหวตที่มีประสิทธิภาพ ต่อไปเราจะสำรวจเครื่องจักรเวกเตอร์สนับสนุนและตัวจำแนกที่มีระยะขอบสูงสุด
เรียนรู้ Python ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 30
- บทเรียน
- 120
คำถามที่พบบ่อย
บทเรียน “การรวมแบบจำลองด้วยการโหวต: โหวตแบบแข็งเทียบกับแบบนุ่ม” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การรวมแบบจำลองด้วยการโหวต: โหวตแบบแข็งเทียบกับแบบนุ่ม” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Machine Learning Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Machine Learning Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การรวมแบบจำลองด้วยการโหวต: โหวตแบบแข็งเทียบกับแบบนุ่ม”
ผู้เรียนจะรวม KNN การถดถอยลอจิสติก และต้นไม้ตัดสินใจไว้ใน VotingClassifier และเปรียบเทียบการโหวตเสียงข้างมากแบบแข็งกับการเฉลี่ยความน่าจะเป็นแบบนุ่ม คุณปฏิบัติ Machine Learning Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Machine Learning Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Machine Learning Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การรวมแบบจำลองด้วยการโหวต: โหวตแบบแข็งเทียบกับแบบนุ่ม” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Machine Learning Academy นี้ได้ไหม
ได้ บทเรียน Machine Learning Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- อธิบายการรวมตัวอย่างแบบบูตสแตรป (Bagging)
- การเลือกคุณลักษณะแบบสุ่ม: เคล็ดลับของป่าสุ่ม
- ค่าคลาดเคลื่อนนอกถุง: การตรวจสอบฟรีภายในป่าสุ่ม
- การรวมแบบจำลองด้วยการโหวต: โหวตแบบแข็งเทียบกับแบบนุ่ม