การแปลงค่า input: "hockey stick" (2)
ในแบบฝึกหัดที่แล้ว เราพบว่าโมเดล quadratic ดูเหมือนจะพอดีกับข้อมูล houseprice ได้ดีกว่าโมเดลเชิงเส้น
ในแบบฝึกหัดนี้ จะได้ตรวจสอบว่าโมเดล quadratic ให้ประสิทธิภาพที่ดีกว่าบนข้อมูลนอกตัวอย่างจริงหรือไม่
เนื่องจากชุดข้อมูลนี้มีขนาดเล็ก จึงใช้ cross-validation สูตร quadratic fmla_sqr ที่สร้างไว้ในแบบฝึกหัดก่อนหน้า และ data frame houseprice พร้อมใช้งานแล้ว
เพื่อให้เปรียบเทียบได้ โค้ดตัวอย่างจะคำนวณค่าพยากรณ์จาก cross-validation ของโมเดลเชิงเส้น price ~ size ไว้ให้
แบบฝึกหัดนี้เป็นส่วนหนึ่งของหลักสูตร
Supervised Learning ใน R: การถดถอย
คำแนะนำการฝึกหัด
- ใช้
kWayCrossValidation()เพื่อสร้างแผนการแบ่งข้อมูลสำหรับ cross-validation แบบ 3-fold- สามารถกำหนดอาร์กิวเมนต์ที่ 3 และ 4 ของฟังก์ชันเป็น
NULLได้
- สามารถกำหนดอาร์กิวเมนต์ที่ 3 และ 4 ของฟังก์ชันเป็น
- ตรวจสอบและรันโค้ดตัวอย่างเพื่อรับค่าพยากรณ์จาก cross-validation แบบ 3-fold ของโมเดล
price ~ sizeแล้วเพิ่มลงในคอลัมน์pred_lin - รับค่าพยากรณ์จาก cross-validation สำหรับ price ในฐานะฟังก์ชันของ size ที่ยกกำลังสอง แล้วกำหนดค่าลงในคอลัมน์
pred_sqr- โค้ดตัวอย่างแสดงขั้นตอนไว้แล้ว
- ใช้แผนการแบ่งข้อมูลที่สร้างไว้แล้วได้เลย
- เติมส่วนที่ว่างเพื่อ pivot ค่าพยากรณ์และคำนวณค่า residuals
- เติมส่วนที่ว่างเพื่อเปรียบเทียบค่า RMSE ของทั้งสองโมเดล โมเดลใดพอดีกับข้อมูลได้ดีกว่า?
แบบฝึกหัดเชิงโต้ตอบแบบลงมือทำ
ลองทำแบบฝึกหัดนี้โดยเติมโค้ดตัวอย่างนี้ให้สมบูรณ์
# 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 = ___)