บทนำสำหรับบทนำ

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

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

บทนำ

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

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

ปัญหา

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

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

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

ข้อมูลและการประมวลผลล่วงหน้า

MLB เป็นหนึ่งในลีกไม่กี่ลีกที่มีชุดข้อมูลสาธารณะของหน่วยวัดต่างๆ ที่รวบรวมระหว่างเกม สามารถดูและดาวน์โหลดตัวเลขเหล่านี้ได้ที่ Baseball Savant ซึ่งเป็นแดชบอร์ดของลีกและพื้นที่เก็บข้อมูลสถิติดังกล่าว เพื่อปรับปรุงกระบวนการรวบรวมข้อมูลและการโต้เถียงจึงใช้ฟังก์ชัน "statcast" จากแพ็คเกจ Python "baseball_scraper" ซึ่งรวบรวมการขว้างได้ประมาณ 700,000 ครั้งจากฤดูกาล 2022 โดยแต่ละรายการมีการวัดการขว้าง (เช่น ความเร็ว การเคลื่อนที่ในแนวตั้ง/แนวนอน อัตราการหมุน) การวัดการตี (เช่น มุมเหิน ความเร็วทางออก มุมสเปรย์) และตัวแปรตามบริบท (อินนิ่ง ลูกบอล , นัดหยุดงาน)

เพื่อประเมินคุณภาพของการเสนอขายหรือเหตุการณ์ในระดับเชิงปริมาณอย่างต่อเนื่อง (แทนที่จะไปกับมูลค่าเชิงคุณภาพ (การหยุดงาน การตีฐาน ฯลฯ) ) ค่าการวิ่งจะถูกนำมาใช้ ค่าการวิ่งคือจำนวนการวิ่งในเหตุการณ์เฉพาะ มีมูลค่าโดยเฉลี่ยตลอดทั้งฤดูกาล คำนวณโดยการจัดกลุ่มเหตุการณ์ออกเป็นหมวดหมู่ทั่วไป จากนั้นใช้คอลัมน์ “delta_run_exp” ในบันทึกการเสนอขายของ Savant เพื่อค้นหาการเปลี่ยนแปลงโดยเฉลี่ยในการวิ่งของประเภทเหล่านั้น หมวดหมู่เหตุการณ์ถูกจัดกลุ่มตาม ประเภทลูกบอลที่ตี (ฟลาย, ลูกบอลกราวด์, ไลน์ไดรฟ์, ป๊อปฟลาย) และลูกบอลที่ไม่ตีลูก (การตี, บอลหลายประเภท) ตัวอย่างเช่น ไลน์ไดรฟ์นั้นคุ้มค่ากับการวิ่งมากที่สุด ในขณะที่ป๊อปอัพ (ซึ่งมักจะสอดส่องอยู่ตลอดเวลา) เพื่อออก) มีค่าน้อยที่สุด

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

ระเบียบวิธี

เดิมทีวางแผนไว้คือการฝึกอบรมแบบจำลองสำหรับผู้ตีแต่ละคนที่ไม่ซ้ำกัน และเรียกใช้การขว้างของผู้ขว้างผ่านแบบจำลองนั้น เพื่อทำความเข้าใจจุดแข็งและจุดอ่อนของผู้ตีและวางแผนเกมตามนั้นอย่างถ่องแท้ อย่างไรก็ตาม หลังจากการทดลองครั้งแรก ปัญหาเกี่ยวกับขนาดตัวอย่างเกิดขึ้นเมื่อผู้หวดมองเห็นสนามได้ประมาณ 1,000 สนามตลอดทั้งฤดูกาล (Rhys Hoskins จากทีม Phillies เป็นผู้นำในลีกด้วยจำนวน 1,601 สนาม) นอกจากนี้ ขนาดตัวอย่างที่เล็กลงของผู้เล่นแต่ละคนหมายความว่าไม่สามารถใช้วงดนตรีที่ทรงพลังกว่านี้ได้

การจัดกลุ่มผู้ตี

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

