Machine Learning Academy · บทเรียน

ค่าคลาดเคลื่อนนอกถุง: การตรวจสอบฟรีภายในป่าสุ่ม

ผู้เรียนจะเปิดใช้ oob_score เข้าใจว่าต้นไม้แต่ละต้นเห็นข้อมูลเพียงประมาณ 63% และใช้ตัวอย่าง OOB เป็นชุดตรวจสอบที่ไม่มีอคติ

บทเรียน 3 จาก 413 ขั้นตอน

ค่าคลาดเคลื่อนนอกถุง: การตรวจสอบฟรีภายในป่าสุ่ม เป็นบทเรียน Machine Learning Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Machine Learning Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Machine Learning Academy มีบทเรียนทั้งหมด 4 บทเรียน

ความคลาดเคลื่อนนอกถุงคืออะไร

เมื่อป่าสุ่มฝึกต้นไม้แต่ละต้นด้วยตัวอย่างบูตสแตรป จะมี ตัวอย่างฝึกประมาณ 37% ที่ไม่ถูกรวมอยู่ในตัวอย่างนั้น ตัวอย่าง นอกถุง (OOB) เหล่านี้จะไม่ปรากฏให้ต้นไม้เห็นระหว่างการฝึก ดังนั้นคำทำนายของต้นไม้สำหรับตัวอย่างเหล่านี้จึงเป็นคำทำนายที่ซื่อสัตย์จากข้อมูลที่กันไว้ทดสอบ เมื่อนำคำทำนาย OOB จากต้นไม้ทั้งหมดที่ไม่ได้ใช้ตัวอย่างใดตัวอย่างหนึ่งมารวมกัน เราจะได้ค่าประมาณความคลาดเคลื่อนในการนำโมเดลไปใช้กับข้อมูลใหม่ที่แทบไม่มีอคติ — โดยไม่เสียค่าใช้จ่ายใด ๆ และไม่จำเป็นต้องแบ่งชุดตรวจสอบความถูกต้องแยกต่างหาก

วิธีคำนวณคำทำนาย OOB

สำหรับตัวอย่างฝึกแต่ละตัว x_i scikit-learn จะระบุต้นไม้ทั้งหมดที่ ไม่ได้เห็น x_i ในตัวอย่างบูตสแตรปของตน จะใช้เฉพาะต้นไม้เหล่านั้นลงคะแนนคำทำนายสำหรับ x_i คำทำนาย OOB สุดท้ายของ x_i คือคะแนนเสียงข้างมาก (การจำแนกประเภท) หรือค่าเฉลี่ย (การถดถอย) จากต้นไม้เหล่านั้น กระบวนการนี้เกิดขึ้นกับตัวอย่างฝึกทุกตัว ทำให้เราได้คำทำนาย OOB สำหรับชุดฝึกทั้งหมด เมื่อนำคำทำนายเหล่านี้ไปเปรียบเทียบกับป้ายกำกับจริง จะได้ ความคลาดเคลื่อน OOB

การเปิดใช้คะแนน OOB ใน scikit-learn

กำหนด oob_score=True เมื่อสร้าง RandomForestClassifier หรือ RandomForestRegressor หลังจากเรียกใช้ .fit() แอตทริบิวต์ oob_score_ จะเก็บค่าความแม่นยำ OOB (หรือค่า R² สำหรับการถดถอย) หากต้องการคำทำนาย OOB โดยละเอียดสำหรับแต่ละตัวอย่าง ให้เข้าถึง oob_decision_function_ (ความน่าจะเป็นของประเภท) หรือ oob_prediction_ (การถดถอย) คะแนน OOB โดยพื้นฐานแล้วคือค่าประมาณจากการตรวจสอบไขว้แบบตัดป่าสุ่มทีละหนึ่งชุด ซึ่งคำนวณได้โดยไม่เสียค่าใช้จ่ายเพิ่มเติมจากผลพลอยได้ของการฝึก

from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import cross_val_score
import numpy as np

X, y = load_breast_cancer(return_X_y=True)
rf = RandomForestClassifier(n_estimators=200, oob_score=True, random_state=42)
rf.fit(X, y)

print('OOB score:', round(rf.oob_score_, 4))
cv_score = cross_val_score(rf, X, y, cv=5).mean()
print('5-fold CV score:', round(cv_score, 4))

ความคลาดเคลื่อน OOB เทียบกับการตรวจสอบไขว้

