Xác thực chéo PCA và k-gấp trong gói caret trong R


16

Tôi vừa xem lại một bài giảng từ khóa học về Machine Learning trên Coursera. Trong phần mà giáo sư thảo luận về PCA về dữ liệu tiền xử lý trong các ứng dụng học tập có giám sát, ông nói rằng PCA chỉ nên được thực hiện trên dữ liệu đào tạo và sau đó ánh xạ được sử dụng để chuyển đổi các bộ kiểm tra và xác thực chéo. Xem thêm PCA và phân chia thử nghiệm / đào tạo .

Tuy nhiên, trong caretgói R, dữ liệu đào tạo bạn truyền vào train()chức năng đã được PCA xử lý. Vì vậy, khi thuật toán thực hiện xác thực chéo k lần, bộ xác thực chéo đã được xử lý với PCA thông qua preProcess()predict()trên thực tế được sử dụng trong "khớp" PCA.

Là sự hiểu biết của tôi về tình hình chính xác? Quy trình xác thực chéo với PCA (hoặc trên thực tế, với bất kỳ phương pháp định cỡ lại / định tâm nào) là "sai" vì việc xử lý trước dữ liệu được thực hiện trên bộ xác thực chéo cũng như tập huấn luyện? Và nếu vậy, điều này sẽ ảnh hưởng lớn đến kết quả như thế nào?


1
Câu hỏi thú vị. Giáo sư Ng có đưa ra lý do tại sao "PCA chỉ nên được thực hiện trên dữ liệu đào tạo và sau đó ánh xạ được sử dụng để chuyển đổi xác thực chéo và các bộ kiểm tra" không? Trực giác của tôi là tác động nên ở mức tối thiểu, vì dữ liệu train / cv / test được giả sử là đến từ cùng một phân phối và PCA không liên quan đến (các) biến đầu ra / phụ thuộc.
miura

1
@miura Có anh làm. Khi thực hiện PCA, chúng ta cần giải quyết các kích thước k tối thiểu trong các vectơ đầu ra cần thiết để đạt được "phương sai giữ lại" mong muốn. Tham số k này hiện đang có hiệu lực (theo cách hiểu của tôi) một tham số phụ của thuật toán mà chúng ta cần phải phù hợp. Nếu chúng tôi cũng thực hiện PCA trên bộ xác thực chéo, chúng tôi sẽ đào tạo một phần thuật toán của chúng tôi trên bộ CV, do đó làm giảm giá trị của xác thực chéo.
mchangun

Tôi nghĩ rằng bạn đang nhầm lẫn giữa PCA và MDS nhưng trong cả hai phương pháp, bạn không đặt phương sai giữ lại mong muốn. Nhưng bạn có thể tính toán nó từ sự bất công mà họ mang đến để giảm xuống kích thước k. Bạn không cần phải phù hợp với nó bởi vì chiều thứ nhất sẽ luôn giảm nhiều phương sai hơn chiều thứ hai và chiều thứ hai nhiều hơn chiều thứ ba ...
llrs 10/11/2016

Câu trả lời:


18

Tôi không thấy bài giảng, vì vậy tôi không thể nhận xét về những gì đã nói.

0,02 đô la của tôi: Nếu bạn muốn có được ước tính tốt về hiệu suất bằng cách lấy mẫu lại, bạn thực sự nên thực hiện tất cả các thao tác trong quá trình lấy mẫu lại thay vì trước đó. Điều này thực sự đúng với lựa chọn tính năng [1] cũng như các hoạt động không tầm thường như PCA. Nếu nó làm tăng tính không chắc chắn cho kết quả, hãy đưa nó vào mô hình lại.

Hãy suy nghĩ về hồi quy thành phần chính: PCA theo sau là hồi quy tuyến tính trên một số thành phần. PCA ước tính các tham số (có nhiễu) và số lượng thành phần cũng phải được chọn (các giá trị khác nhau sẽ dẫn đến kết quả khác nhau => nhiều nhiễu hơn).

Giả sử chúng tôi đã sử dụng 10 lần CV với sơ đồ 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:

hoặc sơ đồ 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:

Cần phải rõ ràng hơn cách tiếp cận thứ hai sẽ tạo ra các ước tính lỗi phản ánh sự không chắc chắn gây ra bởi PCA, lựa chọn số lượng thành phần và hồi quy tuyến tính. Trong thực tế, CV trong sơ đồ đầu tiên không có ý tưởng gì trước nó.

Tôi có lỗi vì không phải lúc nào cũng thực hiện tất cả các thao tác với việc lấy mẫu lại, nhưng chỉ khi tôi không thực sự quan tâm đến ước tính hiệu suất (điều này là bất thường).

Có nhiều sự khác biệt giữa hai chương trình? Nó phụ thuộc vào dữ liệu và tiền xử lý. Nếu bạn chỉ định tâm và nhân rộng, có lẽ là không. Nếu bạn có một tấn dữ liệu, có thể không. Khi quy mô tập huấn giảm xuống, nguy cơ nhận được các ước tính kém sẽ tăng lên, đặc biệt là nếu n gần với p.

Tôi có thể nói một cách chắc chắn từ kinh nghiệm rằng không bao gồm lựa chọn tính năng được giám sát trong quá trình lấy mẫu lại là một ý tưởng thực sự tồi tệ (không có bộ đào tạo lớn). Tôi không thấy lý do tại sao tiền xử lý sẽ miễn dịch với điều này (ở một mức độ nào đó).

@mchangun: Tôi nghĩ rằng số lượng thành phần là một tham số điều chỉnh và bạn có thể muốn chọn nó bằng cách sử dụng các ước tính hiệu suất có thể khái quát hóa. Bạn có thể tự động chọn K sao cho ít nhất X% phương sai được giải thích và bao gồm quá trình đó trong quá trình lấy mẫu lại để chúng tôi tính đến nhiễu trong quy trình đó.

Tối đa

[1] Ambroise, C., & McLachlan, G. (2002). Lựa chọn sai lệch trong trích xuất gen trên cơ sở dữ liệu biểu hiện gen microarray. Kỷ yếu của Viện Hàn lâm Khoa học Quốc gia, 99 (10), 6562 Bóng6566.


21

Đừng xử lý trước dữ liệu trước khi chạy trainchức năng! Sử dụng preProcess đối số cho hàm train và quá trình tiền xử lý sẽ được áp dụng cho mỗi lần lặp lại lấy mẫu.

ví dụ: không làm điều này:

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"))

làm cái này!

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

1
Nếu tôi thực hiện prProcess như bạn đề xuất, tôi có cần phải xử lý trước dữ liệu mới khi tôi muốn sử dụng mô hình để dự đoán không? Hiện tại, tôi chỉ làm: pred <- predict(knnFit2, newdata) nơi newdatakhông được thu nhỏ. Caret có đủ thông minh để biết rằng nó cần phải xử lý newdatatrước khi sử dụng nó để dự đoán không?
mchangun

7
@mchangun không. caret lưu các tham số tiền xử lý và sẽ xử lý trước dữ liệu mới trong lệnh gọi dự đoán. nó đẹp quá
Zach
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.