ข้ามไปยังเนื้อหาหลัก

การปรับจูนไฮเปอร์พารามิเตอร์: วิธีการ แนวทางปฏิบัติที่ดี และตัวอย่าง

คู่มือเชิงปฏิบัติสำหรับการปรับจูนไฮเปอร์พารามิเตอร์ ครอบคลุมวิธีทำงาน วิธีค้นหาหลัก (กริด สุ่ม เบย์เซียน) กลยุทธ์ประเมินผล และวิธีรันใน Python และ R
อัปเดตแล้ว 28 ก.ค. 2569  · 15 นาที อ่าน

สำรวจด้วย AI

เปิดใน ChatGPTเปิดใน Claudeเปิดใน Perplexity

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

หลายคนเทรนโมเดลด้วยค่าตั้งต้น เห็นความแม่นยำอยู่ราว ๆ 80% แล้วสรุปว่าอัลกอริทึมไม่เหมาะกับงาน แต่ความจริงปัญหาไม่ใช่อัลกอริทึม โมเดล ML ทุกตัวมีพารามิเตอร์ที่คุมวิธีการเรียนรู้ ซึ่งถูกกำหนดก่อนเริ่มเทรน ถ้าตั้งได้ถูกต้อง ความแม่นยำอาจเพิ่มได้อีก 10–20% โดยใช้โมเดลและข้อมูลชุดเดิม

พารามิเตอร์เหล่านี้เรียกว่าไฮเปอร์พารามิเตอร์ การเลือกให้เหมาะจะทำให้โมเดลที่ “พอใช้” กลายเป็นโมเดลที่ “ตอบได้แม่น” การปรับจูนไฮเปอร์พารามิเตอร์คือกระบวนการค้นหาชุดค่าที่ให้ประสิทธิภาพดีที่สุด

บทความนี้จะพาไปดูว่าไฮเปอร์พารามิเตอร์ทูนิงคืออะไร กลยุทธ์การค้นหาที่ใช้ได้ผล วิธีประเมินผลโดยไม่หลอกตัวเอง และวิธีรันทั้งหมดใน Python และ R

หากเพิ่งเริ่มด้านดาต้าไซเอนซ์และแมชชีนเลิร์นนิง แนะนำเรียนคอร์ส พื้นฐานแมชชีนเลิร์นนิงด้วย Python ก่อนลงหัวข้อที่ซับซ้อนยิ่งขึ้น

ไฮเปอร์พารามิเตอร์ทูนิงคืออะไร?

การปรับจูนไฮเปอร์พารามิเตอร์คือการค้นหาค่าตั้งที่ทำให้โมเดลเรียนรู้ได้ดีที่สุด

โมเดล ML มีตัวเลขอยู่สองประเภท บางอย่างเรียนรู้จากข้อมูลระหว่างการเทรน เช่น เวตในโครงข่ายประสาทหรือจุดแบ่งในต้นไม้ตัดสินใจ อีกส่วนถูกกำหนดก่อนเริ่มเทรน นั่นคือไฮเปอร์พารามิเตอร์ ซึ่งคุมวิธีที่โมเดลเรียนรู้—เร็วแค่ไหน ลึกแค่ไหน ควรทวนจำหรือตีความให้กว้างเพียงใด

ค่าตั้งต้นของไฮเปอร์พารามิเตอร์มีไว้ให้โมเดลรันได้ ไม่ได้ออกแบบมาเพื่อให้ดีที่สุดกับชุดข้อมูลของคุณ อัตราการเรียนรู้ที่เหมาะกับ image classification มักใช้กับข้อมูลตารางได้ไม่ดี ความลึกของต้นไม้แบบตั้งต้นที่พอเหมาะกับข้อมูลสะอาดอาจโอเวอร์ฟิตเมื่อข้อมูลมีสัญญาณรบกวน เข้าใจตรงกันนะ

กระบวนการปรับจูนจะค้นหาชุดค่าของไฮเปอร์พารามิเตอร์หลายแบบ เทรนโมเดลในแต่ละชุด แล้วเก็บชุดที่ทำได้ดีที่สุดบนข้อมูลวาลิเดชันไว้ 

ผลลัพธ์ที่ได้มักดีกว่าการเปลี่ยนไปใช้อัลกอริทึมที่ “ดีกว่า” แต่ไม่ได้ปรับจูน

ไฮเปอร์พารามิเตอร์ vs พารามิเตอร์ของโมเดล

ต่างกันที่ “ใคร” เป็นคนตั้งค่าและ “เมื่อไหร่” ตั้ง

พารามิเตอร์ของโมเดล ถูกอัลกอริทึมเรียนรู้ระหว่างการเทรน คุณไม่ต้องตั้งเอง กระบวนการเทรนจะปรับโดยอาศัยข้อมูลและการมินิไมซ์ฟังก์ชันสูญเสีย ตัวอย่างเช่น:

  • เวตและไบแอสในโครงข่ายประสาท
  • ค่าสัมประสิทธิ์ในรีเกรสชันเชิงเส้น
  • เกณฑ์การแยกในต้นไม้ตัดสินใจ
  • ซัพพอร์ตเวกเตอร์ใน SVM

