ปรับปรุงการจัดหมวดหมู่ด้วยตัวแปรเด็ดขาดมากมาย


37

ฉันกำลังทำงานกับชุดข้อมูลที่มี 200,000 ตัวอย่างและประมาณ 50 คุณสมบัติต่อตัวอย่าง: 10 ตัวแปรต่อเนื่องและอีก 40 รายการเป็นตัวแปรเด็ดขาด (ประเทศ, ภาษา, สาขาวิทยาศาสตร์ ฯลฯ ) สำหรับตัวแปรจัดหมวดหมู่เหล่านี้คุณมี 150 ประเทศที่แตกต่างกัน 50 ภาษา 50 สาขาวิทยาศาสตร์ ฯลฯ ...

จนถึงแนวทางของฉันคือ:

  1. สำหรับตัวแปรเด็ดขาดแต่ละตัวที่มีค่าที่เป็นไปได้มากให้ใช้เพียงอันเดียวที่มีตัวอย่างมากกว่า 10,000 ตัวอย่างที่รับค่านี้ ซึ่งจะลดลงเหลือ 5-10 หมวดหมู่แทนที่จะเป็น 150

  2. สร้างตัวแปรดัมมี่สำหรับแต่ละหมวดหมู่ (ถ้า 10 ประเทศจากนั้นสำหรับแต่ละตัวอย่างเพิ่มเวกเตอร์ไบนารีขนาด 10)

  3. ป้อนฟอเรสต์ฟอเรสต์แบบสุ่ม (ตรวจสอบความถูกต้องของพารามิเตอร์และอื่น ๆ ... ) ด้วยข้อมูลนี้

ขณะนี้ด้วยวิธีนี้ฉันจัดการเพื่อให้ได้ความแม่นยำ 65% เท่านั้นและฉันรู้สึกว่าสามารถทำได้มากกว่านี้ โดยเฉพาะอย่างยิ่งฉันไม่พอใจกับ 1) เนื่องจากฉันรู้สึกว่าฉันไม่ควรลบ "ค่าที่เกี่ยวข้องน้อยที่สุด" ตามจำนวนตัวอย่างที่พวกเขามีโดยพลการเนื่องจากค่าที่แสดงน้อยกว่าเหล่านี้อาจเป็นการเลือกปฏิบัติมากกว่า ในทางกลับกัน RAM ของฉันไม่สามารถเพิ่ม 500 คอลัมน์ * 200000 แถวลงในข้อมูลโดยเก็บค่าที่เป็นไปได้ทั้งหมดไว้

คุณจะมีข้อเสนอแนะใด ๆ ที่จะรับมือกับตัวแปรเด็ดขาดมากนี้หรือไม่?


2
หากคุณสนใจยังคงคุณอาจต้องการตรวจสอบคำตอบของฉันในการลดมิติและคำตอบของฉันในการจำแนกลำดับชั้น
Aleksandr Blekh

1
เมื่อคุณพูดว่า"สร้างตัวแปรจำลองสำหรับแต่ละหมวดหมู่"ดูเหมือนว่าคุณใช้ Python ไม่ใช่ R ใช่หรือไม่ R Randomforest สามารถจัดการกับหมวดหมู่ได้อย่างเป็นธรรมชาติรวมถึงการลดหน่วยความจำที่ตามมา ลองใช้ R.
smci

คำตอบ:


20

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

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

3) ผมขอแนะนำให้มองเข้าไปในป่าสุ่มเลือกคุณลักษณะตามโดยใช้วิธีการBrieman เสนอหรือความขัดแย้งเทียม วิธีการเปรียบเทียบความแตกต่าง (ACE) นั้นน่าสนใจเพราะมันเปรียบเทียบความสำคัญของคุณลักษณะกับความสำคัญของรุ่นที่มีการสับของตัวเองซึ่งต่อสู้กับปัญหาเชิงหัวใจบางส่วน มีรายงานฉบับใหม่ "Module Guided Random Forests" ซึ่งอาจน่าสนใจหากคุณมีคุณสมบัติมากมายเนื่องจากใช้วิธีการเลือกคุณสมบัติที่รับรู้ถึงกลุ่มของคุณสมบัติที่มีความสัมพันธ์สูง

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

มีการใช้งาน ace เกือบเสร็จสมบูรณ์ที่นี่และฉันมีการใช้งานหน่วยความจำที่รวดเร็วขึ้น / rf รวดเร็วที่จัดการตัวแปรเด็ดขาดที่นี่ ... ตัวเลือก -evaloob รองรับตัวเลือก 4 ฉันกำลังทำงานเพื่อเพิ่มการสนับสนุนสำหรับ ACE และ rf คู่อื่น ๆ วิธีการเลือกตามคุณสมบัติ แต่ยังไม่ได้ดำเนินการ


