ป่าสุ่มของ R ไม่สามารถจัดการได้มากกว่า 32 ระดับ วิธีแก้ปัญหาคืออะไร


22

แพ็คเกจสุ่มป่าของ R ไม่สามารถจัดการกับปัจจัยที่มีมากกว่า 32 ระดับ เมื่อได้รับมากกว่า 32 ระดับจะส่งข้อความแจ้งข้อผิดพลาด:

ไม่สามารถจัดการตัวทำนายเชิงหมวดหมู่ที่มีมากกว่า 32 หมวดหมู่

แต่ข้อมูลที่ฉันมีมีหลายปัจจัย บางอันมี 1,000+ ระดับและบางอันมี 100+ ระดับ มันยังมี 'สถานะ' ของสหรัฐอเมริกาซึ่งก็คือ 52

ดังนั้นนี่คือคำถามของฉัน

  1. ทำไมถึงมีข้อ จำกัด เช่นนี้? RandomForest ปฏิเสธที่จะเรียกใช้แม้ในกรณีง่าย ๆ

    > d <- data.frame(x=factor(1:50), y=1:50)
    > randomForest(y ~ x, data=d)
      Error in randomForest.default(m, y, ...) : 
      Can not handle categorical predictors with more than 32 categories.
    

    หากเป็นเพราะข้อ จำกัด ของหน่วยความจำ scikit เรียนรู้วิธีการเรียนรู้แบบสุ่มของผู้ทดสอบการเรียกใช้ที่มีมากกว่า 32 ระดับ

  2. วิธีที่ดีที่สุดในการจัดการปัญหานี้คืออะไร สมมติว่าฉันมีตัวแปรอิสระ X1, X2, ... , X50 และ Y เป็นตัวแปรตาม และสมมติว่า X1, X2 และ X3 มีมากกว่า 32 ระดับ ฉันควรทำอย่างไร?

    สิ่งที่ฉันคิดคือการใช้อัลกอริทึมการจัดกลุ่มสำหรับแต่ละ X1, X2 และ X3 ที่ระยะทางถูกกำหนดเป็นความแตกต่างใน Y ฉันจะเรียกใช้การจัดกลุ่มสามกลุ่มเนื่องจากมีตัวแปรที่มีปัญหาสามตัว และในการจัดกลุ่มแต่ละครั้งฉันหวังว่าฉันสามารถหาระดับที่คล้ายกัน และฉันจะรวมพวกเขา

    เสียงนี้เป็นอย่างไร


การค้นหาเว็บด้วยชื่อแพ็กเกจและข้อความแสดงข้อผิดพลาดให้คำตอบบางอย่าง
Roland

5
@Roland ที่จริงมันทำให้ฉันที่นี่ ...
isomorphismes

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

2
UPDATE: ตั้งแต่รุ่น 4.6-9 randomForestสามารถจัดการตัวทำนายตามหมวดหมู่ได้ถึง 53 ระดับ ข่าว
Ben

ฟอเรสต์แบบสุ่มของ R กำหนดจำนวนระดับได้อย่างไร ฉันเดาว่าระดับหมายถึงหมวดหมู่
ajp

คำตอบ:


25

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

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

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

อาจเป็นไปได้ว่าแต่ละรัฐนั้นเป็นเอนทิตีที่แยกและไม่เกี่ยวข้องซึ่งต้องการโมเดลแยกต่างหากสำหรับตัวมันเอง

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


4
มันสามารถเคลื่อนย้ายไปมาได้อย่างง่ายดายแม้ในลักษณะที่น่าเบื่อเล็กน้อย ตัวอย่างเช่นหากคุณมีระดับระหว่าง 33 ถึง 1024 ให้สร้างสองปัจจัยแต่ละระดับ <= 32
KalEl

15

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

01[0;2M-1]

ทำไมการใช้งานจาก Weka และ Python จึงใช้งานได้?

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

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

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