ไฮเปอร์พารามิเตอร์ ตั้งโดยคุณก่อนเริ่มเทรน ควบคุมกลไกการเรียนรู้ แต่ตัวอัลกอริทึมจะไม่แก้ไขให้เอง หากไม่ตั้ง ไลบรารีจะใช้ค่าตั้งต้น ตัวอย่างเช่น:

  • อัตราการเรียนรู้ในเกรเดียนต์ดีเซนต์
  • จำนวนต้นไม้ในแรนดอมฟอเรสต์
  • ความแรงของรีกูลาไรเซชันในโลจิสติกรีเกรสชัน
  • ชนิดเคอร์เนลใน SVM

สรุปเทียบกันแบบเคียงข้างกัน:

  พารามิเตอร์ของโมเดล ไฮเปอร์พารามิเตอร์
ผู้ตั้งค่า อัลกอริทึมระหว่างเทรน คุณ
ตั้งเมื่อ ระหว่างการเทรน ก่อนการเทรน
เรียนรู้จากข้อมูล ใช่ ไม่ใช่
ตัวอย่าง เวต ค่าสัมประสิทธิ์ จุดแบ่ง อัตราการเรียนรู้ ความลึกของต้นไม้ ความแรงรีกูลาไรเซชัน
เปลี่ยนทุกครั้งที่รันใหม่ ทุกครั้งที่รีเทรน เฉพาะเมื่อคุณเปลี่ยนเอง

พารามิเตอร์ของโมเดลตอบว่าโมเดล “เรียนรู้อะไร” ไฮเปอร์พารามิเตอร์ตอบว่าโมเดล “เรียนรู้อย่างไร”

การทำงานของการปรับจูนไฮเปอร์พารามิเตอร์

การปรับจูนเป็นลูป

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

ลูปมีหน้าตาแบบนี้:

  1. เลือกไฮเปอร์พารามิเตอร์ ที่จะจูนและตั้งช่วงค่าของแต่ละตัว
  2. เทรนโมเดล ด้วยชุดค่าที่กำหนด
  3. ประเมินประสิทธิภาพ บนชุดวาลิเดชันด้วยเมตริกที่ตรงกับงาน
  4. อัปเดตไฮเปอร์พารามิเตอร์ ตามสิ่งที่เรียนรู้—จะเดินไปชุดถัดไปในลิสต์ที่เตรียมไว้ หรือใช้ผลล่าสุดชี้นำการเลือกครั้งต่อไป
  5. ทำซ้ำ จนกว่าประสิทธิภาพจะไม่ดีขึ้นต่อ หรือทรัพยากรคอมพิวต์หมด

วิธีอัปเดตระหว่างรอบคือสิ่งที่ทำให้แต่ละวิธีค้นหาแตกต่างกัน การจูนด้วยมือใช้สัญชาตญาณ กริดเสิร์ชไล่ตามลิสต์ที่กำหนดไว้ วิธีแบบเบย์เซียนจะสร้างโมเดลคาดการณ์ว่าชุดค่าไหนน่าจะเวิร์ก

ต่อไปมาดูวิธีเหล่านี้อย่างละเอียด

วิธีค้นหาไฮเปอร์พารามิเตอร์

วิธีค้นหาที่เลือกจะกำหนดทั้งปริมาณคอมพิวต์ที่ใช้ และโอกาสในการเจอค่าที่ดี

การค้นหาด้วยมือ

วิธีที่ง่ายที่สุด เลือกชุดค่า เทรน ดูผล แล้วปรับตามที่เห็น

ใช้ได้เมื่อโมเดลเล็ก ไฮเปอร์พารามิเตอร์ไม่กี่ตัว และมีประสบการณ์กับอัลกอริทึมนั้นอยู่แล้ว หากรู้ว่า XGBoost มักชอบอัตราการเรียนรู้ราว 0.05 และความลึกของต้นไม้ 6 ก็เริ่มตรงนั้นแล้วปรับตามที่สังเกต

แต่จะใช้ไม่ได้เมื่อพื้นที่ค้นหาใหญ่ขึ้น ไฮเปอร์พารามิเตอร์ 3 ตัว แต่ละตัวมีค่าเหมาะสม 5 ค่า ก็ได้ 125 ชุดแล้ว ไม่มีใครมานั่งจูนทีละชุดขนาดนั้น

กริดเสิร์ช

กริดเสิร์ชตรวจทุกชุดค่าจากลิสต์ที่กำหนดไว้ล่วงหน้า

คุณกำหนดกริด—เช่น อัตราการเรียนรู้ [0.01, 0.05, 0.1] และความลึกของต้นไม้ [3, 5, 7] แล้วกริดเสิร์ชจะเทรนโมเดลทั้ง 9 ชุดที่เป็นไปได้ วิธีนี้ครบถ้วนและทำซ้ำได้

ปัญหาคือค่าใช้จ่ายด้านคอมพิวต์ 

เพิ่มไฮเปอร์พารามิเตอร์อีกหนึ่งตัวที่มี 5 ค่า จำนวนการเทรนจะคูณห้า กริดเสิร์ชยังสิ้นเปลืองกับค่าที่ไม่ค่อยมีผล—ถ้าความลึกของต้นไม้แทบไม่กระทบสกอร์ ก็ยังต้องเทรนทุกรายการที่ระบุไว้

กริดเสิร์ชเป็นตัวเลือกเริ่มต้นที่ดีเมื่อมีไฮเปอร์พารามิเตอร์เพียง 2–3 ตัว

การสุ่มค้นหา