4
ข้อเสนอแนะทั้งหมดนี้น่าสนใจฉันยอมรับว่าป่าสุ่มควรจัดการตัวแปรที่มีตัวตนตามธรรมชาติ แต่ scikit-Learn ไม่ได้ ... ฉันคิดว่านั่นเป็นข้อบกพร่องหลักของ scikit btw ฉันจะลองรหัสของคุณกับข้อมูลของฉันเพื่อดูว่าเกิดอะไรขึ้นและฉันจะดูเกี่ยวกับคำแนะนำอื่น ๆ ของคุณ!
Bertrand R

1
ลองใช้การติดตั้ง R วิ่งเป็นซับเดียว การอ่านข้อมูลนั้นง่ายมากและมีการใช้งานparalellแบบใหม่ซึ่งเห็นได้อย่างรวดเร็วและมีประสิทธิภาพของหน่วยความจำ: r-bloggers.com/ในทางกลับกัน ชั้นเรียนของคุณไม่สมดุลหรือไม่? ในการใช้ r คุณสามารถปลูกต้นไม้แต่ละต้นได้จากตัวอย่าง bootstrap ที่มีความสมดุล sampsize = c (x, x) สิ่งนี้ทำให้การจำแนกไบนารีที่ดีขึ้นสำหรับฉัน คุณสามารถเล่นกับขนาดและปรับการจัดประเภทได้อย่างง่ายดายโดยใช้ OOB confusion matrix outputs
JEquihua

2
การนำไปใช้งานแบบสุ่มของป่า R ช่วยให้ปัจจัยที่มีมากถึง 32 ระดับ scikit-learn นั้นมีข้อ จำกัด น้อยกว่าให้คุณสร้างตัวแปรดัมมี่เป็นครั้งแรก (ดูpandas.get_dummiesฟังก์ชัน) การใช้ฟอเรสต์แบบสุ่มของ H2O นั้นทำได้ดีมากสำหรับฉัน (ดู0xdata.com/docs/master/model/rf )
Alex Woolford

1
มีการใช้ฟอเรสต์แบบสุ่มที่ใหม่และเร็วกว่าแพคเกจนี้เรียกว่าแรนเจอร์ สิ่งที่ยอดเยี่ยมจริงๆ ลำดับความสำคัญเร็วขึ้นและไม่มีขีด จำกัด 32 ระดับ
marbel

6

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


1
สิ่งนี้เป็นสิ่งที่ดีสำหรับคุณลักษณะที่เป็นหมวดหมู่โดยมี n <= 3 ซึ่งคุณสามารถสร้างแยกได้เหมือนกันทั้งหมดโดยพิจารณาจากคุณลักษณะนั้นเป็นหมวดหมู่ สำหรับ n ที่มีขนาดใหญ่ขึ้นเป็นไปได้ที่จะบรรลุชุดของการแยกที่เทียบเท่ากับการแบ่งหมวดหมู่ แต่อัลกอริทึมอาจหรือไม่อาจหาได้อย่างมีประสิทธิภาพ ... อย่างไรก็ตามถ้าคุณแยกคุณลักษณะนี้เป็นคุณลักษณะเชิงตัวเลขคุณจะลดประสิทธิภาพด้วย อัลกอริทึมสามารถค้นหาแยก มีคนต้องการเพิ่มการสนับสนุนตัวแปรเด็ดขาดลงในการใช้งาน Scikit-Learn เนื่องจากเป็นอย่างอื่น
Ryan Bressler

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

4
ฉันมีการอภิปรายนานเกี่ยวกับคำถามนี้ในรายชื่อผู้รับจดหมาย Sklearn (คุณสามารถอ่านบางส่วนได้ที่นี่: mail-archive.com/scikit-learn-general@lists.sourceforge.net/ ) ความคิดเห็นของผู้ดำเนินการรายหนึ่งคือต้นไม้ที่มีความลึกเพียงพอคุณสมบัติการจัดหมวดหมู่ที่มีการเข้ารหัสตามลำดับอาจทำงานได้ดีพอสมควร (นอกเหนือจากการเพิ่มประสิทธิภาพการคำนวณ) อย่างไรก็ตามถ้าคุณลองฉันจะสนใจมากที่จะได้ยินเกี่ยวกับผลลัพธ์ / ข้อสรุปของคุณเนื่องจากนี่เป็นปัญหาที่ฉันพยายามชน
cjauvin