หลังจากคำนวณข้อมูลนี้แล้ว การจัดกลุ่ม K-Means จะถูกนำมาใช้เพื่อค้นหากลุ่มผู้ตีทั่วไปเพิ่มเติม มีการใช้ K-Means สี่รายการ (R/LHP กับ R/LHH) เพื่อระบุประเภทผู้ตีในสถานการณ์การจับคู่ที่แตกต่างกัน กลุ่มถูกสร้างขึ้นโดยการทดสอบ "n_clusters" ที่แตกต่างกันแบบวนซ้ำ และค้นหาคลัสเตอร์ที่มีคะแนนเงาสูงสุด สิ่งนี้สร้างกลุ่มย่อยเก้ากลุ่มจากการจับคู่ทั้งหมดจากฤดูกาล 2022 และหากแบบจำลองได้รับการฝึกฝนในแต่ละกลุ่มเหล่านั้น ก็จะไม่มีปัญหากับขนาดตัวอย่าง และสามารถใช้แบบจำลองที่ใหญ่กว่าและมีประสิทธิภาพมากขึ้นสำหรับการสร้างแบบจำลองการจับคู่ งาน. ผู้ตีแต่ละคนจะมีสองกลุ่ม กลุ่มหนึ่งต่อต้านเหยือกที่ถนัดซ้ายและขวา ตามลำดับ

การเลือกรุ่น

กลุ่มจากหนึ่งในเก้าคลัสเตอร์ (หนึ่งในคลัสเตอร์ RvR) ได้รับเลือกให้ดำเนินการเลือกแบบจำลองและการตรวจสอบข้ามเพื่อตัดสินใจว่าสิ่งใดเหมาะสมที่สุด คุณสมบัติต่อไปนี้ถูกเลือก:

  • release_speed: ความเร็วที่ลูกบอลขว้างเป็นไมล์ต่อชั่วโมง
  • release_spin_rate: อัตราที่ลูกบอลหมุน มีหน่วยเป็นรอบต่อนาที
  • release_extension: การขยายเหยือกเมื่อก้าวไปข้างหน้าในการส่งอาหาร หน่วยเป็นฟุต
  • spin_axis: แกนที่ลูกบอลกำลังหมุน มีหน่วยเป็นองศา
  • pfx_x/pfx_z: การเคลื่อนที่ในแนวตั้งและแนวนอนของสนาม หน่วยเป็นฟุต
  • release_pos_x/release_pos_z: พิกัดของจุดปล่อยเหยือก มีหน่วยเป็นฟุต
  • ลูกบอล/นัดหยุดงาน: ข้อมูลหมวดหมู่ที่เข้ารหัส
  • R/L: มูลค่าการวิ่งเฉลี่ยของผู้หวดฝ่ายตรงข้ามต่อ 100 สนามต่อ L/RHP (ขึ้นอยู่กับการจับคู่)
  • โซน: ตำแหน่งสนาม, เข้ารหัส
  • rv (ตัวแปรการตอบสนอง): ค่ารัน

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

ค่าถูกปรับขนาดโดยใช้วัตถุ StandardScaler และ Pipeline จากนั้นทดสอบในโมเดล Linear, Ridge, Random Forest, Decision Tree และ XGBoost สำหรับฟอเรสต์สุ่ม แผนผังการตัดสินใจ และการตรวจสอบข้าม XGBoost เสร็จสิ้นบนไฮเปอร์พารามิเตอร์ max_deep โดยใช้ GridSearchCV มีการใช้ชุดการฝึก 75% ของแถวเพื่อสร้างแบบจำลอง และส่วนที่เหลือถูกใช้เป็นการทดสอบ แม้ว่า Random Forest จะมีประสิทธิภาพเหนือกว่า XGBoost ในชุดการทดสอบ แต่ XGBoost ก็เป็นแบบจำลองที่ถูกเลือกเนื่องจากใช้เวลาฝึกฝนน้อยกว่ามากและความแตกต่างระหว่างคะแนน R2 ก็ดูไม่มีนัยสำคัญ

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

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

การนำไปปฏิบัติ