การสุ่มค้นหาจะสุ่มชุดค่าจากช่วงที่กำหนด แทนการไล่ตามกริดตายตัว

คุณกำหนดการแจกแจงสำหรับแต่ละไฮเปอร์พารามิเตอร์ แล้วการสุ่มค้นหาจะสุ่มชุดค่าจากการแจกแจงเหล่านั้น มีประสิทธิภาพกว่ากริดเสิร์ชเพราะไม่เสียรันกับค่าที่ไม่สำคัญ—ถ้ามีเพียง 1 ใน 3 ไฮเปอร์พารามิเตอร์ที่ส่งผลต่อประสิทธิภาพ การสุ่มค้นหาจะยังสำรวจค่าของตัวสำคัญได้กว้าง

กริดเสิร์ชกับการสุ่มค้นหา

กริดเสิร์ชกับการสุ่มค้นหา

การสุ่มค้นหาเป็นค่าเริ่มต้นที่ดีกว่าสำหรับกรณีที่มีไฮเปอร์พารามิเตอร์มากกว่าสองตัว

การเพิ่มประสิทธิภาพแบบเบย์เซียน

วิธีเบย์เซียนใช้ผลลัพธ์จากรอบก่อน ๆ เพื่อตัดสินใจว่าจะลองชุดใดต่อไป

มันสร้างโมเดลเชิงความน่าจะเป็นที่แมปชุดไฮเปอร์พารามิเตอร์กับประสิทธิภาพ แล้วเลือกชุดถัดไปที่คาดว่าคะแนนจะสูงสุดหรือมีความไม่แน่นอนสูงสุด นี่คือการแลกเปลี่ยนระหว่างสำรวจ (exploration) กับใช้ประโยชน์ (exploitation) กล่าวคือสำรวจพื้นที่ใหม่ที่อาจดี หรือขุดลึกในพื้นที่ที่รู้ว่าดีแล้ว

วิธีเบย์เซียนหาค่าดี ๆ ได้ในจำนวนรอบที่น้อยกว่าการสุ่มหรือกริดเสิร์ช ข้อแลกเปลี่ยนคือแต่ละรอบจะช้ากว่าเล็กน้อยเพราะต้องฟิตโมเดลภายในก่อนเลือกจุดถัดไป ไลบรารีอย่าง Optuna และ Hyperopt ช่วยจัดการให้

ใช้การเพิ่มประสิทธิภาพแบบเบย์เซียนเมื่อการเทรนมีต้นทุนสูงและมีงบประมาณรอบทดลองจำกัด

Successive halving และ Hyperband

สองวิธีนี้ลดเวลาคอมพิวต์โดยหยุดรันที่แย่ตั้งแต่เนิ่น ๆ

Successive halving เริ่มด้วยชุดค่าจำนวนมากพร้อมงบเทรนน้อย ตัดครึ่งที่แย่ที่สุดออก เพิ่มงบให้ผู้รอด แล้วทำซ้ำ 

Hyperband เป็นตัวครอบ successive halving ที่รันหลายครั้งด้วยสัดส่วนงบต่างกัน จึงไม่ต้องเดาค่าตั้งต้นเอง

ทั้งสองวิธีเหมาะเมื่อเทรนช้าและพื้นที่ค้นหากว้าง ทำงานได้ดีเมื่อประสิทธิภาพช่วงแรกเป็นสัญญาณที่พอทำนายผลสุดท้ายได้ ซึ่งมักเป็นจริงสำหรับโครงข่ายประสาทและกราเดียนต์บูสติง

สรุปเปรียบเทียบวิธีต่าง ๆ ดังนี้:

  ต้นทุนคอมพิวต์ ประสิทธิภาพการค้นหา เหมาะสำหรับ
การค้นหาด้วยมือ ต่ำ ต่ำ โมเดลเล็ก มีประสบการณ์ล่วงหน้า
กริดเสิร์ช สูง ต่ำ 2–3 ไฮเปอร์พารามิเตอร์ ช่วงแคบ
การสุ่มค้นหา ปานกลาง ปานกลาง 4+ ไฮเปอร์พารามิเตอร์ ความสำคัญไม่ชัดเจน
การเพิ่มประสิทธิภาพแบบเบย์เซียน ปานกลาง สูง การเทรนมีต้นทุนสูง งบจำกัด
Successive halving / Hyperband ต่ำถึงปานกลาง สูง พื้นที่ค้นหากว้าง การเทรนช้า

การประเมินประสิทธิภาพของไฮเปอร์พารามิเตอร์

การจูนจะไปได้ไม่ไกลหากไม่กำหนดช่วงค่าที่ถูกต้อง

หากการประเมินคลาดเคลื่อน จะเลือกไฮเปอร์พารามิเตอร์ผิด มีสี่เรื่องที่ต้องทำให้ถูกต้อง—วิธีแบ่งข้อมูล วิธีวัดผล เมตริกที่ใช้ปรับให้เหมาะสม และการกันชุดทดสอบให้สะอาด

การแบ่งชุดเทรน วาลิเดชัน และเทสต์

แบ่งข้อมูลออกเป็นสามส่วนก่อนเริ่มจูน

