การใช้การตรวจสอบความถูกต้องข้ามของ k-fold สำหรับการเลือกรุ่นของอนุกรมเวลา


70

คำถาม: ฉันต้องการความมั่นใจในบางสิ่งบางอย่างการใช้การตรวจสอบความถูกต้องข้ามของ k-fold กับอนุกรมเวลานั้นตรงไปตรงมาหรือไม่หรือเราจำเป็นต้องให้ความสนใจเป็นพิเศษก่อนใช้งานหรือไม่

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

  • พับ 1: ฝึก [1 2 3 4 5] ทดสอบ [6]
  • เท่าที่ 2: การฝึก [1 2 3 4 6] ทดสอบ [5]
  • เท่า 3: การฝึก [1 2 3 5 6] ทดสอบ [4]
  • พับ 4: ฝึก [1 2 4 5 6] ทดสอบ [3]
  • พับ 5: ฝึก [1 3 4 5 6] ทดสอบ [2]
  • พับ 6: ฝึก [2 3 4 5 6] ทดสอบ [1]

ฉันตั้งสมมติฐานว่าในแต่ละปีมีความเป็นอิสระจากกัน ฉันจะยืนยันได้อย่างไร มีการอ้างอิงใด ๆ ที่แสดงถึงการบังคับใช้ของการตรวจสอบความถูกต้องข้ามของ k-fold กับอนุกรมเวลาหรือไม่


ลองดูที่บทความนี้ซึ่งฉันพบว่ามีประโยชน์francescopochetti.com/
Henok S Mengistu

คำตอบ:


69

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

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

  • พับ 1: ฝึก [1], ทดสอบ [2]
  • พับ 2: ฝึก [1 2], ทดสอบ [3]
  • เท่า 3: การฝึก [1 2 3] ทดสอบ [4]
  • พับ 4: ฝึก [1 2 3 4] ทดสอบ [5]
  • พับ 5: ฝึก [1 2 3 4 5] ทดสอบ [6]

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


1
ขอบคุณ ฉันเข้าใจเหมือนที่ Zach กล่าวว่าเป็นวิธีที่ยอมรับได้ และฉันเข้าใจว่าทำไม ปัญหาที่ฉันมีก็คือความจริงที่ว่ามันจะคำนึงถึงความแปรปรวนของขนาดข้อมูลดังนั้นฉันจะไม่ได้รับข้อผิดพลาดการวางนัยทั่วไป "ที่แท้จริง" ของโมเดลของฉัน แต่ข้อผิดพลาดแบบผสม: ลักษณะทั่วไปและขนาดข้อมูล คุณรู้หรือไม่อ้างอิงอื่น ๆ (นอกเหนือจาก M.Hyndman) ที่จัดการกับการตรวจสอบข้ามในอนุกรมเวลา? อย่าเข้าใจฉันผิดมันไม่ใช่ฉันไม่ไว้วางใจในสิ่งที่คุณพูดและสิ่งที่ M. Hyndman กำลังพูดอยู่นั้นทำให้รู้สึกสมบูรณ์แบบ ฉันชอบที่จะมีมุมมองที่หลากหลายเกี่ยวกับปัญหา
Mickaël S

ฉันเกรงว่าฉันจะไม่รู้จักการอ้างอิงดังกล่าว แต่ฉันสนใจที่จะเห็นใครสักคนถ้าคนอื่นรู้
Ken Williams

1
@ เวย์นฉันหมายถึงว่าวิธีนี้ใช้ข้อมูลการฝึกอบรมมากขึ้นทุกปี ในข้อมูลของฉันมีความแตกต่างอย่างแน่นอนระหว่างปี แต่ไม่มีแนวโน้มหรือฤดูกาลที่ชัดเจน
Mickaël S

