แนวทางปฏิบัติที่ดีที่สุดสำหรับการเข้ารหัสคุณสมบัติที่เป็นหมวดหมู่สำหรับต้นไม้การตัดสินใจ


13

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

มีกฎที่คล้ายกันสำหรับต้นไม้การตัดสินใจ (ถุง, เพิ่มขึ้น) หรือไม่? ฉันถามสิ่งนี้เพราะการฝึกฝนมาตรฐานใน Python ดูเหมือนว่าจะเพิ่มnระดับเป็นnหุ่น (sklearns ' OneHotEncoderหรือ Pandas' pd.get_dummies) ซึ่งดูเหมือนจะไม่ดีสำหรับฉัน

สิ่งที่คุณจะแนะนำเป็นแนวทางปฏิบัติที่ดีที่สุดสำหรับการเข้ารหัสคุณสมบัติหมวดหมู่สำหรับต้นไม้การตัดสินใจ?

คำตอบ:


12

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

(ฉันมาที่นี่จากมุมมอง R แต่ฉันคิดว่ามันเหมือนกันใน Python) ขึ้นอยู่กับสองสามอย่างเช่น 1) แพ็กเกจที่คุณใช้และ 2) คุณมีระดับปัจจัยกี่ระดับ

1) หากคุณใช้randomForestแพ็คเกจของ R หากคุณมีระดับปัจจัย <33 ระดับคุณสามารถดำเนินการต่อและเก็บไว้ในฟีเจอร์เดียวหากคุณต้องการ นั่นเป็นเพราะในการใช้ฟอเรสต์แบบสุ่มของ R มันจะตรวจสอบเพื่อดูว่าระดับปัจจัยใดควรอยู่ที่ด้านใดด้านหนึ่งของการแยกและอีกอันหนึ่ง (เช่น 5 ระดับของคุณอาจถูกจัดกลุ่มเข้าด้วยกันทางซ้ายและ 7 อาจถูกจัดกลุ่ม ร่วมกันทางขวา) หากคุณแบ่งคุณลักษณะหมวดหมู่ออกเป็นnหุ่นแล้วอัลกอริทึมจะไม่มีตัวเลือกนี้เมื่อทำการกำจัด

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

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


1
ขอบคุณ! ฉันกำลังทำให้คุณถูกต้อง: ถ้าฉันกำลังสร้างแบบจำลองใน R ซึ่งคุณสมบัติที่เป็นหมวดหมู่ในrandomForestนั้นจะถูกเข้ารหัสโดยอัตโนมัติฉันควรจะไปกับnหุ่นเพราะการจับคู่กันไม่ได้เป็นปัญหาสำหรับ RF?
Sergey Bushmanov

3
การมีหมวดหมู่ที่เข้ารหัสไบนารีมากกว่า 32 ระดับจะมีพฤติกรรมที่แตกต่างกันเล็กน้อยในทรีเนื่องจาก RF จะเลือกจากคอลัมน์ไบนารีเหล่านั้นแทนที่จะเลือกคอลัมน์เดี่ยวของปัจจัยที่มีหลายระดับ ความแตกต่างที่ลึกซึ้งนี้หมายความว่าการแยกในคอลัมน์ไบนารีจะมีข้อมูลน้อยกว่าเมื่อเปรียบเทียบกับการแยกในคอลัมน์ปัจจัยเนื่องจากมีตัวเลือกเดียว (0/1) เมื่อเทียบกับ (1 / {2,3}, {2,1} / 3 ) ฯลฯ
Sycorax พูดว่า Reinstate Monica

@ user777 ไม่ใช่ปัญหาของการมีตัวแปรมากกว่า 32 ตัว มันเป็นปัญหาของการไม่มีตัวแปรหมวดหมู่ "จัดกลุ่ม" ใน Python sklearn... การพูดจริงมีหลักฐาน (ประสบการณ์จริง, การวิจัยและอื่น ๆ ) ที่ตัวแปร "dummified" จะทำงานได้แย่กว่าตัวแปรจัดหมวดหมู่ "ในกลุ่ม"
Sergey Bushmanov

1
ในทางทฤษฎีเราคาดหวังว่าผู้ที่ไม่ได้จัดกลุ่มจะทำงานแย่ลงเล็กน้อยเพราะคุณให้ความยืดหยุ่นแก่โมเดลน้อยลง ในกรณีที่มีการจัดกลุ่มถ้าเป็นการดีกว่าที่จะใช้คุณลักษณะนั้นเป็นแบบไม่จัดกลุ่มโมเดลจะสามารถทำเช่นนั้นได้ (โดยการวางกลุ่มหนึ่งไว้ที่ด้านหนึ่งและจากที่เหลือทั้งหมดไปที่อื่น) อย่างไรก็ตามในทางปฏิบัติผมจะประหลาดใจว่ามีความแตกต่างมาก (โดยเฉพาะอย่างยิ่งในกรณีของ RF ที่คุณกำลังสร้างต้นไม้จำนวนมาก)
Tchotchke

2
ฉันพบว่าการใช้งานแบบสุ่มป่าโดยใช้คุณสมบัติที่มีหลายระดับ (> 15) ช้าตามที่กล่าวถึง แต่ยังให้ประสิทธิภาพของแบบจำลองปานกลาง ฉันเดาว่าการแยกที่เป็นไปได้สูงมากจะช่วยลดความสัมพันธ์ที่ตั้งใจไว้ของต้นไม้ในชุด extraTrees และ Rborist ลองใช้ตัวอย่างย่อยของการแยกแบบ Catagorical ในแต่ละโหนด ที่อาจช่วยในการตกแต่งและเพิ่มความเร็วได้อย่างแน่นอน ดังนั้นช่วงของการแก้ปัญหาระหว่าง "randomForest ลองแบ่งใด ๆ " และ "ตัวแปรจำลองจำลอง sklern ลองใช้ตัวแยก 1-vs-rest" เท่านั้นจึงเป็นไปได้ การจัดกลุ่มที่แตกต่างกันของหลาย ๆ ระดับในระดับที่น้อยลงอาจแสดงว่ามีประโยชน์
Soren Havelund Welling

4

มีอีกวิธีในการจัดการกับตัวแปรเด็ดขาดที่เรียกว่าการเข้ารหัสเป้าหมาย / ผลกระทบ

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

ต่อไปนี้เป็นคำอธิบายที่ดีของหัวเรื่อง:
https://towardsdatascience.com/why-you-should-try-mean-encoding-17057262cd0

และนี่คือลิงค์ไปยังกระดาษที่ แต่เดิมเสนอการเข้ารหัส: http://helios.mm.di.uoa.gr/~rouvas/ssi/sigkdd/sigkdd.vol3.1/barreca.pdf

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.