ชุดเทรนใช้ให้โมเดลเรียนรู้ ชุดวาลิเดชันใช้ให้คะแนนแต่ละชุดไฮเปอร์พารามิเตอร์ระหว่างการจูน ชุดทดสอบใช้ครั้งเดียวท้ายสุดเพื่อวัดประสิทธิภาพโมเดลบนข้อมูลที่ไม่เคยเห็น

หากจูนกับชุดทดสอบ คุณจะได้ตัวเลขความแม่นยำที่ดูดี แต่โมเดลจะทำงานต่ำกว่าคาดในโปรดักชัน ทุกการตัดสินใจที่อิงกับชุดทดสอบคือการรั่วไหลของข้อมูลสู่โมเดล

สัดส่วนที่พบบ่อยคือ 60/20/20 สำหรับชุดข้อมูลขนาดกลาง หรือ 80/10/10 สำหรับชุดใหญ่

ครอสวาลิเดชัน

ครอสวาลิเดชันเหมาะกว่าเมื่อชุดวาลิเดชันมีขนาดเล็ก

แบ่งข้อมูลเทรนเป็น k โฟลด์—มักใช้ 5 หรือ 10 สำหรับแต่ละชุดไฮเปอร์พารามิเตอร์ เทรนบน k-1 โฟลด์และวัดผลบนโฟลด์ที่เหลือ แล้วหมุนจนครบ ค่าท้ายสุดคือค่าเฉลี่ยของทุกโฟลด์

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

ใช้ครอสวาลิเดชันเมื่อชุดข้อมูลเล็กจนการแบ่งครั้งเดียวไม่น่าเชื่อถือ และเมื่อรับภาระการเทรนเพิ่มได้

การเลือกเมตริกประเมินผล

เมตริกที่ปรับให้เหมาะสมควรตรงกับสิ่งที่สนใจจริง

Accuracy เหมาะกับคลาสที่สมดุล แต่ไม่เข้าท่าสำหรับปัญหาไม่สมดุล เช่น โมเดลตรวจจับทุจริตที่ทำนาย “ไม่ทุจริต” ทุกกรณีอาจได้ 99% แต่พลาดทั้งหมด สำหรับคลาสไม่สมดุล ใช้ precision, recall, F1 หรือ ROC-AUC สำหรับรีเกรสชัน ใช้ RMSE, MAE หรือ R squared ขึ้นกับความสำคัญของเอาต์ไลเออร์

เลือกเมตริกหลักตัวเดียวก่อนเริ่มจูน แล้วยึดตามนั้น

การหลีกเลี่ยงการรั่วไหลของข้อมูล

การรั่วไหลเกิดเมื่อข้อมูลจากชุดวาลิเดชันหรือเทสต์เล็ดลอดสู่การเทรน

ตัวอย่างที่พบบ่อย:

  • สเกลหรือทำ normalization กับทั้งชุดก่อนแบ่ง ทำให้สถิติของวาลิเดชันรั่วไปสู่เทรน
  • ฟีเจอร์เอนจิเนียริงที่ใช้ค่าเป้าหมายจากทั้งชุดข้อมูล
  • จูนโดยอิงชุดทดสอบแทนที่จะใช้วาลิเดชันแยก
  • ใช้ข้อมูลอนุกรมเวลาโดยไม่คำนึงลำดับเวลาในการแบ่ง

ฟิตขั้นตอน preprocessing ทั้งหมดบนชุดเทรนเท่านั้น แล้วค่อยนำไปใช้กับวาลิเดชันและเทสต์ ใน scikit-learn นี่คือหน้าที่ของ Pipeline ที่รวม preprocessing และโมเดลไว้ด้วยกันโดยเคารพการแบ่งชุด

การนำการปรับจูนไฮเปอร์พารามิเตอร์ไปใช้

ไลบรารี ML ส่วนใหญ่มีเครื่องมือช่วยค้นหาและทำครอสวาลิเดชันอยู่แล้ว จึงไม่ต้องทำใหม่ตั้งแต่ต้น

การปรับจูนไฮเปอร์พารามิเตอร์ใน Python

Scikit-learn มาพร้อมคลาสสำหรับจูนสองตัวหลัก—GridSearchCV สำหรับกริดเสิร์ช และ RandomizedSearchCV สำหรับการสุ่มค้นหา ทั้งสองครอบตัวประมาณค่าใด ๆ ของ scikit-learn ทำครอสวาลิเดชันในแต่ละชุด และคืนโมเดลที่ดีที่สุดท้ายสุด

GridSearchCV รับตัวประมาณค่า ดิกชันนารีของค่าพารามิเตอร์ และจำนวนโฟลด์ของครอสวาลิเดชัน เทรนทุกรายการและเก็บตัวที่สกอร์ดีที่สุด

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import make_classification

X, y = make_classification(n_samples=1000, random_state=42)

param_grid = {
    "n_estimators": [100, 200, 500],
    "max_depth": [5, 10, 20],
    "min_samples_leaf": [1, 5, 10],
}

grid = GridSearchCV(RandomForestClassifier(random_state=42), param_grid, cv=5)
grid.fit(X, y)

print(grid.best_params_)
print(grid.best_score_)

ผลลัพธ์ GridSearchCV ใน Python

ผลลัพธ์ GridSearchCV ใน Python

RandomizedSearchCV ใช้อินเทอร์เฟซเดียวกัน แต่สุ่มจากการแจกแจงแทนการไล่ลิสต์ตายตัว ช่วยครอบคลุมช่วงกว้างขึ้นในจำนวนรอบคงที่