3
@Mickael: คุณสามารถใช้ fold 1: ฝึก [1 2] ทดสอบ [3]; พับ 2: ฝึก [2 3] ทดสอบ [4]; เท่าที่ 3: ฝึก [3 4] ทดสอบ [5] ฯลฯ ถ้าคุณกังวลเกี่ยวกับการใช้ข้อมูลมากขึ้นทุกครั้ง ฉันเดาว่าด้วยเทคนิคกึ่ง MC คุณไม่สามารถช่วงชิงปีที่ผ่านมาแม้ว่าจะไม่มีแนวโน้ม
เวย์น

3
@ MickaëlS: ฉันพบบทความนี้sciencedirect.com/science/article/pii/S0020025511006773และคิดว่ามันน่าสนใจ พวกเขาเปรียบเทียบวิธีการ 'มาตรฐาน' กับอีกสองวิธี - 'เพิ่มบล็อก' และวิธีการ 'ออกจากพึ่งพา'
thebigdog

26

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

ในการทำให้สิ่งต่าง ๆ เป็นธรรมชาตินี่คือภาพเหมือนกัน:

ป้อนคำอธิบายรูปภาพที่นี่

รหัส R ที่เทียบเท่าจะเป็น:

i <- 36    #### Starting with 3 years of monthly training data 
pred_ets <- c()
pred_arima <- c()
while(i <= nrow(dt)){
  ts <- ts(dt[1:i, "Amount"], start=c(2001, 12), frequency=12)

  pred_ets <- rbind(pred_ets, data.frame(forecast(ets(ts), 3)$mean[1:3]))
	  pred_arima <- rbind(pred_arima, data.frame(forecast(auto.arima(ts), 3)$mean[1:3]))

  i = i + 3
}
names(pred_arima) <- "arima"
names(pred_ets) <- "ets"

pred_ets <- ts(pred_ets$ets, start=c(2005, 01), frequency = 12)
	pred_arima <- ts(pred_arima$arima, start=c(2005, 01), frequency =12)

accuracy(pred_ets, ts_dt)
accuracy(pred_arima, ts_dt)

มีวิธีใดที่จะทำเช่นนี้สำหรับวิธีการเช่นการถดถอยโลจิสติกโดยใช้ R หรือไม่?
hlyates

1
@hlyates ในความเข้าใจของฉันเป็นไปได้คุณเพียงแค่ต้องแก้ไขโค้ดข้างต้นเล็กน้อย รวม pred_lr (การทำนายโดยการถดถอยโลจิสติก) และเปลี่ยนชื่อของคอลัมน์ตามลำดับ
Jatin Garg

22

วิธี "canonical" ในการทำ cross-validation (อย่างน้อยตามที่อธิบายโดย @Rob Hyndman) คือ "roll" ผ่านชุดข้อมูล

เช่น:

  • พับ 1: ฝึก [1], ทดสอบ [2]
  • พับ 2: ฝึก [1 2], ทดสอบ [3]
  • เท่า 3: การฝึก [1 2 3] ทดสอบ [4]
  • พับ 4: ฝึก [1 2 3 4] ทดสอบ [5]
  • พับ 5: ฝึก [1 2 3 4 5] ทดสอบ [6]

โดยทั่วไปชุดฝึกอบรมของคุณไม่ควรมีข้อมูลที่เกิดขึ้นหลังจากชุดทดสอบ


13

ไม่มีอะไรผิดปกติกับการใช้บล็อกของข้อมูล "ในอนาคต" สำหรับการตรวจสอบข้ามเวลาในสถานการณ์ส่วนใหญ่ ตามสถานการณ์ส่วนใหญ่ฉันอ้างถึงแบบจำลองสำหรับข้อมูลนิ่งซึ่งเป็นรูปแบบที่เรามักจะใช้ เช่นเมื่อคุณใส่ , ด้วยถึงหนึ่งชุดคุณจะได้ชุดที่แตกต่างและพอดีกับแบบจำลองสำหรับข้อมูลนิ่งกับส่วนที่เหลือd > 0 dARIMA(p,d,q)d>0d

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