ความคลาดเคลื่อน OOB ให้ค่าประมาณความแม่นยำจากการตรวจสอบไขว้ได้ใกล้เคียงกัน (โดยทั่วไปคลาดเคลื่อนไม่เกิน 1–2%) แต่คำนวณด้วย ต้นทุนการฝึกเพิ่มเติมเป็นศูนย์ การตรวจสอบไขว้จะฝึกโมเดลหลายครั้ง (5 หรือ 10 ครั้งสำหรับการแบ่ง 5 ส่วนหรือ 10 ส่วน) ขณะที่คะแนน OOB ใช้การฝึกเพียงครั้งเดียว ข้อแลกเปลี่ยนคือ OOB ต้องมีต้นไม้มากเพียงพอ (โดยทั่วไป 100 ต้นขึ้นไป) เพื่อให้จุดข้อมูลฝึกทุกจุดอยู่นอกถุงในต้นไม้หลายต้น หากป่าสุ่มมีต้นไม้น้อยมาก จุดข้อมูลบางจุดอาจอยู่นอกถุงในต้นไม้น้อยเกินไป ทำให้ค่าประมาณ OOB มีสัญญาณรบกวน

คะแนน OOB ในฐานะฟังก์ชันของ n_estimators

เมื่อเพิ่มค่า n_estimators คะแนน OOB จะมีเสถียรภาพมากขึ้น เมื่อมีต้นไม้น้อยมาก ตัวอย่างฝึกบางตัวอาจอยู่นอกถุงในต้นไม้เพียง 1–2 ต้น ทำให้คำทำนายรายตัวอย่างมีสัญญาณรบกวน เมื่อป่าสุ่มมีขนาดใหญ่ขึ้น แต่ละตัวอย่างจะถูกหาค่าเฉลี่ยจากต้นไม้ OOB จำนวนมากขึ้น และค่าประมาณจะลู่เข้า การพล็อตคะแนน OOB เทียบกับ n_estimators เป็นวิธีรวดเร็วในการหาจุดที่ผลตอบแทนเริ่มลดลง ซึ่งเป็นจุดที่การเพิ่มต้นไม้ไม่ช่วยปรับปรุงคะแนนอย่างมีนัยสำคัญอีกต่อไป

from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_breast_cancer

X, y = load_breast_cancer(return_X_y=True)
for n in [10, 50, 100, 200, 500]:
    rf = RandomForestClassifier(n_estimators=n, oob_score=True, random_state=42)
    rf.fit(X, y)
    print(f'n_estimators={n:4d}: OOB={rf.oob_score_:.4f}')

OOB สำหรับป่าสุ่มการถดถอย

สำหรับ RandomForestRegressor การเปิดใช้ oob_score=True จะคืนค่า คะแนน R² จากคำทำนาย OOB เป็นค่าเริ่มต้น คุณยังเข้าถึง oob_prediction_ ซึ่งเป็นค่าที่ทำนายจริงสำหรับจุดข้อมูลฝึกแต่ละจุดจากต้นไม้ OOB ของจุดนั้นได้ และคำนวณตัวชี้วัดใดก็ได้ตามต้องการ เช่น MAE หรือ RMSE วิธีนี้มีประโยชน์เมื่อ R² ไม่ใช่ตัวชี้วัดที่เหมาะสมกับปัญหาของคุณ เช่น เมื่อคุณสนใจขนาดสัมบูรณ์ของความคลาดเคลื่อน

from sklearn.ensemble import RandomForestRegressor
from sklearn.datasets import fetch_california_housing
from sklearn.metrics import mean_absolute_error
import numpy as np

X, y = fetch_california_housing(return_X_y=True)
rfr = RandomForestRegressor(n_estimators=100, oob_score=True, random_state=42)
rfr.fit(X, y)

print('OOB R²:', round(rfr.oob_score_, 4))
oob_mae = mean_absolute_error(y, rfr.oob_prediction_)
print('OOB MAE:', round(oob_mae, 4))

การใช้ OOB เพื่อปรับแต่งไฮเปอร์พารามิเตอร์