from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint

param_dist = {
    "n_estimators": randint(100, 500),
    "max_depth": randint(3, 20),
    "min_samples_leaf": randint(1, 10),
}

random_search = RandomizedSearchCV(
    RandomForestClassifier(random_state=42),
    param_dist,
    n_iter=30,
    cv=5,
    random_state=42,
)
random_search.fit(X, y)

print(random_search.best_params_)

ผลลัพธ์ RandomizedSearchCV ใน Python

ผลลัพธ์ RandomizedSearchCV ใน Python

สำหรับการเพิ่มประสิทธิภาพแบบเบย์เซียน Optuna คือมาตรฐาน มันเลือกชุดถัดไปบนพื้นฐานของผลก่อนหน้า จึงคอนเวอร์จเร็วกว่าการสุ่มเมื่อการเทรนมีต้นทุนสูง

import optuna
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score

def objective(trial):
    params = {
        "n_estimators": trial.suggest_int("n_estimators", 100, 500),
        "max_depth": trial.suggest_int("max_depth", 3, 20),
        "min_samples_leaf": trial.suggest_int("min_samples_leaf", 1, 10),
    }
    model = RandomForestClassifier(**params, random_state=42)
    return cross_val_score(model, X, y, cv=5).mean()

study = optuna.create_study(direction="maximize")
study.optimize(objective, n_trials=30)

print(study.best_params)

ผลลัพธ์ Optuna ใน Python

ผลลัพธ์ Optuna ใน Python

เมธอด trial.suggest_* ใช้กำหนดพื้นที่ค้นหา และ Optuna จะตัดสินใจว่าควรลองชุดใดต่อไปตามสกอร์ที่เห็นมา

การปรับจูนไฮเปอร์พารามิเตอร์ใน R

R มีสองตัวเลือกที่ดี—caret และ tidymodels ทั้งคู่ทำงานคล้ายกัน—กำหนดกริด ทำครอสวาลิเดชัน คืนโมเดลที่ดีที่สุด—แต่ tidymodels เป็นค่าเริ่มต้นยุคใหม่

กับ caret ให้ส่งกริดให้ฟังก์ชัน train() และกำหนดวิธีรีแซมปลิง

library(caret)

data <- iris
ctrl <- trainControl(method = "cv", number = 5)

grid <- expand.grid(
  mtry = c(2, 3, 4)
)

model <- train(
  Species ~ .,
  data = data,
  method = "rf",
  trControl = ctrl,
  tuneGrid = grid
)

print(model$bestTune)

ผลลัพธ์ Caret ใน R

ผลลัพธ์ Caret ใน R

tidymodels แยกเวิร์กโฟลว์เป็นขั้นตอนชัดเจน—สเปคโมเดล สูตร preprocessing และกริดสำหรับจูน แม้จะยาวกว่าแต่ขยายได้ดีในทางปฏิบัติ

library(tidymodels)

data <- iris
split <- initial_split(data, prop = 0.8)
train_data <- training(split)

rf_spec <- rand_forest(
  mtry = tune(),
  trees = tune(),
  min_n = tune()
) |>
  set_engine("ranger") |>
  set_mode("classification")

grid <- grid_regular(
  mtry(range = c(2, 4)),
  trees(range = c(100, 500)),
  min_n(range = c(1, 10)),
  levels = 3
)

folds <- vfold_cv(train_data, v = 5)

results <- tune_grid(
  rf_spec,
  Species ~ .,
  resamples = folds,
  grid = grid
)

show_best(results, metric = "accuracy")

ผลลัพธ์ Tidymodels ใน R

ผลลัพธ์ Tidymodels ใน R

เวิร์กโฟลว์เหมือนกับใน Python ทุกประการ—กำหนดสิ่งที่จะค้นหา กำหนดวิธีให้คะแนน แล้วปล่อยให้ไลบรารีรันลูป

ควรจูนไฮเปอร์พารามิเตอร์ตัวไหนบ้าง?

ไม่ใช่ทุกไฮเปอร์พารามิเตอร์ที่คุ้มจูน เพราะมักมีเพียงไม่กี่ตัวที่กำหนดประสิทธิภาพส่วนใหญ่ ต่อไปนี้คือสิ่งที่มักสำคัญเป็นอันดับแรก แยกตามตระกูลโมเดล

ต้นไม้ตัดสินใจและแรนดอมฟอเรสต์

สามข้อนี้ควรจูนเสมอ:

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

โมเดลกราเดียนต์บูสติง

กราเดียนต์บูสติง (XGBoost, LightGBM, CatBoost) ไวต่อไฮเปอร์พารามิเตอร์มากกว่าแรนดอมฟอเรสต์ ให้ความสำคัญกับสิ่งเหล่านี้:

  • อัตราการเรียนรู้คุมว่าต้นไม้ใหม่แต่ละต้นจะปรับแก้ต้นก่อนหน้าแค่ไหน ค่าต่ำแม่นขึ้นแต่ต้องใช้ต้นไม้มากขึ้น นี่คือไฮเปอร์พารามิเตอร์ที่สำคัญที่สุด
  • จำนวนเอสติมเมเตอร์คือจำนวนรอบบูสติง ผูกกับอัตราการเรียนรู้—ลดอันหนึ่งต้องเพิ่มอีกอัน
  • ความลึกของต้นไม้คุมความซับซ้อนของต้นไม้แต่ละต้น บูสติงมักชอบต้นไม้ตื้นกว่าแรนดอมฟอเรสต์ โดยทั่วไป 3 ถึง 8