1
ดังนั้นฉันจึงพยายามที่จะเก็บตัวแปรตัวเลขตัวเดียวสำหรับตัวที่จัดหมวดหมู่และมันใช้งานได้ดีอย่างน่าประหลาดใจและดีกว่าการเพิ่มรายการเลขฐานสองจำนวนมาก ... ฉันยังพยายามเรียงลำดับค่าตามค่าเฉลี่ยของ wrt ไปยังเป้าหมาย . และใช้งานได้ดีเช่นกัน
เบอร์แทรนด์ R

ฉันไม่แปลกใจเลยที่จริง .. มันสอดคล้องกับสิ่งที่ฉันสังเกตเห็นในการตั้งค่าที่แตกต่างกันสองอย่างแม้ว่าจะตัดสินจากจำนวน upvotes นี่เป็นแนวคิดที่ค่อนข้างใช้งานง่าย
cjauvin

5

ฉันคิดว่าคุณควรพิจารณา / เพิ่มเติมเทคนิคการลดตัวแปร (s) มันกำจัดตัวทำนายที่ไม่ได้มีอิทธิพล

ฉันได้อ่านข้อมูลมากมายเกี่ยวกับการประมวลผลล่วงหน้าและเป็นวิธีแก้ปัญหาที่ยอดเยี่ยมในการลดตัวแปร n °ของคุณ

คำแนะนำของฉันมีดังนี้:

  • สำหรับตัวแปรเชิงคุณภาพแทนที่ค่าที่หายไปด้วยหมวดหมู่ "หายไป" มันสามารถแนะนำอคติหากข้อมูลไม่ได้หายไปโดยการสุ่ม แต่อย่างน้อยคุณจะมีข้อสังเกตทั้งหมดของคุณครบถ้วนและความหายไปอาจเปิดเผยพฤติกรรมที่แตกต่าง
  • กำจัดตัวทำนายค่าความแปรปรวนเป็นศูนย์หรือตัวทำนายค่าความแปรปรวนใกล้ศูนย์ (ระวังไม่ให้กำจัดตัวแปรจำลองที่มีหมวดหมู่ที่ไม่สมดุลสูงซึ่งสามารถแยกค่า Y ของคุณได้อย่างมีประสิทธิภาพทำกราฟสำหรับตัวแปรที่คุณคิดว่าสำคัญ) ใน R คุณสามารถใช้'nzv'ฟังก์ชั่นจาก'caret'แพ็คเกจ นี่จะลดขนาดข้อมูลของคุณอย่างมาก
  • กำจัดตัวพยากรณ์ที่สัมพันธ์กัน ใช้เมทริกซ์สหสัมพันธ์ของเคนดัลล์เพราะมันเหมาะสมกว่าที่จะสร้างต่อเมื่อมีตัวแปรเด็ดขาด ข้อเสียคือคุณต้องเปลี่ยน vars เล็กน้อยทั้งหมดของคุณให้เป็นประเภทเด็ดขาด
  • มีวิธีการเลือกคุณสมบัติที่จะลดจำนวนได้มากขึ้น (การจัดกลุ่ม - คุณเลือกตัวแทนเดียวของแต่ละกลุ่ม, การถดถอย LASSO, ฯลฯ ... ) ฉันยังไม่ได้มีโอกาสทดสอบพวกเขาเพราะขั้นตอนอื่น ๆ ทำให้ตัวแปรของฉันต่ำกว่า 100

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

ฉันหวังว่ามันจะช่วยได้เล็กน้อย โชคดี


4

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


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

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

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


0

คุณควรดูแพ็คเกจH2O.ai มันจัดการตัวแปรเด็ดขาดออกจากกล่องโดยไม่ต้องทำการเข้ารหัสใด ๆ (ตรวจสอบให้แน่ใจว่าตัวแปรเป็นปัจจัย)

ฉันชอบการใช้งาน Gradient Boosted Machine (GBM) เป็นพิเศษเพราะคุณสามารถดูความสำคัญของตัวแปรหลังจากสร้างแบบจำลอง GBM ยังมีคุณสมบัติที่ดีในการต้านทานการ overfitting

หากคุณต้องการสำรวจรุ่นอื่น ๆ พวกเขามี: GLM, Random Forest, Naive Bayes, Deep Learning, และอื่น ๆ

ดู: http://docs.h2o.ai/h2o/latest-stable/h2o-docs/data-science/gbm.html

นอกจากนี้ยังติดตั้งง่าย (Windows, Linux, Mac) และใช้งานได้ง่ายด้วย API ที่ใช้ R, Python, Java และ Scala

สามารถใช้หลายแกนประมวลผลเพื่อเร่งความเร็ว

ในอนาคตอันใกล้พวกเขาจะสนับสนุน GPU

นอกจากนี้ยังเป็นโอเพ่นซอร์สและฟรี (มีการสนับสนุนองค์กร)

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