Biến đổi đầu vào: "hockey stick" (2)
Ở bài tập trước, bạn đã thấy mô hình bậc hai có vẻ phù hợp với dữ liệu houseprice hơn mô hình tuyến tính.
Trong bài này, bạn sẽ xác nhận liệu mô hình bậc hai có hoạt động tốt hơn trên dữ liệu ngoài mẫu hay không.
Vì bộ dữ liệu này nhỏ, bạn sẽ dùng cross-validation. Công thức bậc hai fmla_sqr mà bạn đã tạo ở bài trước và data frame houseprice đã được cung cấp để bạn sử dụng.
Để so sánh, mã mẫu sẽ tính các dự đoán cross-validation từ mô hình tuyến tính price ~ size.
Bài tập này là một phần của khóa học
Học có giám sát với R: Hồi quy
Hướng dẫn bài tập
- Dùng
kWayCrossValidation()để tạo kế hoạch chia cho cross-validation 3-fold.- Bạn có thể đặt tham số thứ 3 và thứ 4 của hàm là
NULL.
- Bạn có thể đặt tham số thứ 3 và thứ 4 của hàm là
- Xem và chạy mã mẫu để lấy dự đoán cross-validation 3-fold của mô hình
price ~ sizevà thêm chúng vào cộtpred_lin. - Lấy dự đoán cross-validation cho giá như một hàm của kích thước bình phương. Gán vào cột
pred_sqr.- Mã mẫu cung cấp quy trình cho bạn.
- Bạn có thể dùng kế hoạch chia đã tạo.
- Điền vào chỗ trống để pivot các dự đoán và tính residuals.
- Điền vào chỗ trống để so sánh RMSE cho hai mô hình. Mô hình nào khớp tốt hơn?
Bài tập tương tác thực hành trực tiếp
Hãy thử làm bài tập này bằng cách hoàn thành đoạn mã mẫu này.
# houseprice is available
summary(houseprice)
# fmla_sqr is available
fmla_sqr
# Create a splitting plan for 3-fold cross validation
set.seed(34245) # set the seed for reproducibility
splitPlan <- ___
# Sample code: get cross-val predictions for price ~ size
houseprice$pred_lin <- 0 # initialize the prediction vector
for(i in 1:3) {
split <- splitPlan[[i]]
model_lin <- lm(price ~ size, data = houseprice[split$train,])
houseprice$pred_lin[split$app] <- predict(model_lin, newdata = houseprice[split$app,])
}
# Get cross-val predictions for price as a function of size^2 (use fmla_sqr)
houseprice$pred_sqr <- 0 # initialize the prediction vector
for(i in 1:3) {
split <- ___
model_sqr <- lm(___, data = houseprice[split$train, ])
houseprice$___[split$app] <- predict(___, newdata = houseprice[split$app, ])
}
# Pivot the predictions and calculate the residuals
houseprice_long <- houseprice %>%
pivot_longer(cols = c('pred_lin', 'pred_sqr'), names_to = 'modeltype', values_to = 'pred') %>%
mutate(residuals = ___)
# Compare the cross-validated RMSE for the two models
houseprice_long %>%
group_by(modeltype) %>% # group by modeltype
summarize(rmse = ___)