ซัพพอร์ตเวกเตอร์แมชชีน

สำหรับ SVM การเลือกไฮเปอร์พารามิเตอร์สำคัญมาก อาจมากกว่าระบบอื่น ๆ:

  • C คุมการแลกเปลี่ยนระหว่างมาร์จินกว้างกับการจัดประเภทตัวอย่างเทรนให้ถูกต้อง ค่า C สูงหมายถึงรีกูลาไรเซชันน้อยลง
  • Gamma คุมระยะอิทธิพลของตัวอย่างหนึ่งตัว ค่า gamma ต่ำหมายถึงไกล สูงหมายถึงใกล้
  • เคอร์เนลกำหนดรูปทรงของเส้นแบ่งการตัดสินใจที่ SVM เรียนรู้ได้ เริ่มที่ rbf สำหรับปัญหาไม่เชิงเส้น และ linear สำหรับข้อมูลสแปร์สมิติมิติสูง

โครงข่ายประสาทเทียม

โครงข่ายประสาทมีพื้นที่ค้นหากว้างที่สุดในบรรดาตระกูลโมเดลทั่วไป เริ่มจูนสิ่งเหล่านี้ก่อน:

  • อัตราการเรียนรู้ คือไฮเปอร์พารามิเตอร์สำคัญที่สุดในดีพลอยน์นิง สูงไปเทรนไม่คงที่ ต่ำไปก็ไม่คอนเวอร์จ ลองค่าข้ามลำดับความสำคัญ เช่น 1e-4, 1e-3, 1e-2.
  • ขนาดแบตช์ ส่งผลทั้งความเร็วการเทรนและความแม่นยำปลายทาง แบตช์ใหญ่เทรนต่อ epoch เร็วขึ้นแต่บ่อยครั้งทั่วไปได้แย่ลง
  • ตัวปรับเหมาะ (Adam, SGD พร้อมโมเมนตัม, AdamW) เปลี่ยนวิธีอัปเดตเวตของเน็ตเวิร์ก Adam เป็นค่าตั้งต้นที่ดี
  • จำนวน epoch คือจำนวนรอบที่โมเดลเห็นชุดเทรนครบ ใช้ early stopping แทนการจูนด้วยมือ

ความท้าทายทั่วไปในการปรับจูนไฮเปอร์พารามิเตอร์

การจูนมีต้นทุนสูง โดยเฉพาะเมื่ออยากทดสอบหลายค่าในหลายพารามิเตอร์ ต่อไปนี้คือความท้าทายที่พบบ่อย

ต้นทุนคอมพิวต์ คือข้อจำกัดใหญ่ที่สุด ทุกชุดที่ลองหมายถึงเทรนโมเดลเต็มหนึ่งครั้ง และครอสวาลิเดชันจะคูณด้วยจำนวนโฟลด์ กริด 100 ชุดกับ 5 โฟลด์ เท่ากับฟิตโมเดล 500 ครั้ง ถ้าแต่ละครั้งใช้ 10 นาที ก็เกินสามวัน

พื้นที่ค้นหาขนาดใหญ่ โตแบบคูณทวี ไฮเปอร์พารามิเตอร์ 5 ตัว ตัวละ 5 ค่า ได้ 3,125 ชุด ตรงนี้กริดเสิร์ชใช้ไม่ได้ ต้องหันไปสุ่มค้นหาหรือวิธีเบย์เซียน

ผลตอบแทนที่ลดลง มักเห็นได้เร็วกว่าที่คิด การจูนไม่กี่รอบแรกให้กำไรสูงสุด อีก 50 รอบถัดไปอาจได้เพิ่มอีกเพียง 1% จุดหนึ่งแล้ว การใช้คอมพิวต์เพิ่มคุ้มกว่าหรือควรไปเก็บข้อมูลเพิ่ม/ปรับฟีเจอร์ดีกว่า

การแลกเปลี่ยนระหว่างความแม่นยำกับเวลา สำคัญกว่าในโปรดักชันมากกว่าช่วงพัฒนา โมเดลที่คะแนนสูงขึ้น 0.5% แต่ใช้เวลาเทรนเพิ่มเท่าตัว อาจไม่คุ้มถ้าต้องรีเทรนทุกวัน ควรกำหนดไว้ล่วงหน้าว่าความแม่นยำเพิ่มเท่าไรถึงคุ้มกับคอมพิวต์เท่าไร

แนวทางปฏิบัติที่ดีในการปรับจูนไฮเปอร์พารามิเตอร์

