ฟอเรสต์แบบสุ่ม: จะจัดการระดับปัจจัยใหม่ในชุดทดสอบอย่างไร


13

ฉันกำลังพยายามทำนายโดยใช้โมเดลฟอเรสต์แบบสุ่มในอาร์

อย่างไรก็ตามฉันได้รับข้อผิดพลาดเนื่องจากปัจจัยบางอย่างมีค่าแตกต่างกันในชุดทดสอบมากกว่าในชุดฝึกอบรม ตัวอย่างเช่นปัจจัยCat_2มีค่า34, 68, 76ฯลฯ ในชุดทดสอบที่ไม่ปรากฏในชุดฝึกอบรม น่าเสียดายที่ฉันไม่สามารถควบคุมชุดทดสอบ ... ฉันต้องใช้มันตามที่เป็นอยู่

as.numeric()วิธีแก้ปัญหาเดียวของฉันคือการแปลงปัจจัยที่มีปัญหากลับไปเป็นค่าตัวเลขที่ใช้ มันใช้งานได้แต่ฉันไม่พอใจมากเนื่องจากค่าเหล่านี้เป็นรหัสที่ไม่มีความรู้สึกเชิงตัวเลข ...

คุณคิดว่าจะมีวิธีแก้ไขปัญหาอื่นหรือไม่เพื่อลดค่าใหม่จากชุดทดสอบ แต่ไม่มีการลบค่าปัจจัยอื่น ๆ ทั้งหมด (เช่นค่าการบอกกล่าว1, 2, 14, 32ฯลฯ ) ซึ่งมีทั้งในการฝึกอบรมและการทดสอบและมีข้อมูลที่อาจเป็นประโยชน์สำหรับการคาดการณ์


1
ฉันเห็นเหตุผลว่าทำไมค่าในการทดสอบจะต้องอยู่ในชุดการฝึกอบรม แนวคิดของการจัดหมวดหมู่คือการใช้ข้อมูลการฝึกอบรมเพื่อให้ได้แนวคิดของความหนาแน่นแบบมีเงื่อนไขในชั้นเรียน คุณไม่ได้เห็นคุณค่าที่เป็นไปได้ทุกประการจากความหนาแน่น ฉันเป็นตัวแปรที่ใช้ในทรี ona แยกแล้วแยกกำหนดสาขาที่จะปฏิบัติตามสำหรับค่าที่มองไม่เห็นใด ๆ เช่นเดียวกับที่ได้รับการเห็น
Michael R. Chernick

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

คล้ายกับคำถามของฉันที่นี่: stats.stackexchange.com/questions/18004/... ฉันคิดว่าฉันอาจใช้ GBM แทน RF เนื่องจากดูเหมือนว่าจะจัดการกับระดับปัจจัยใหม่ที่ดีกว่า คุณได้ดูการใช้คลื่นความถี่วิทยุด้วยหรือไม่? ฉันไม่เคยชอบสุ่มตัวอย่างป่าเพราะปัญหาเหล่านี้ (และไม่สามารถที่จะจัดการกับค่าที่ขาดหายไป)
B_Miner

คำตอบ:


2

หากชุดทดสอบมีจุดเหล่านี้จำนวนมากพร้อมค่าปัจจัยใหม่ฉันไม่แน่ใจว่าวิธีการที่ดีที่สุดคืออะไร หากเป็นเพียงไม่กี่จุดคุณอาจหลีกเลี่ยงสิ่งที่ไม่เหมาะสมเช่นการรักษาระดับปัจจัยที่ผิดพลาดให้เป็นข้อมูลที่ขาดหายไปและใส่เข้าไปในสิ่งที่คุณเห็นว่าเหมาะสม การนำไปปฏิบัติ R มีสองวิธีในการใส่ข้อมูลที่ขาดหายไปคุณเพียงแค่ต้องตั้งค่าระดับปัจจัยเหล่านี้เป็น NA เพื่อระบุว่าขาดหายไป


8

KingและBonoitตัวอย่างนี้มีประโยชน์ในการประสานระดับ:

for(attr in colnames(training))
{
  if (is.factor(training[[attr]]))
  {
    new.levels <- setdiff(levels(training[[attr]]), levels(testing[[attr]]))
    if ( length(new.levels) == 0 )
    { print(paste(attr, '- no new levels')) }
    else
    {
      print(c(paste(attr, length(new.levels), 'of new levels, e.g.'), head(new.levels, 2)))
      levels(testing[[attr]]) <- union(levels(testing[[attr]]), levels(training[[attr]]))
    }
  }
}

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


4

นี่คือรหัสที่ฉันเขียนที่ตอบการตอบกลับของ @ King ด้านบน มันแก้ไขข้อผิดพลาด:

# loops through factors and standardizes the levels
for (f in 1:length(names(trainingDataSet))) {
    if (levels(testDataSet[,f]) > levels(trainingDataSet[,f])) {    
            levels(testDataSet[,f]) = levels(trainingDataSet[,f])       
    } else {
            levels(trainingDataSetSMOTEpred[,f]) = levels(testDataSet[,f])      
    }
}

สวัสดี @ifarb ฉันพยายามที่จะเข้าใจวิธีการแก้ปัญหาของคุณ: การฝึกอบรมอะไร DataSetSMOTEpred และที่กำหนดไว้ในรหัส?
Kasia Kulma

3

ชุดทดสอบและชุดฝึกควรรวมกันเป็นชุดเดียวจากนั้นเปลี่ยนระดับของชุดฝึกอบรม รหัสของฉันคือ:

totalData <- rbind(trainData, testData)
for (f in 1:length(names(totalData))) {
  levels(trainData[, f]) <- levels(totalData[, f])
}

สามารถใช้งานได้ในทุกกรณีที่มีจำนวนระดับของการทดสอบมากกว่าหรือน้อยกว่าการฝึกอบรม


2

ฉันมีวิธีแก้ปัญหาหมัดเมื่อฉันใช้ randomForest ในอาร์มันอาจจะไม่ใช่เสียงในทางทฤษฎี แต่มันก็ทำงานได้

levels(testSet$Cat_2) = levels(trainingSet$Cat_2)

หรือรอบทางอื่น ๆ โดยพื้นฐานแล้วมันจะบอกให้ R ว่ามันเป็นค่าที่ถูกต้องเพียงว่ามี 0 ราย; ดังนั้นหยุด bugging ฉันเกี่ยวกับข้อผิดพลาด

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


แต่สิ่งนี้ไม่ทำงานหากจำนวนของระดับในการทดสอบมากกว่าการฝึกอบรม ใช้งานได้เฉพาะในกรณีที่ระดับปัจจัยข้อมูลทดสอบเป็น <= ระดับปัจจัยข้อมูลการฝึกอบรม
KarthikS

1

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

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