2
ขอบคุณมาก! มันเป็นไปตามคำตอบของคุณหรือไม่ว่าการดำเนินการของ R ในการรักษาค่าหมวดหมู่นั้นดีกว่าของ Python (ผมจำได้ว่า Max Kuhn กล่าวถึงการจัดกลุ่มตัวแปรหมวดหมู่สำหรับ RF ให้ผลลัพธ์ที่ดีกว่าเล็กน้อย หลามฉันมีโอกาสที่ดีมากที่จะได้ผลลัพธ์ที่แตกต่าง (ความถูกต้องและอื่น ๆ )? จากประสบการณ์ของคุณเมื่อสร้างแบบจำลองมันทำให้รู้สึกว่าลองทั้ง vars grouping (ใน R) และทำให้เป็นจริงโดยการทำให้พวกมันบ้าและจากนั้นเปรียบเทียบสองแนวทาง
Sergey Bushmanov

2
การเข้ารหัสแบบจำลองใช้งานได้ แต่สามารถสร้างหมวดหมู่เดียวได้ทั้งหมด หลังจากการเข้ารหัสตัวแปรจะถูกทดสอบทีละครั้ง ดังนั้นจึงเป็นไปไม่ได้ที่จะนำมาใช้ในการ twoing หากคุณสมบัตินี้สามารถช่วยได้ฉันคิดว่าในทางปฏิบัติแล้วไม่มีความแตกต่างใหญ่อะไร อย่างไรก็ตามมีสิ่งอื่น ๆ ที่อาจต้องให้ความสนใจเมื่อทำงานกับความสำคัญของตัวแปร: การใช้งานบางอย่างจะมีอคติต่อหมวดหมู่ที่มีหลายระดับ ดูเอกสาร Carolin Strobl สำหรับรายละเอียด: statistik.uni-dortmund.de/useR-2008/slides/Strobl+Zeileis.pdf ใน R มีการใช้งานบางอย่างที่ไม่มีอคตินี้
rapaio

2

คุณอาจลองแทนว่าคอลัมน์หนึ่งแตกต่างกัน คุณสามารถแสดงข้อมูลเดียวกันกับฐานข้อมูลแบบกระจัดกระจาย

รหัสที่ทำงานได้ขั้นต่ำ;

example <- as.data.frame(c("A", "A", "B", "F", "C", "G", "C", "D", "E", "F"))
names(example) <- "strcol"

for(level in unique(example$strcol)){
      example[paste("dummy", level, sep = "_")] <- ifelse(example$strcol == level,     1, 0)
}

สังเกตว่าแต่ละค่าในคอลัมน์เดิมตอนนี้กลายเป็นคอลัมน์จำลองแยกกันอย่างไร

โค้ดตัวอย่างที่ครอบคลุมมากขึ้น

set.seed(0)
combs1 = sample.int(33, size= 10000, replace=TRUE)
combs2 = sample.int(33, size= 10000, replace=TRUE)
combs3 = combs1 * combs2 + rnorm(10000,mean=0,100)
df_hard = data.frame(y=combs3, first=factor(combs1), second=factor(combs2))

for(level in unique(df_hard$first)){
    df_hard[paste("first", level, sep = "_")] <- ifelse(df_hard$first == level, 1, 0)
}

for(level in unique(df_hard$second)){
    df_hard[paste("second", level, sep = "_")] <- ifelse(df_hard$second == level, 1, 0)
}

example$first <- NULL
example$second <- NULL

rf_mod = randomForest( y ~ ., data=example )

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

สำหรับข้อมูลเพิ่มเติมโปรดตรวจสอบ blogpost นี้:

https://blog.cloudera.com/blog/2013/02/how-to-resample-from-a-large-data-set-in-parallel-with-r-on-hadoop/


บล็อกรหัสที่สองดูสับสนแม้ว่าคุณจะใช้ df_hard ทั่วทั้งตัวในบรรทัดสุดท้ายคุณตั้งค่า "แรก" และ "สอง" เป็น NULL และใช้ "ตัวอย่าง" เป็นข้อมูลสำหรับการสุ่มซึ่งไม่เหมาะสม ฉันเนื่องจากไม่มีการเชื่อมต่อระหว่างตัวอย่างและ df_hard
Özgür

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

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

0

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


1
extraTrees มีข้อ จำกัด ในแง่ที่ว่าข้อมูลของคุณจะต้องเป็นเมทริกซ์ข้อมูลที่เป็นตัวเลขใช่ไหม
Hardik Gupta

0

ตัวเลือกอื่น: ขึ้นอยู่กับจำนวนระดับและจำนวนการสังเกตในข้อมูลของคุณคุณสามารถรวมบางระดับได้ นอกเหนือจากที่ได้รับภายใต้ขีด จำกัด มันอาจลดความแปรปรวนถ้าคุณมีหลายระดับด้วยการสังเกตเพียงไม่กี่ ฮัดลีย์ 's forcats: fct_lumpไม่นี้

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