แนวทางที่ควรยึดเมื่อจูนไฮเปอร์พารามิเตอร์ของโมเดลแมชชีนเลิร์นนิง:

  • เริ่มจูนตัวที่มีอิทธิพลมากที่สุดก่อน: อัตราการเรียนรู้สำหรับบูสติงและโครงข่ายประสาท ความลึกสูงสุดสำหรับต้นไม้ C และ gamma สำหรับ SVM จับช่วงให้ถูกก่อนค่อยไปอย่างอื่น
  • เริ่มจากการสุ่มค้นหาสำหรับพื้นที่กว้าง: กริดเสิร์ชสิ้นเปลืองกับตัวที่ไม่สำคัญ การสุ่มค้นหาครอบคลุมพื้นที่ได้ดีกว่า และเหมาะกับกรณีที่มีไฮเปอร์พารามิเตอร์มากกว่าสองหรือสามตัว
  • ใช้ครอสวาลิเดชัน: การแบ่งวาลิเดชันครั้งเดียวอาจโชคดีหรือโชคร้าย ห้าโฟลด์ให้ค่าประเมินการทั่วไปที่ซื่อสัตย์กว่า
  • กำหนดช่วงค้นหาให้สมจริง: ถ้าช่วงอัตราการเรียนรู้คือ [0.001, 100] จะเสียเวลากับค่าที่ใช้ไม่ได้ เริ่มจากช่วงที่ทราบว่าพอเหมาะกับอัลกอริทึม แล้วค่อยแคบลงตามผลที่เห็น
  • ติดตามการทดลองของคุณ: ล็อกค่าไฮเปอร์พารามิเตอร์ สกอร์ และซีดของทุกรอบ ใช้ MLflow, Weights & Biases หรือแม้แต่ไฟล์ CSV ก็ได้ มิฉะนั้นคุณจะทำซ้ำผลไม่ได้
  • ตั้งงบคอมพิวต์: ตัดสินใจจำนวนรอบที่ทำได้ก่อนเริ่ม ไม่ใช่หลังเริ่ม วิธีนี้บังคับให้เลือกวิธีค้นหาที่สอดคล้องกับงบ และหยุดจูนเมื่อถึงจุดพอดี

ข้อผิดพลาดที่พบบ่อยในการปรับจูนไฮเปอร์พารามิเตอร์

การจูนล้มเหลวส่วนใหญ่มาจากข้อผิดพลาดที่หลีกเลี่ยงได้ง่าย ต่อไปนี้คือตัวอย่าง:

  • สับสนระหว่างไฮเปอร์พารามิเตอร์กับพารามิเตอร์ของโมเดล เวตและค่าสัมประสิทธิ์เรียนรู้ระหว่างเทรน ไม่ต้องตั้งเองและไม่ต้องจูน หากจูนสิ่งที่อัลกอริทึมควรเรียนรู้เอง แปลว่าสับสนสองอย่างนี้
  • จูนโดยดูจากชุดทดสอบ ทุกการตัดสินใจที่อิงกับคะแนนเทสต์ทำให้ข้อมูลรั่วสู่โมเดล ตัวเลขสุดท้ายจะมองโลกสวยเกินจริง และโมเดลโปรดักชันจะทำได้ต่ำกว่า ใช้วาลิเดชันแยกหรือครอสวาลิเดชัน
  • ค้นหากริดที่ใหญ่เกินจำเป็น กริดที่มี 7 ไฮเปอร์พารามิเตอร์ ตัวละ 10 ค่า มีสิบล้านชุด ค้นหาไม่ไหว ตัดทอนก่อนเริ่มด้วยการเลือก 2–3 ตัวที่สำคัญที่สุดและให้ช่วงที่สมจริง
  • ปรับเหมาะเมตริกผิดตัว Accuracy บนข้อมูลไม่สมดุลจะได้โมเดลที่ทายคลาสใหญ่เสมอ เลือกเมตริกที่สะท้อนสิ่งที่สนใจจริง และเลือกก่อนเริ่มจูน
  • เปลี่ยนหลายไฮเปอร์พารามิเตอร์พร้อมกันระหว่างการจูนด้วยมือ หากปรับทั้งอัตราการเรียนรู้และขนาดแบตช์พร้อมกัน คุณจะไม่รู้ว่าอะไรทำให้ผลเปลี่ยน ขยับทีละตัวเมื่อจูนด้วยมือ

การปรับจูนไฮเปอร์พารามิเตอร์ vs ฟีเจอร์เอนจิเนียริง

ทั้งสองอย่างช่วยให้โมเดลดีขึ้น แต่แก้กันคนละส่วนของปัญหา

ฟีเจอร์เอนจิเนียริง ปรับปรุงข้อมูลอินพุต สร้างฟีเจอร์ใหม่จากของเดิม เข้ารหัสตัวแปรเชิงหมวด จัดการค่าว่าง และลดสัญญาณรบกวน ฟีเจอร์ที่ดีให้สัญญาณที่มีประโยชน์แก่โมเดล

การปรับจูนไฮเปอร์พารามิเตอร์ ปรับปรุงวิธีที่โมเดลเรียนรู้จากฟีเจอร์ที่มีอยู่ เปลี่ยนพฤติกรรมของอัลกอริทึมบนข้อมูล แทนที่จะเปลี่ยนข้อมูล

ทั้งสองอย่างเสริมกัน ฟีเจอร์เอนจิเนียริงมักให้กำไรมากที่สุดในช่วงต้นของโปรเจกต์เมื่อข้อมูลยังดิบและโมเดลพลาดสัญญาณชัด ๆ ส่วนการปรับจูนไฮเปอร์พารามิเตอร์ให้กำไรน้อยกว่าแต่อย่างสม่ำเสมอเมื่อฟีเจอร์ดีพอแล้ว