วิธีการนี้เรียกว่าการตรวจสอบความถูกต้องไขว้ของ (ปล่อยออก, ลบการสังเกตที่ด้านข้างของตัวอย่างทดสอบ) และอธิบายไว้ในบทความนี้ ในตัวอย่างของคุณนี่จะเป็นดังนี้:v ชั่วโมงhvvh

  • พับ 1: ฝึก [1 2 3 4 5 ชม.] ทดสอบ [6]
  • พับ 2: ฝึก [1 2 3 4 ชม. h6], ทดสอบ [5]
  • พับ 3: ฝึก [1 2 3 ชม. h5 6], ทดสอบ [4]
  • พับ 4: ฝึก [1 2 ชม. h4 5 6] ทดสอบ [3]
  • พับ 5: ฝึก [1 ชม. h3 4 5 6] ทดสอบ [2]
  • พับ 6: ฝึก [h2 3 4 5 6] ทดสอบ [1]

โดยที่ h บ่งชี้ว่าการสังเกต h ของตัวอย่างการฝึกอบรมถูกลบออกทางด้านนั้น


3

ตามที่แสดงความคิดเห็นโดย @thebigdog "ในการใช้ cross-validation สำหรับการประเมินผลการทำนายอนุกรมเวลา" โดย Bergmeir และคณะ กล่าวถึงการตรวจสอบข้ามในบริบทของอนุกรมเวลาที่อยู่กับที่และกำหนด Forward Chaining (ที่เสนอโดยผู้ตอบคำถามอื่น) เพื่อช่วยเหลือ หมายเหตุ: การโยงไปข้างหน้าเรียกว่าการประเมินผลบล็อกสุดท้ายในบทความนี้:

การใช้การตรวจสอบความถูกต้องข้ามมาตรฐาน 5 เท่าจะไม่มีผลในทางปฏิบัติของการอ้างอิงภายในข้อมูลที่สามารถพบได้ ในทางตรงกันข้ามการประเมินผลบล็อกครั้งล่าสุดมีแนวโน้มที่จะให้ข้อผิดพลาดที่มีประสิทธิภาพน้อยกว่าการตรวจสอบข้ามและการตรวจสอบข้ามที่ถูกบล็อก

"การประเมินแบบจำลองการพยากรณ์อนุกรมเวลา: การศึกษาเชิงประจักษ์เกี่ยวกับวิธีการประมาณค่าประสิทธิภาพ " โดย Cerqueira et al. เห็นด้วยกับการประเมินนี้ อย่างไรก็ตามสำหรับอนุกรมเวลาที่ไม่หยุดนิ่งพวกเขาแนะนำให้ใช้การเปลี่ยนแปลงในการพักสายเรียกว่า Rep-Holdout แทน ใน Rep-Holdout จุดaจะถูกเลือกในอนุกรมเวลาYเพื่อทำเครื่องหมายจุดเริ่มต้นของข้อมูลการทดสอบ จุดaถูกกำหนดให้อยู่ภายในหน้าต่าง นี่คือตัวอย่างในรูปด้านล่าง:

ภาพประกอบ

กระดาษดังกล่าวนี้มีความยาวและละเอียดถี่ถ้วนทดสอบเกือบทุกวิธีการอื่น ๆ ที่กล่าวถึงในคำตอบของคำถามนี้กับรหัสที่เปิดเผยต่อสาธารณชน ซึ่งรวมถึงการเรียกร้อง @Matthias Schmidtblaicher ของการรวมช่องว่างก่อนและหลังข้อมูลการทดสอบ นอกจากนี้ฉันได้สรุปรายงานเท่านั้น บทสรุปที่แท้จริงของบทความนี้เกี่ยวข้องกับแผนผังการตัดสินใจสำหรับการประเมินแบบจำลองอนุกรมเวลา!

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