เพื่อประโยชน์ของเวลา มีเพียงสามกลุ่ม RvR เท่านั้นที่ถูกนำไปใช้ ไปป์ไลน์ออบเจ็กต์ของตัวปรับขนาดและโมเดล XGBoost ถูกสร้างขึ้นและตรวจสอบข้ามกับ GridSearchCV โดยดูจาก “max_deeps” ระหว่าง 5 ถึง 15 โมเดลเหล่านี้จะถูกบันทึกเป็นไฟล์ .sav โดยใช้แพ็คเกจ Pickle เพื่อให้เข้าถึงได้ง่ายในอนาคต ไม่ว่าจะสำรวจหรือ ทดสอบ. วิธีนี้จะบันทึกพารามิเตอร์ที่ปรับแล้วรวมถึง StandardScaler เพื่อปรับปรุงการประมวลผลล่วงหน้าที่จำเป็นในการทำนายค่าด้วยโมเดลเหล่านี้บนชุดข้อมูลใดๆ

คุณลักษณะที่สำคัญที่สุดในการพิจารณาประสิทธิภาพของระดับเสียงคือระดับเสียง โดยเริ่มจากการเคลื่อนไหว (pfx_x/z) และความเร็ว มุมปล่อยและส่วนต่อขยายของเหยือกไม่สำคัญเท่าไหร่

ผลลัพธ์และการวิเคราะห์

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

มีการเลือกเหยือกและผู้ตี Ryan Pressley (RHP) และ Travis d’Arnaud ที่ไม่ได้เผชิญหน้ากันในฤดูกาล 2022 กล่าว ตัวชี้วัดของ Pressley เป็นค่าเฉลี่ยสำหรับแต่ละการขว้างที่เขาขว้าง (ฟาสต์บอล สไลเดอร์ โค้งบอล การเปลี่ยนแปลง) และค่ารันเฉลี่ยของ d’Arnaud เทียบกับ RHP และกลุ่มจะถูกดึงออกมา

การขว้างของ Pressley จะถูกทำนายในแต่ละโซน (1–9) และจำนวนการตีแต่ละครั้ง (12 ครั้ง) ด้วยโมเดล RvR Group 2 (ซึ่ง d’Arnaud เป็นของ) สิ่งนี้ส่งผลให้มีการคาดการณ์ค่าการรันของตัวเลือกพิทช์ที่เป็นไปได้ 432 รายการ

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

แนะนำให้ใช้ชุดค่าผสมตำแหน่งสนามห้าอันดับแรกพร้อมค่าการวิ่งที่คาดหวัง (xrv) ของแต่ละชุด xRV+ ของสนามซึ่งก็คือมูลค่าการวิ่งของสนามนั้นเมื่อเปรียบเทียบกับค่าเฉลี่ยของการจับคู่ ซึ่งเท่ากับ 100 xRV+ ของ 110 หมายความว่าสนามนั้นดีกว่าสนามเฉลี่ยสิบเท่าในการแข่งขัน RvR Group 2 ทั้งหมด เมื่อมองดูสิ่งนี้ การจับคู่ระหว่าง Ryan Pressley กับ Travis d’Arnaud นั้นดีมาก โดยเฉพาะอย่างยิ่งถ้า Pressley ทำงานโดยใช้ลูกบอลทำลายของเขาเป็นหลัก (สไลเดอร์, ลูกโค้ง)

ในทางกลับกัน หากผู้ขว้างต่ำกว่ามาตรฐาน เช่น Jeurys Familia (6.09 ได้รันเฉลี่ย เทียบกับ Pressley's 2.98) เผชิญหน้ากับ d’Arnaud ผลลัพธ์ที่คาดการณ์ไว้จะดูไม่ดีนักโดยไม่คำนึงถึงประเภทการขว้าง ดังนั้น หากผู้จัดการทีมมีทั้งเพรสลีย์และฟามิเลียพร้อมลงสนามเพื่อเผชิญหน้ากับอาร์โนด์ มันก็ไม่ใช่เรื่องง่ายเลยที่เพรสลีย์จะเป็นตัวเลือก เมื่อดูค่า xrv+ แล้ว Pressley น่าจะได้ผลลัพธ์ที่ดีกว่า Familia ถึง 10% นอกจากนี้ จากมุมมองของการตรวจสอบสุขภาพจิต นี่เป็นเรื่องดีที่ได้เห็น

ความคิดสุดท้าย งานในอนาคต

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

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

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

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

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