หากโมเดลติดเพดานและไม่แน่ใจว่าจะทำอะไรก่อน ให้ดูที่ข้อผิดพลาด หากโมเดลพลาดแพตเทิร์นที่ดูชัดจากข้อมูล แสดงว่ามีปัญหาฟีเจอร์ หากโอเวอร์ฟิตหรืออันเดอร์ฟิต แสดงว่ามีปัญหาการจูน

ทำไมการปรับจูนไฮเปอร์พารามิเตอร์จึงสำคัญในแมชชีนเลิร์นนิง

การจูนเป็นขั้นตอนมาตรฐานในเวิร์กโฟลว์ ML ใด ๆ

มักให้กำไรมากกว่าการเปลี่ยนอัลกอริทึม เช่น แรนดอมฟอเรสต์ที่จูนมาดีมักชนะกราเดียนต์บูสติงที่จูนไม่ดีบนข้อมูลชุดเดียวกัน แม้กราเดียนต์บูสติงจะซับซ้อนกว่า 

การจูนยังช่วยเรื่องการทั่วไป ไฮเปอร์พารามิเตอร์อย่างความลึกสูงสุดและ dropout ควบคุมระดับโอเวอร์ฟิตโดยตรง การตั้งให้ถูกทำให้ต่างระหว่างโมเดลที่ท่องจำชุดเทรนกับโมเดลที่ทำงานได้ดีกับข้อมูลใหม่

ในโปรดักชัน การจูนช่วยยกระดับจากต้นแบบไปเป็นระบบที่ไว้ใจได้ 

ค่าตั้งต้นช่วยให้เริ่มได้ แต่ไม่ใช่ค่าที่จะทำให้โมเดลแข่งขันได้ท่ามกลางการรีเทรนและข้อกำหนดธุรกิจ ทีม ML ที่จริงจังถือว่าการจูนเป็นส่วนหนึ่งของกระบวนการ

สรุป

การปรับจูนไฮเปอร์พารามิเตอร์คือการวนลูป ค้นหา ประเมิน และบีบช่วงให้แคบลงตามสิ่งที่เวิร์กกับข้อมูลของคุณ

ผลลัพธ์ดีที่สุดมาจากสามอย่างรวมกัน—วิธีค้นหาที่สอดคล้องกับงบคอมพิวต์ การวาลิเดตที่ให้คะแนนสอดคล้องกับเป้าหมาย และการติดตามการทดลองที่ย้อนดูสิ่งที่เคยลองได้

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

หากกำลังพิจารณาอาชีพในสายแมชชีนเลิร์นนิง ลงทะเบียนหลักสูตร Machine Learning Engineer เพื่อเตรียมความพร้อมงานในปี 2026

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

การปรับจูนไฮเปอร์พารามิเตอร์ในแมชชีนเลิร์นนิงคืออะไร?

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

ทำไมการปรับจูนไฮเปอร์พารามิเตอร์จึงสำคัญ?

ค่าตั้งต้นของไฮเปอร์พารามิเตอร์ช่วยให้โมเดลรันได้ แต่ไม่ถูกปรับให้เหมาะกับปัญหาเฉพาะของคุณ การจูนมักให้กำไรด้านความแม่นยำมากกว่าการเปลี่ยนไปใช้อัลกอริทึมที่ซับซ้อนกว่า และยังควบคุมความสามารถในการทั่วไปกับข้อมูลใหม่ของโมเดลโดยตรง

ความแตกต่างระหว่างไฮเปอร์พารามิเตอร์กับพารามิเตอร์ของโมเดลคืออะไร?

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

ควรใช้กริดเสิร์ชหรือการสุ่มค้นหา?

กริดเสิร์ชเหมาะกับพื้นที่ค้นหาเล็กที่มีไฮเปอร์พารามิเตอร์สองหรือสามตัวและมีค่าไม่กี่ค่า เมื่อมีพารามิเตอร์มากขึ้น การสุ่มค้นหาครอบคลุมพื้นที่ได้ดีกว่าด้วยงบคอมพิวต์เท่าเดิม เพราะไม่เสียรันกับค่าที่ไม่สำคัญ ตามหลักแล้ว ใช้กริดเสิร์ชเมื่อรู้ดีว่าควรลองค่าใด และใช้การสุ่มค้นหาเมื่อยังไม่รู้

ควรใช้การเพิ่มประสิทธิภาพแบบเบย์เซียนแทนการสุ่มค้นหาเมื่อใด?

วิธีเบย์เซียนคุ้มค่ากว่าเมื่อการเทรนมีต้นทุนสูงและแต่ละรอบมีราคา เพราะใช้ผลจากรอบก่อน ๆ เพื่อตัดสินใจว่าจะลองอะไรต่อ จึงหาค่าที่ดีได้ในจำนวนรอบน้อยกว่าการสุ่ม หากทำร้อยรอบเร็ว ๆ ได้ การสุ่มค้นหาง่ายกว่าและมักเพียงพอ เลือกวิธีเบย์เซียนเมื่อจำกัดรอบได้เพียงหลักสิบ

หัวข้อ

เรียนกับ DataCamp

Courses

Machine Learning with Tree-Based Models in Python

5 ชม.
117.2K
ในคอร์สนี้ คุณจะได้เรียนรู้วิธีใช้โมเดลแบบต้นไม้และเอนเซมเบิลสำหรับการถดถอยและการจำแนกประเภทด้วย scikit-learn
ดูรายละเอียดRight Arrow
เริ่มหลักสูตร
ดูเพิ่มเติมRight Arrow