การสร้างโมเดลที่มี interaction (2)
ในแบบฝึกหัดนี้ จะเปรียบเทียบประสิทธิภาพของโมเดล interaction ที่สร้างไว้ในแบบฝึกหัดก่อนหน้ากับโมเดลที่มีเฉพาะ main effects เนื่องจากชุดข้อมูลนี้มีขนาดเล็ก จึงใช้ cross-validation เพื่อจำลองการทำนายบนข้อมูลที่โมเดลไม่เคยเห็น
เราจะเริ่มใช้แพ็กเกจ dplyr สำหรับการคำนวณ
mutate()(docs) เพิ่มคอลัมน์ใหม่ให้กับ tbl (ซึ่งเป็น data frame ประเภทหนึ่ง)group_by()(docs) กำหนดวิธีการจัดกลุ่มแถวใน tblsummarize()(docs) คำนวณสถิติสรุปของคอลัมน์
นอกจากนี้ยังใช้ pivot_longer() (docs) จาก tidyr ซึ่งนำหลายคอลัมน์มารวมให้อยู่ในรูปคู่ key-value ทั้ง data frame alcohol และสูตร fmla_add กับ fmla_interaction ได้โหลดไว้ให้แล้ว
แบบฝึกหัดนี้เป็นส่วนหนึ่งของหลักสูตร
Supervised Learning ใน R: การถดถอย
คำแนะนำการฝึกหัด
- ใช้
kWayCrossValidation()(docs) เพื่อสร้างแผนการแบ่งข้อมูลสำหรับ cross-validation แบบ 3-fold- อาร์กิวเมนต์แรกคือจำนวนแถวที่จะแบ่ง
- อาร์กิวเมนต์ที่สองคือจำนวน fold สำหรับ cross-validation
- กำหนดอาร์กิวเมนต์ที่ 3 และ 4 เป็น
NULL
- ตรวจสอบและรันโค้ดตัวอย่างเพื่อดูผลการทำนายจาก cross-validation แบบ 3-fold ของโมเดลที่ไม่มี interaction แล้วกำหนดค่าให้กับคอลัมน์
pred_add - รับผลการทำนายจาก cross-validation แบบ 3-fold ของโมเดลที่มี interaction แล้วกำหนดค่าให้กับคอลัมน์
pred_interaction- ดูขั้นตอนได้จากโค้ดตัวอย่าง
- ใช้
splitPlanเดิมที่สร้างไว้แล้ว
- เติมช่องว่างเพื่อ
- ใช้
pivot_longerรวมผลการทำนายไว้ในคอลัมน์เดียวชื่อpred - เพิ่มคอลัมน์ค่าคลาดเคลื่อน (ผลลัพธ์จริง - ผลลัพธ์ที่ทำนาย)
- คำนวณ RMSE ของผลการทำนายจาก cross-validation สำหรับแต่ละประเภทโมเดล
- ใช้
- เปรียบเทียบค่า RMSE แล้วพิจารณาว่าควรใช้โมเดลใด
แบบฝึกหัดเชิงโต้ตอบแบบลงมือทำ
ลองทำแบบฝึกหัดนี้โดยเติมโค้ดตัวอย่างนี้ให้สมบูรณ์
# alcohol is available
summary(alcohol)
# Both the formulae are available
fmla_add
fmla_interaction
# Create the splitting plan for 3-fold cross validation
set.seed(34245) # set the seed for reproducibility
splitPlan <- ___(___(___), ___, ___, ___)
# Sample code: Get cross-val predictions for main-effects only model
alcohol$pred_add <- 0 # initialize the prediction vector
for(i in 1:3) {
split <- splitPlan[[i]]
model_add <- lm(fmla_add, data = alcohol[split$train, ])
alcohol$pred_add[split$app] <- predict(model_add, newdata = alcohol[split$app, ])
}
# Get the cross-val predictions for the model with interactions
alcohol$pred_interaction <- 0 # initialize the prediction vector
for(i ___ ___) {
split <- ___
model_interaction <- lm(___, data = alcohol[split$train, ])
alcohol$___[split$app] <- predict(___, newdata = alcohol[split$app, ])
}
# Get RMSE
alcohol %>%
pivot_longer(cols=c('pred_add', 'pred_interaction'), names_to='modeltype', values_to='pred') %>%
mutate(residuals = ____) %>%
group_by(modeltype) %>%
summarize(rmse = ___(___(___)))