ฉันทำงานเกี่ยวกับการแข่งขันวิทยาศาสตร์ข้อมูลที่การกระจายชุดทดสอบของฉันแตกต่างจากชุดฝึกอบรม ฉันต้องการยกตัวอย่างการสังเกตจากชุดการฝึกอบรมซึ่งคล้ายกับชุดทดสอบอย่างใกล้ชิด
ฉันจะทำสิ่งนี้ได้อย่างไร
ฉันทำงานเกี่ยวกับการแข่งขันวิทยาศาสตร์ข้อมูลที่การกระจายชุดทดสอบของฉันแตกต่างจากชุดฝึกอบรม ฉันต้องการยกตัวอย่างการสังเกตจากชุดการฝึกอบรมซึ่งคล้ายกับชุดทดสอบอย่างใกล้ชิด
ฉันจะทำสิ่งนี้ได้อย่างไร
คำตอบ:
คำถามที่ยอดเยี่ยมนี่คือสิ่งที่เป็นที่รู้จักในกระบวนทัศน์การเรียนรู้ของเครื่องว่า "Covariate Shift" หรือ "Model Drift" หรือ "Nonstationarity" เป็นต้น
หนึ่งในสมมติฐานสำคัญที่เราจะสร้างแบบจำลองการเรียนรู้ของเครื่องสำหรับการทำนายอนาคตคือข้อมูลที่มองไม่เห็น (ทดสอบ) นั้นมาจากการแจกจ่ายแบบเดียวกับข้อมูลการฝึกอบรม! อย่างไรก็ตามในความเป็นจริงข้อสันนิษฐานที่ค่อนข้างง่ายนี้แบ่งได้ง่ายและข้อมูลที่กำลังจะมาถึง (การกระจายตัว) เปลี่ยนแปลงไปตามกาลเวลาด้วยเหตุผลหลายประการ สำหรับผู้ที่อาจไม่คุ้นเคยกับปัญหาที่สำคัญนี้ฉันขอแนะนำให้ดูที่นี่หรือโพสต์ !
สำหรับฉันคำถามของคุณอยู่ในหมวดหมู่เดียวกัน แม้ว่าฉันจะไม่ได้มีโซลูชั่นที่สมบูรณ์แบบ (การดำเนินการเพื่อนำเสนอ) แต่ฉันคิดว่าคุณอาจมีลักษณะ:
การอัปเดตอย่างรวดเร็ว (โซลูชันที่ดี) : ฉันพบการใช้ Python ของอัลกอริทึม KLIEPของรายงานการวิจัย (จุดสุดท้าย) เพื่อหาน้ำหนักเหล่านั้น ดูเหมือนว่าจะใช้งานง่าย! โดยพื้นฐานแล้วมันจะทำการทดสอบซ้ำอีกครั้งโดยการใส่ตุ้มน้ำหนัก (ผ่านอัลกอริทึม KLIEP) เพื่อให้สมมติฐานของการมีการแจกแจงของรถไฟและการทดสอบที่คล้ายคลึงกันมีความจริงมากที่สุด
ฉันต้องการยกตัวอย่างการสังเกตจากชุดการฝึกอบรมซึ่งคล้ายกับชุดทดสอบอย่างใกล้ชิด
ฉันไม่แน่ใจว่าคุณต้องการทำเช่นนั้น จุดประสงค์ทั้งหมดนั้นค่อนข้างจะฝึกอัลกอริทึมของคุณเพื่อให้มองเห็นได้โดยทั่วไปในการมองไม่เห็นข้อมูล
โดยปกติแล้วเราควรปรับข้อมูลการทดสอบเป็นข้อมูลรถไฟ (เช่นข้อมูลการทดสอบที่เป็นมาตรฐานตามข้อมูลรถไฟ ) และไม่ใช่วิธีอื่น ในทางปฏิบัติคุณไม่ทราบข้อมูลการทดสอบของคุณ
ชุดย่อยชุดรถไฟอาจไม่ใช่วิธีที่ดีที่สุด!
ความแตกต่างระหว่างชุดการทดสอบ / การปฏิบัติและการกระจายชุดฝึกอบรม / คุณสมบัติเป็นเรื่องธรรมดามากในงานการเรียนรู้ภายใต้การดูแล (นี่คือหนึ่งในเหตุผลที่การแข่งขันเช่น Kaggle ท้าทาย) นั่นคือเหตุผลที่เราบอกว่าผลการดำเนินงานที่ผ่านมาอาจจะ (เฉพาะ) ที่ใช้เป็นคู่มือสำหรับการประเมินผลการดำเนินงานในอนาคต แต่ก็ไม่ได้ระบุ / รับประกันมัน ดังนั้นโมเดลgeneralizableจึงเป็นที่ต้องการมากกว่าโมเดลที่ปรับจูนมาอย่างดีซึ่งอาจทำงานได้ดีมากในชุดรถไฟ (ย่อย) แต่ทำได้ไม่ดีกับข้อมูลที่มองไม่เห็น
ในขณะที่ความแตกต่างดังกล่าวเป็นเรื่องปกติช่องว่างขนาดใหญ่เกินไประหว่างตัวอย่างในอดีตและอนาคตอาจถูกเรียกว่าเป็นตัวอย่างของแนวคิดที่เป็นงานวิจัยด้วยตนเอง จากคำถามของคุณฉันไม่สามารถตัดสินได้ว่าคดีของคุณเป็นคดี ML ปกติหรือแนวคิดล่องลอยเกิดขึ้นจริง
นี่คือคำแนะนำของฉัน:
ฝึกจำนวนรุ่นที่มีความสามารถในการวางนัยทั่วไปสูง ใช้การสุ่มตัวอย่างbootstrapจากชุดข้อมูลรถไฟของคุณคุณสามารถคำนวณอคติและองค์ประกอบความแปรปรวนของข้อผิดพลาดได้อย่างง่ายดาย โปรดจำไว้ว่าคุณกำลังมองหาโมเดลความแปรปรวนต่ำ (ซึ่งการเปลี่ยนแปลงของข้อมูลจะมีผลกระทบเล็กน้อยต่อประสิทธิภาพการทำงาน) แทนที่จะเป็นแบบอคติต่ำแต่โมเดลความแปรปรวนสูง (ซึ่งอาจเหมาะกับชุดการฝึกอบรมของคุณ) ตอนนี้คุณสามารถเลือกอัลกอริธึมที่ดีที่สุดและประเมินผลเทียบกับชุดทดสอบ โปรดทราบว่าในเวลาการฝึกอบรมเราไม่ควรดูชุดทดสอบ!
แทนที่จะสุ่มตัวอย่างแบบสุ่มหลาย ๆ ครั้งให้มองหามาตรฐาน / การทำให้เป็นมาตรฐานและการเลือกคุณสมบัติ / วิศวกรรม เทคนิคเหล่านี้อาจเป็นประโยชน์ในการเรียนรู้รูปแบบทั่วไปมากขึ้น ตัวอย่างเช่นบางครั้งช่วงของฟีเจอร์โดเมนอาจเปลี่ยนแปลงได้ตลอดเวลาในขณะที่รูปร่างของการแจกจ่าย (ไม่ว่าจะเป็นอะไร) ก็ยังคงเหมือนเดิม (เช่นการกระจายเดียวกันที่เลื่อนไปทางซ้ายหรือขวา) ในกรณีเช่นนี้การสร้างมาตรฐานอย่างง่าย(เช่นการทำแผนที่รถไฟและตัวอย่างทดสอบไปยังพื้นที่ที่กำหนดไว้ล่วงหน้าเช่น [0,1] โดยใช้ฟังก์ชั่นการทำแผนที่ที่แตกต่างกัน) สามารถลดอาการได้
การสุ่มตัวอย่างแบบเป็นระบบอาจเป็นวิธีการแก้ปัญหาที่เหมาะสมเท่านั้นหากคุณใช้ความรู้เกี่ยวกับปัญหา (ไม่ใช่เพียงเพื่อจุดประสงค์ในการได้รับความแม่นยำที่ดีขึ้นในชุดข้อมูลการทดสอบ) ตัวอย่างเช่นคุณอาจทราบว่ามีการบันทึกบางอย่างในข้อมูลรถไฟเป็นเวลานานแล้วจากเขตข้อมูลไกลหรือได้รับผลกระทบจากปัจจัยเฉพาะซึ่งจะไม่มีข้อมูลใด ๆ เกิดขึ้นอีกในอนาคต (ในการรวบรวมข้อมูลทดสอบ) ในกรณีเช่นนี้คุณอาจลบตัวอย่างที่ไม่เกี่ยวข้องเนื่องจากคุณมั่นใจว่าคุณจะไม่เห็นรูปแบบดังกล่าวในอนาคต (ฉันหมายถึงคุณควรมีเหตุผลเบื้องหลังการเลือกชุดย่อยการฝึกอบรมแทนที่จะมองเข้าไปในชุดทดสอบที่ ในความเป็นจริงคุณไม่สามารถเข้าถึงได้) ในกรณีเช่นนี้ฉันเรียกมันว่าการลบแบบผิดปกติ มากกว่าการสุ่มตัวอย่าง
มีแพ็คเกจที่ดีในไพ ธ อน (scikit Learn)
http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html
คุณสามารถยกตัวอย่างการสังเกตของคุณจากชุดการฝึกอบรมโดยใช้แพ็คเกจนี้