เนื่องจากการคำนวณคะแนน OOB ไม่เสียค่าใช้จ่ายเพิ่มเติม คุณจึงใช้คะแนนนี้สำรวจการตั้งค่าไฮเปอร์พารามิเตอร์ได้อย่างรวดเร็ว โดยไม่ต้องกันส่วนข้อมูลสำหรับการตรวจสอบ เพียงวนซ้ำค่าที่เป็นตัวเลือก ฝึกแบบจำลองหนึ่งครั้งต่อการกำหนดค่า แล้วเปรียบเทียบ oob_score_ วิธีนี้มีประโยชน์อย่างยิ่งสำหรับการเลือกคุณลักษณะอย่างรวดเร็ว (ลบคุณลักษณะแล้วสังเกตการเปลี่ยนแปลงของ OOB) หรือการกำหนดค่า max_features และ min_samples_leaf โปรดทราบว่า ค่าประมาณ OOB อาจมองโลกในแง่ดีเกินไปเล็กน้อยเมื่อใช้ข้อมูลที่มีมิติสูงมาก

from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_breast_cancer

X, y = load_breast_cancer(return_X_y=True)
results = []
for msl in [1, 3, 5, 10, 20]:
    rf = RandomForestClassifier(n_estimators=200, min_samples_leaf=msl, oob_score=True, random_state=42)
    rf.fit(X, y)
    results.append((msl, round(rf.oob_score_, 4)))

best = max(results, key=lambda x: x[1])
for msl, score in results:
    print(f'min_samples_leaf={msl:3d}: OOB={score}')
print('Best:', best)

ฟังก์ชันการตัดสินใจ OOB สำหรับค่าประมาณความน่าจะเป็น

หลังจากฝึกด้วย oob_score=True แล้ว แอตทริบิวต์ oob_decision_function_ จะเก็บเมทริกซ์รูปร่าง (n_samples, n_classes) ซึ่งประกอบด้วยความน่าจะเป็นของคลาสที่คำนวณจากการทำนาย OOB คุณสามารถใช้ความน่าจะเป็นเหล่านี้เพื่อวาดกราฟเส้นโค้งการปรับเทียบ เส้นโค้ง ROC หรือเส้นโค้งความแม่นยำ-การเรียกคืนบนชุดข้อมูลฝึกได้โดยตรง โดยไม่แตะต้องชุดทดสอบ วิธีนี้มีประโยชน์มากสำหรับการวินิจฉัยพฤติกรรมของแบบจำลองตั้งแต่ช่วงต้นของการพัฒนา

from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.metrics import roc_auc_score

X, y = load_breast_cancer(return_X_y=True)
rf = RandomForestClassifier(n_estimators=200, oob_score=True, random_state=42)
rf.fit(X, y)

oob_probs = rf.oob_decision_function_[:, 1]  # prob of positive class
auc = roc_auc_score(y, oob_probs)
print('OOB AUC-ROC:', round(auc, 4))

การทำให้มีข้อมูล OOB ครอบคลุมเพียงพอ

ตัวอย่างฝึกจะถูก ครอบคลุม โดยต้นไม้ OOB หากตัวอย่างนั้นถูกตัดออกจากตัวอย่างบูตสแตรปของต้นไม้ดังกล่าว ตามกฎจำนวนมาก เมื่อต้นไม้มีจำนวนเพียงพอ ตัวอย่างทุกตัวจะมีต้นไม้ OOB อยู่หลายต้น อย่างไรก็ตาม หากชุดข้อมูลมีขนาดเล็กมากและมีต้นไม้น้อย ตัวอย่างบางตัวอาจเป็น OOB ในต้นไม้เพียง 1-2 ต้นเท่านั้น ส่งผลให้การทำนายแต่ละรายการมีสัญญาณรบกวน หลักเกณฑ์โดยทั่วไปคือ ใช้ต้นไม้อย่างน้อย 100 ต้น เพื่อให้ค่าประมาณ OOB เชื่อถือได้ คุณสามารถตรวจสอบความครอบคลุมได้โดยดูว่ารายการทั้งหมดใน oob_decision_function_ มีค่าไม่เป็นศูนย์หรือไม่

ข้อผิดพลาด OOB ในกระบวนการทำงานของการเรียนรู้ของเครื่องฉบับเต็ม

