การตรวจสอบความถูกต้องข้าม PCA และ k-fold ในชุด Caret ใน R


16

ฉันเพิ่งดูการบรรยายอีกครั้งจากหลักสูตรการเรียนรู้ของเครื่องใน Coursera ในส่วนที่อาจารย์กล่าวถึง PCA สำหรับการประมวลผลข้อมูลล่วงหน้าในแอปพลิเคชันการเรียนรู้ภายใต้การดูแลเขาบอกว่า PCA ควรจะดำเนินการกับข้อมูลการฝึกอบรมเท่านั้นและจากนั้นการทำแผนที่จะใช้ในการแปลง ดูเพิ่มเติมPCA และรถไฟ / ทดสอบแยก

อย่างไรก็ตามในcaretแพ็คเกจ R ข้อมูลการฝึกอบรมที่คุณส่งผ่านไปยังtrain()ฟังก์ชั่นนั้นได้รับการประมวลผลโดย PCA แล้ว ดังนั้นเมื่ออัลกอริทึมทำการตรวจสอบความถูกต้องของ k-fold cross ชุดการตรวจสอบความถูกต้องได้ถูกประมวลผลด้วย PCA ผ่านทางpreProcess()และpredict()ในความเป็นจริงแล้วใช้ใน PCA "fitting"

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


1
คำถามที่น่าสนใจ ศาสตราจารย์อึ้งให้เหตุผลว่าทำไม "PCA ควรทำกับข้อมูลการฝึกอบรมเท่านั้นและจากนั้นการทำแผนที่จะใช้ในการแปลงการตรวจสอบความถูกต้องและการทดสอบข้าม"? สัญชาตญาณของฉันคือผลกระทบควรน้อยที่สุดเนื่องจากข้อมูลรถไฟ / cv / test ถูกคาดการณ์ว่ามาจากการกระจายตัวแบบเดียวกันและ PCA ไม่เกี่ยวข้องกับตัวแปรเอาท์พุท / ขึ้นอยู่กับ
miura

1
@miura ใช่เขาทำ เมื่อดำเนินการ PCA เราจำเป็นต้องแก้ปัญหาสำหรับขนาดต่ำสุดจำนวน k ในเวกเตอร์ผลลัพธ์ที่จำเป็นเพื่อให้ได้ "ความแปรปรวนสะสม" ที่ต้องการ พารามิเตอร์ k ตอนนี้มีผล (ในความเข้าใจของฉัน) เป็นพารามิเตอร์พิเศษของอัลกอริทึมของเราที่เราจำเป็นต้องพอดี หากเราดำเนินการ PCA ในชุดการตรวจสอบข้ามเช่นกันเรากำลังฝึกอบรมส่วนหนึ่งของอัลกอริทึมของเราในชุด CV ดังนั้นจึงลดค่าการตรวจสอบข้าม
mchangun

ฉันคิดว่าคุณสับสน PCA และ MDS แต่ในทั้งสองวิธีคุณไม่ได้ตั้งค่าความแปรปรวนที่ต้องการ แต่คุณสามารถคำนวณได้จากการปรับที่พวกเขานำมาใช้เพื่อลดขนาด k คุณไม่จำเป็นต้องปรับให้พอดีเพราะส่วนข้อมูลแรกจะลดความแปรปรวนมากกว่าส่วนที่สองเสมอและส่วนที่สองมากกว่าส่วนที่สาม ...
llrs

คำตอบ:


18

ฉันไม่เห็นการบรรยายดังนั้นฉันไม่สามารถให้ความเห็นเกี่ยวกับสิ่งที่พูด

$ 0.02 ของฉัน: หากคุณต้องการได้รับการประเมินที่ดีโดยใช้การสุ่มใหม่คุณควรดำเนินการทั้งหมดในระหว่างการสุ่มใหม่แทนก่อนหน้านี้ นี่เป็นเรื่องจริงของการเลือกคุณสมบัติ [1] เช่นเดียวกับการทำงานที่ไม่สำคัญเช่น PCA หากเพิ่มความไม่แน่นอนให้กับผลลัพธ์ให้รวมไว้ในการสุ่มใหม่

คิดเกี่ยวกับการถดถอยองค์ประกอบหลัก: PCA ตามด้วยการถดถอยเชิงเส้นในองค์ประกอบบางส่วน PCA ประมาณการพารามิเตอร์ (ด้วยเสียงรบกวน) และจำนวนของส่วนประกอบที่ต้องเลือกด้วย (ค่าที่แตกต่างกันจะส่งผลให้ผลลัพธ์ที่แตกต่างกัน => เสียงดังขึ้น)

สมมติว่าเราใช้ CV 10 เท่ากับแบบแผน 1:

conduct PCA
pick the number of components
for each fold:
   split data
   fit linear regression on the 90% used for training
   predict the 10% held out
end:

หรือแบบแผน 2:

for each fold:
   split data
   conduct PCA on the 90% used for training
   pick the number of components
   fit linear regression
   predict the 10% held out
end:

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

ฉันมีความผิดที่จะไม่ทำการดำเนินการทั้งหมดด้วยการสุ่มใหม่ แต่ก็ต่อเมื่อฉันไม่สนใจเกี่ยวกับการประเมินประสิทธิภาพ (ซึ่งผิดปกติ)

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

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

@mchangun: ฉันคิดว่าจำนวนขององค์ประกอบเป็นพารามิเตอร์การปรับแต่งและคุณอาจต้องการที่จะเลือกโดยใช้การประมาณประสิทธิภาพที่สามารถใช้งานได้ คุณสามารถเลือก K โดยอัตโนมัติซึ่งอธิบายอย่างน้อย X% ของความแปรปรวนและรวมกระบวนการดังกล่าวไว้ในการสุ่มตัวอย่างอีกครั้งดังนั้นเราจึงคำนึงถึงเสียงรบกวนในกระบวนการนั้น

แม็กซ์

[1] Ambroise, C. , & McLachlan, G. (2002) การคัดเลือกอคติในการสกัดยีนบนพื้นฐานของข้อมูลการแสดงออกของยีน microarray กิจการของ National Academy of Sciences, 99 (10), 6562–6566


21

อย่าประมวลผลข้อมูลล่วงหน้าก่อนใช้งานtrainฟังก์ชัน! ใช้preProcess อาร์กิวเมนต์สำหรับฟังก์ชันรถไฟและการประมวลผลล่วงหน้าจะถูกนำไปใช้กับการวนซ้ำการสุ่มตัวอย่างแต่ละครั้ง

เช่น อย่าทำสิ่งนี้:

library(caret)
dat <- iris
pp <- preProcess(dat[,-5], method="pca")
dat[,-5] <- predict(pp, dat[,-5])
knnFit1 <- train(Species~., dat, method = "knn", preProcess=c("pca"), 
    trControl = trainControl(method = "cv"))

ทำเช่นนี้!

dat <- iris
knnFit2 <- train(Species~., dat, method = "knn", preProcess=c("pca"), 
    trControl = trainControl(method = "cv"))

1
ถ้าฉันทำกระบวนการตามที่คุณแนะนำฉันจำเป็นต้องประมวลผลข้อมูลใหม่ล่วงหน้าเมื่อฉันต้องการใช้แบบจำลองสำหรับการคาดการณ์หรือไม่? ในขณะที่ผมทำ pred <- predict(knnFit2, newdata) ที่newdataไม่ได้ปรับขนาด คาเร็ตฉลาดพอที่จะรู้หรือไม่ว่าต้องมีการประมวลผลล่วงหน้าnewdataก่อนใช้เพื่อการคาดการณ์?
mchangun

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