R caret และ NAs


26

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


3
คุณต้องทำอะไรบางอย่างที่มีค่าขาดหายไป ฉันต้องบอกว่าฉันไม่เข้าใจคำถามของคุณจริงๆ - คุณกำลังมองหาวิธีหนึ่งขนาดพอดีทั้งหมด .. ? หากคุณไม่ต้องการที่จะใส่ชื่อ NA คุณต้องการทำอะไรกับพวกเขา ลบ?
ทิม

1
ฉันต้องการออกจากที่นั่นและปล่อยให้เป็นแบบอย่างเพื่อรับมือกับ NAs ถ้าฉันใช้ฟังก์ชัน C5.0 ใน C50 มันสามารถรับมือกับ NAs เองได้ แต่ในกรณีนี้ฉันไม่สามารถใช้คาเร็ตได้เนื่องจากฟังก์ชั่นรถไฟของคาเร็ตไม่อนุญาตให้มี NA ในชุดข้อมูลแม้ว่าฉันจะต้องการใช้ C5 0 ฟังก์ชั่นของ C50 ที่กล่าวถึงข้างต้น
Fredrik

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

3
คุณแน่ใจหรือไม่ว่า caret ไม่อนุญาตให้ใช้ NAs ฉันได้ลองแนะนำ NA ด้วยตัวอย่างเริ่มต้นในหน้าช่วยเหลือรถไฟและด้วยวิธีการรถไฟ C5.0 ที่ใช้งานได้ดี มันล้มเหลวด้วยป่าสุ่ม
mpiktas

คำตอบ:


32

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

train(formula,
      dataset,
      method = "C5.0",
      na.action = na.pass)

ในกรณีนี้ C5.0 จะจัดการกับค่าที่ขาดหายไปด้วยตัวเอง


1
นี่คือการสนทนาที่น่าสนใจ อะไรคือความผิดพลาดของการเพิ่ม NA ในระดับอื่นให้กับตัวพยากรณ์หมวดหมู่? ถ้า NAs ไม่สามารถจำลองหรือใส่ความหมายได้นั่นคือการไม่มีอยู่จริงนั้นเป็นข้อมูลจริง ๆ แล้วดูเหมือนว่าการทำให้ NA เป็นระดับเพิ่มเติมนั้นสมเหตุสมผลหรือไม่
Seanosapien

หากใช้ x ข้อมูลจำเพาะของ y ในtrainการมีna.action = na.passชุดตัวเลือกจะทำให้เกิดข้อผิดพลาดต่อไปนี้:Something is wrong; all the RMSE metric values are missing
29609

3

คุณลองเข้ารหัส NAs อีกครั้งหรือไม่ บางอย่าง> 3 ส่วนเบี่ยงเบนมาตรฐานนอกข้อมูลของคุณ (เช่น -12345) ควรสนับสนุน C5.0 เพื่อทำนายพวกมันแยกกันเช่นเดียวกับ NAs


2

ฉันคิดว่าวิธีแก้ปัญหาของคุณคือการกำหนดค่าในขณะที่ใช้ฟังก์ชันทำนาย ()

ดู?predict.trainรายละเอียดเพิ่มเติมได้ที่

คุณสามารถใช้na.omitเพื่อให้เครื่องหมายรูปหมวกใส่ค่า ตัวอย่างเช่น:

    ## S3 method for class 'train':
    predict((object, newdata = NULL, type = "raw", na.action = na.omit, ...)

จากhttp://www.inside-r.org/packages/cran/caret/docs/predict.train

วิธีแก้ปัญหาอื่นคือการใส่ร้ายขณะประมวลผลข้อมูลล่วงหน้า :

    ## S3 method for class 'default':
    preProcess(x, 
       method = "knnImpute",   # or *bagImpute* / *medianImpute*
       pcaComp = 10,
       na.remove = TRUE,
       k = 5,
       knnSummary = mean,
       outcome = NULL,
       fudge = .2,
       numUnique = 3,
       verbose = TRUE,
       )

จากhttp://www.inside-r.org/node/86978

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