ในกระบวนการทำงานของ Random Forest โดยทั่วไป: (1) ฝึกด้วยข้อมูลที่มีป้ายกำกับทั้งหมดโดยใช้ oob_score=True (2) ใช้คะแนน OOB ปรับไฮเปอร์พารามิเตอร์ผ่านการวนซ้ำอย่างรวดเร็ว (3) เมื่อพอใจกับผลลัพธ์แล้ว ให้ฝึกใหม่ด้วยไฮเปอร์พารามิเตอร์สุดท้าย โดยยังใช้ OOB เพื่อให้ได้คะแนนที่เป็นกลาง และ (4) ทำนายบนชุดทดสอบจริงที่กันไว้นอกชุดฝึกเพียงครั้งเดียว กระบวนการนี้ช่วยให้ใช้ข้อมูลฝึกได้มากที่สุด — ไม่จำเป็นต้องกันส่วนข้อมูลสำหรับการตรวจสอบ — พร้อมทั้งยังได้ค่าประมาณประสิทธิภาพที่เชื่อถือได้ระหว่างการพัฒนา

ข้อควรพิจารณาด้านหน่วยความจำและความเร็ว

การเปิดใช้การให้คะแนน OOB ทำให้ scikit-learn ต้องเก็บข้อมูลประกอบเพิ่มเติมระหว่างการฝึก ซึ่งเพิ่มการใช้หน่วยความจำเล็กน้อย สำหรับชุดข้อมูลขนาดใหญ่มาก (หลายล้านแถว) ที่มีต้นไม้จำนวนมาก ค่าใช้จ่ายส่วนนี้อาจมีนัยสำคัญ ในกรณีเช่นนี้ ให้ใช้ชุดข้อมูลขนาดเล็กที่กันไว้นอกชุดฝึก หรือส่วนข้อมูลสำหรับการตรวจสอบเพียงหนึ่งส่วนแทน นอกจากนี้ โปรดทราบว่าการทำนาย OOB มีให้ใช้เฉพาะกับตัวอย่าง ฝึก เท่านั้น — คุณยังต้องให้แบบจำลองทำนายตัวอย่างทดสอบใหม่ที่ไม่เคยเห็นมาก่อนตามปกติผ่าน .predict()

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจแนวคิดข้อผิดพลาดจากข้อมูลนอกถุงในบทเรียนนี้

สรุปบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้ว่า: ตัวอย่าง OOB คือข้อมูลฝึกประมาณ 37% ที่ถูกตัดออกจากตัวอย่างบูตสแตรปแต่ละชุด การรวมการทำนาย OOB ทำให้ได้ค่าประมาณข้อผิดพลาดในการทำให้เป็นทั่วไปที่เป็นกลางโดยไม่ต้องเสียค่าใช้จ่ายเพิ่มเติม และ สามารถใช้ oob_score_ เพื่อปรับไฮเปอร์พารามิเตอร์อย่างรวดเร็วโดยไม่ต้องมีส่วนข้อมูลสำหรับการตรวจสอบแยกต่างหาก ต่อไปเราจะสำรวจชุดแบบจำลองแบบโหวตที่รวมแบบจำลองหลายประเภทเข้าด้วยกัน

เริ่มต้นได้ฟรี

เรียนรู้ Python ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
30
บทเรียน
120

คำถามที่พบบ่อย

บทเรียน “ค่าคลาดเคลื่อนนอกถุง: การตรวจสอบฟรีภายในป่าสุ่ม” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ค่าคลาดเคลื่อนนอกถุง: การตรวจสอบฟรีภายในป่าสุ่ม” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Machine Learning Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Machine Learning Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ค่าคลาดเคลื่อนนอกถุง: การตรวจสอบฟรีภายในป่าสุ่ม”

ผู้เรียนจะเปิดใช้ oob_score เข้าใจว่าต้นไม้แต่ละต้นเห็นข้อมูลเพียงประมาณ 63% และใช้ตัวอย่าง OOB เป็นชุดตรวจสอบที่ไม่มีอคติ คุณปฏิบัติ Machine Learning Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Machine Learning Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Machine Learning Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “ค่าคลาดเคลื่อนนอกถุง: การตรวจสอบฟรีภายในป่าสุ่ม” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Machine Learning Academy นี้ได้ไหม

ได้ บทเรียน Machine Learning Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. อธิบายการรวมตัวอย่างแบบบูตสแตรป (Bagging)
  2. การเลือกคุณลักษณะแบบสุ่ม: เคล็ดลับของป่าสุ่ม
  3. ค่าคลาดเคลื่อนนอกถุง: การตรวจสอบฟรีภายในป่าสุ่ม
  4. การรวมแบบจำลองด้วยการโหวต: โหวตแบบแข็งเทียบกับแบบนุ่ม
← กลับไปที่ Machine Learning Academy