วิธีตรวจสอบประสิทธิภาพของโมเดลใน r
ในทางสถิติ เรามักจะสร้างแบบจำลองด้วยเหตุผลสองประการ:
- ทำความเข้าใจความสัมพันธ์ระหว่างตัวแปรทำนายหนึ่งตัวขึ้นไปกับ ตัวแปรตอบสนอง
- ใช้แบบจำลองเพื่อทำนายการสังเกตในอนาคต
การตรวจสอบข้าม มีประโยชน์ในการประมาณว่าแบบจำลองสามารถทำนายการสังเกตในอนาคตได้ดีเพียงใด
ตัวอย่างเช่น เราสามารถสร้าง แบบจำลองการถดถอยเชิงเส้นหลายตัว ที่ใช้ อายุ และ รายได้ เป็นตัวแปรทำนายและ ใช้สถานะเริ่มต้นเป็น ตัวแปรตอบสนอง ในกรณีนี้ เราอาจต้องการปรับแบบจำลองให้พอดีกับชุดข้อมูล จากนั้นใช้แบบจำลองนั้นเพื่อคาดการณ์ ความเป็นไปได้ที่พวกเขาจะผิดนัดชำระหนี้ตามรายได้และอายุของผู้สมัครใหม่
เพื่อตรวจสอบว่าแบบจำลองมีความสามารถในการคาดการณ์ที่ดีหรือไม่ เราจำเป็นต้องใช้แบบจำลองนี้เพื่อคาดการณ์ ข้อมูลที่ไม่เคยเห็นมาก่อน สิ่งนี้จะทำให้เราสามารถประมาณค่า ความผิดพลาดในการทำนาย ของแบบจำลองได้
การใช้การตรวจสอบข้ามเพื่อประมาณค่าข้อผิดพลาดในการทำนาย
การตรวจสอบความถูกต้องข้าม หมายถึงวิธีต่างๆ ที่เราสามารถประมาณค่าข้อผิดพลาดในการทำนายได้ วิธีการทั่วไปในการ ตรวจสอบข้ามคือ:
1. กันข้อสังเกตจำนวนหนึ่งไว้ในชุดข้อมูล ซึ่งโดยทั่วไปแล้วจะอยู่ที่ 15-25% ของการสังเกตทั้งหมด
2. ปรับ (หรือ “ฝึก”) แบบจำลองตามการสังเกตที่เราเก็บไว้ในชุดข้อมูล
3. ทดสอบว่าแบบจำลองสามารถคาดการณ์เกี่ยวกับการสังเกตที่เราไม่ได้ใช้ในการฝึกแบบจำลองได้ดีเพียงใด
การวัดคุณภาพของแบบจำลอง
เมื่อเราใช้แบบจำลองที่พอดีเพื่อคาดการณ์เกี่ยวกับการสังเกตใหม่ เราสามารถใช้หน่วยวัดที่แตกต่างกันหลายตัวเพื่อวัดคุณภาพของแบบจำลอง รวมถึง:
R-squared หลายตัว: ใช้วัดความแข็งแกร่งของความสัมพันธ์เชิงเส้นระหว่างตัวแปรทำนายและ ตัวแปรตอบสนอง ผลคูณ R-squared ของ 1 บ่งชี้ถึงความสัมพันธ์เชิงเส้นที่สมบูรณ์แบบ ในขณะที่ ผลคูณ R-squared ของ 0 บ่งชี้ว่าไม่มีความสัมพันธ์เชิงเส้น ยิ่งค่าตัวคูณ R-squared สูง ตัวแปรทำนายก็จะมีแนวโน้มมากขึ้นที่จะทำนายตัวแปรตอบสนอง
ค่าความคลาดเคลื่อนกำลังสองค่าเฉลี่ยราก (RMSE): วัดค่าข้อผิดพลาดในการทำนายโดยเฉลี่ยที่ทำโดยแบบจำลอง เมื่อคาดการณ์ค่า ของการสังเกตใหม่ นี่คือระยะห่างเฉลี่ยระหว่างค่าที่แท้จริงของการสังเกตกับค่าที่แบบจำลองทำนายไว้ ค่า RMSE ที่ต่ำกว่า บ่งชี้ว่าโมเดลมีความพอดีมากกว่า
ข้อผิดพลาดเฉลี่ยสัมบูรณ์ (MAE): นี่คือความแตกต่างสัมบูรณ์โดยเฉลี่ยระหว่างค่าจริงของการสังเกตและค่าที่คาดการณ์โดยแบบจำลอง โดยทั่วไปตัวชี้วัดนี้มีความไวต่อค่าผิดปกติน้อยกว่า RMSE ค่าที่ต่ำกว่าสำหรับ MAE บ่งบอกถึงความพอดีของโมเดลที่ดีกว่า
การใช้เทคนิคการตรวจสอบข้ามที่แตกต่างกันสี่แบบใน R
จากนั้นเราจะอธิบายวิธีการใช้เทคนิคการตรวจสอบข้ามต่อไปนี้ใน R:
1. แนวทางชุดการตรวจสอบความถูกต้อง
2. การตรวจสอบข้าม k-fold
3. ทิ้งการตรวจสอบความถูกต้องข้ามไว้
4. การตรวจสอบความถูกต้องข้าม k-fold ซ้ำแล้วซ้ำอีก
เพื่อสาธิตวิธีการใช้เทคนิคต่างๆ เหล่านี้ เราจะใช้ชุดย่อยของชุดข้อมูล R ในตัว mtcars :
#define dataset data <- mtcars[, c("mpg", "disp", "hp", "drat")] #view first six rows of new data head(data) # mpg disp hp drat #Mazda RX4 21.0 160 110 3.90 #Mazda RX4 Wag 21.0 160 110 3.90 #Datsun 710 22.8 108 93 3.85 #Hornet 4 Drive 21.4 258 110 3.08 #Hornet Sportabout 18.7 360 175 3.15 #Valiant 18.1 225 105 2.76
เราจะสร้างแบบจำลองการถดถอยเชิงเส้นหลายตัวโดยใช้ disp , hp และ drat เป็นตัวแปรทำนาย และ mpg เป็นตัวแปรตอบสนอง
วิธีการชุดการตรวจสอบความถูกต้อง
วิธีการชุดการตรวจสอบความถูกต้อง ทำงานดังนี้:
1. แบ่งข้อมูลออกเป็นสองชุด ชุดหนึ่งใช้สำหรับฝึกโมเดล (เช่น ประมาณค่าพารามิเตอร์ของโมเดล) และอีกชุดหนึ่งใช้สำหรับทดสอบโมเดล โดยทั่วไป ชุดการฝึกจะถูกสร้างขึ้นโดยการสุ่มเลือก ข้อมูล 70-80% และข้อมูลที่เหลือ 20-30% จะถูกใช้เป็นชุดทดสอบ
2. สร้างแบบจำลองโดยใช้ชุดข้อมูลการฝึกอบรม
3. ใช้แบบจำลองเพื่อคาดการณ์เกี่ยวกับข้อมูลชุดทดสอบ
4. วัดคุณภาพของโมเดลโดยใช้หน่วยเมตริก เช่น R-squared, RMSE และ MAE
ตัวอย่าง:
ตัวอย่างต่อไปนี้ใช้ชุดข้อมูลที่เรากำหนดไว้ด้านบน ขั้นแรกเราแบ่งข้อมูลออกเป็น
ชุดฝึกและชุดทดสอบ โดยใช้ข้อมูล 80% เป็นชุดฝึก และข้อมูลที่เหลือ 20% เป็นชุดทดสอบ ต่อไป เราสร้างโมเดลโดยใช้ ชุดการฝึก จากนั้นเราใช้แบบจำลองเพื่อคาดการณ์เกี่ยวกับชุดทดสอบ สุดท้ายนี้ เราวัดคุณภาพของ แบบจำลองโดยใช้ R-squared, RMSE และ MAE
#load dplyr library used for data manipulation library(dplyr) #load caret library used for partitioning data into training and test set library(caret) #make this example reproducible set.seed(0) #define the dataset data <- mtcars[, c("mpg", "disp", "hp", "drat")] #split the dataset into a training set (80%) and test set (20%). training_obs <- data$mpg %>% createDataPartition(p = 0.8, list = FALSE) train <- data[training_obs, ] test <- data[-training_obs, ] # Build the linear regression model on the training set model <- lm(mpg ~ ., data = train) # Use the model to make predictions on the test set predictions <- model %>% predict(test) #Examine R-squared, RMSE, and MAE of predictions data.frame(R_squared = R2(predictions, test$mpg), RMSE = RMSE(predictions, test$mpg), MAE = MAE(predictions, test$mpg)) #R_squared RMSE MAE #1 0.9213066 1.876038 1.66614
เมื่อเปรียบเทียบรุ่นต่างๆ รุ่นที่สร้าง RMSE ต่ำสุดในชุดทดสอบคือรุ่นที่ต้องการ
ข้อดีและข้อเสียของแนวทางนี้
ข้อดีของแนวทางชุดการตรวจสอบความถูกต้องคือ เรียบง่ายและมีประสิทธิภาพในการคำนวณ ข้อเสีย คือโมเดลนี้สร้างขึ้นโดยใช้ข้อมูลเพียงบางส่วนเท่านั้น หากข้อมูลที่เราปล่อย ออกจากชุดการฝึกอบรมมีข้อมูลที่น่าสนใจหรือมีคุณค่า โมเดลจะไม่นำมาพิจารณา
วิธีการตรวจสอบข้าม k-fold
วิธีการตรวจสอบข้าม k-fold ทำงานดังนี้:
1. สุ่มแบ่งข้อมูลออกเป็น k “พับ” หรือชุดย่อย (เช่น 5 หรือ 10 ชุดย่อย)
2. ฝึกโมเดลกับข้อมูลทั้งหมด โดยเหลือเพียงชุดย่อยเดียว
3. ใช้แบบจำลองเพื่อคาดการณ์ข้อมูลจากชุดย่อยที่ถูกละทิ้ง
4. ทำซ้ำขั้นตอนนี้จนกระทั่งแต่ละเซ็ตย่อย k ถูกใช้เป็นชุดทดสอบ
5 . วัดคุณภาพของแบบจำลองโดยการหาค่าเฉลี่ยข้อผิดพลาดในการทดสอบ k เรื่องนี้ก็รู้กัน
เป็นข้อผิดพลาดในการตรวจสอบข้าม
ตัวอย่าง
ในตัวอย่างนี้ ก่อนอื่นเราจะแบ่งข้อมูลออกเป็น 5 ชุดย่อย จากนั้นเราจะปรับโมเดลให้เหมาะสมโดยใช้ข้อมูลทั้งหมดยกเว้นชุดย่อย จากนั้นเราใช้แบบจำลองเพื่อคาด การณ์เกี่ยวกับชุดย่อยที่ถูกละทิ้งและบันทึกข้อผิดพลาดในการทดสอบ (โดยใช้ R-squared, RMSE และ MAE) เรา ทำซ้ำขั้นตอนนี้จนกว่าแต่ละชุดย่อยจะถูกนำมาใช้เป็นชุดทดสอบ จากนั้นเราก็คำนวณค่าเฉลี่ยของ ข้อผิดพลาดในการทดสอบ 5 รายการ
#load dplyr library used for data manipulation library(dplyr) #load caret library used for partitioning data into training and test set library(caret) #make this example reproducible set.seed(0) #define the dataset data <- mtcars[, c("mpg", "disp", "hp", "drat")] #define the number of subsets (or "folds") to use train_control <- trainControl(method = "cv", number = 5) #train the model model <- train(mpg ~ ., data = data, method = "lm", trControl = train_control) #Summarize the results print(model) #Linear Regression # #32 samples #3 predictor # #No pre-processing #Resampling: Cross-Validated (5 fold) #Summary of sample sizes: 26, 25, 26, 25, 26 #Resampling results: # # RMSE Rsquared MAE #3.095501 0.7661981 2.467427 # #Tuning parameter 'intercept' was held constant at a value of TRUE
ข้อดีและข้อเสียของแนวทางนี้
ข้อดีของวิธีตรวจสอบความถูกต้องข้าม k-fold เหนือวิธีชุดตรวจสอบความถูกต้องคือ สร้างแบบจำลองหลายครั้ง โดยใช้ข้อมูลที่แตกต่างกันในแต่ละครั้ง ดังนั้นเราจึงไม่ต้องมีโอกาสละเว้นข้อมูลสำคัญเมื่อสร้าง แบบจำลอง
ส่วนที่เป็นอัตนัยของแนวทางนี้คือการเลือกค่าที่จะใช้สำหรับ k ซึ่งก็คือจำนวนชุดย่อยที่จะแบ่ง ข้อมูลออกเป็น โดยทั่วไป ค่า k ที่ต่ำกว่าจะทำให้เกิดอคติที่สูงกว่าแต่มีความแปรปรวนที่ต่ำกว่า ในขณะที่ค่า k ที่สูงกว่าจะ ทำให้เกิดอคติที่ต่ำกว่าแต่มีความแปรปรวนที่สูงกว่า
ในทางปฏิบัติ โดยทั่วไปแล้ว k จะถูกเลือกให้เท่ากับ 5 หรือ 10 เนื่องจากจำนวน ชุดย่อยนี้มีแนวโน้มที่จะหลีกเลี่ยงอคติและความแปรปรวนมากเกินไปไปพร้อมๆ กัน
ทิ้งแนวทาง One Out Cross-Validation (LOOCV)
แนวทาง LOOCV ทำงานดังนี้:
1. สร้างแบบจำลองโดยใช้การสังเกตทั้งหมดยกเว้นเพียงจุดเดียวในชุดข้อมูล
2. ใช้แบบจำลองเพื่อทำนายค่าของการสังเกตที่ขาดหายไป บันทึกข้อผิดพลาดของการทดสอบการทำนายนี้
3. ทำซ้ำขั้นตอนนี้สำหรับการสังเกตแต่ละครั้งในชุดข้อมูล
4. วัดคุณภาพของแบบจำลองโดยการหาค่าเฉลี่ยข้อผิดพลาดในการทำนายทั้งหมด
ตัวอย่าง
ตัวอย่างต่อไปนี้สาธิตวิธีการใช้ดำเนินการ LOOCV สำหรับชุดข้อมูลเดียวกันกับที่ใช้ในตัวอย่างก่อนหน้านี้:
#load dplyr library used for data manipulation library(dplyr) #load caret library used for partitioning data into training and test set library(caret) #make this example reproducible set.seed(0) #define the dataset data <- mtcars[, c("mpg", "disp", "hp", "drat")] #specify that we want to use LOOCV train_control <- trainControl( method = "LOOCV" ) #train the model model <- train(mpg ~ ., data = data, method = "lm", trControl = train_control) #summarize the results print(model) #Linear Regression # #32 samples #3 predictor # #No pre-processing #Resampling: Leave-One-Out Cross-Validation #Summary of sample sizes: 31, 31, 31, 31, 31, 31, ... #Resampling results: # # RMSE Rsquared MAE #3.168763 0.7170704 2.503544 # #Tuning parameter 'intercept' was held constant at a value of TRUE
ข้อดีและข้อเสียของแนวทางนี้
ข้อดีของ LOOCV คือเราใช้จุดข้อมูลทั้งหมด ซึ่งโดยทั่วไปจะช่วยลดอคติที่อาจเกิดขึ้นได้ อย่างไรก็ตาม เนื่องจาก เราใช้แบบจำลองเพื่อทำนายค่าของการสังเกตแต่ละครั้ง สิ่งนี้อาจนำไปสู่ความแปรปรวนที่มากขึ้นใน ข้อผิดพลาดในการทำนาย
ข้อเสียเปรียบอีกประการหนึ่งของแนวทางนี้คือ จะต้องพอดีกับโมเดลจำนวนมากจนอาจไม่มีประสิทธิภาพและต้องใช้คอมพิวเตอร์หนักมาก
วิธีการตรวจสอบข้าม k-fold ซ้ำ
เราสามารถดำเนิน การตรวจสอบข้าม k-fold ซ้ำ ๆ ได้ โดยเพียงแค่ดำเนินการตรวจสอบข้าม k-fold หลายครั้ง ข้อผิดพลาดสุดท้ายคือข้อผิดพลาดโดยเฉลี่ยของ จำนวนการทำซ้ำ
ตัวอย่างต่อไปนี้ทำการตรวจสอบข้าม 5 เท่า ซ้ำ 4 ครั้ง:
#load dplyr library used for data manipulation library(dplyr) #load caret library used for partitioning data into training and test set library(caret) #make this example reproducible set.seed(0) #define the dataset data <- mtcars[, c("mpg", "disp", "hp", "drat")] #define the number of subsets to use and number of times to repeat k-fold CV train_control <- trainControl(method = "repeatedcv", number = 5, repeats = 4 ) #train the model model <- train(mpg ~ ., data = data, method = "lm", trControl = train_control) #summarize the results print(model) #Linear Regression # #32 samples #3 predictor # #No pre-processing #Resampling: Cross-Validated (5 fold, repeated 4 times) #Summary of sample sizes: 26, 25, 26, 25, 26, 25, ... #Resampling results: # # RMSE Rsquared MAE #3.176339 0.7909337 2.559131 # #Tuning parameter 'intercept' was held constant at a value of TRUE
ข้อดีและข้อเสียของแนวทางนี้
ข้อดีของวิธีการตรวจสอบความถูกต้องข้าม k-fold ซ้ำคือ สำหรับการทำซ้ำแต่ละครั้ง ข้อมูลจะถูกแบ่งออกเป็นชุดย่อยที่แตกต่างกันเล็กน้อย ซึ่งควรให้การประมาณค่าข้อผิดพลาดในการทำนายของแบบจำลองที่เป็นกลางมากยิ่งขึ้น ข้อเสียของวิธีนี้คือต้องใช้คอมพิวเตอร์มาก เนื่องจากเราต้องทำซ้ำขั้นตอนการปรับโมเดลหลายครั้ง
วิธีเลือกจำนวนพับในการตรวจสอบความถูกต้องแบบไขว้
ส่วนที่เป็นอัตวิสัยที่สุดของการตรวจสอบความถูกต้องข้ามคือการตัดสินใจว่าจะใช้จำนวนพับเท่าใด (เช่น ชุดย่อย) โดยทั่วไป ยิ่งจำนวนการพับน้อยลง การประมาณค่าความผิดพลาดก็จะมีความลำเอียงมากขึ้น แต่ตัวแปรก็จะยิ่งน้อยลงเท่านั้น ในทางกลับกัน ยิ่งจำนวนการพับสูง ค่าประมาณข้อผิดพลาดก็จะมีความลำเอียงน้อยลง แต่ตัวแปรก็จะยิ่งแปรผันมากขึ้น
สิ่งสำคัญคือต้องคำนึงถึงเวลาในการคำนวณด้วย สำหรับการพับแต่ละครั้ง คุณจะต้องฝึกรูปแบบใหม่ และถึงแม้กระบวนการนี้จะช้า แต่ก็อาจใช้เวลานานหากคุณเลือกจำนวนการพับที่สูง
ในทางปฏิบัติ การตรวจสอบข้ามมักจะดำเนินการด้วย 5 หรือ 10 เท่า เนื่องจากจะให้ความสมดุลที่ดีระหว่างความแปรปรวนและอคติ ขณะเดียวกันก็มีประสิทธิภาพในการคำนวณด้วย
วิธีเลือกรุ่นหลังจากดำเนินการตรวจสอบข้าม
การตรวจสอบข้ามใช้เพื่อประเมินข้อผิดพลาดในการทำนายของแบบจำลอง สิ่งนี้สามารถช่วยเราเลือกระหว่างโมเดลที่แตกต่างกันตั้งแต่สองโมเดลขึ้นไป โดยเน้นว่าโมเดลใดมีข้อผิดพลาดในการทำนายต่ำที่สุด (ขึ้นอยู่กับ RMSE, R-squared ฯลฯ)
เมื่อเราใช้การตรวจสอบข้ามเพื่อเลือกโมเดลที่ดีที่สุดแล้ว เราจะใช้ข้อมูลที่มีอยู่ ทั้งหมด เพื่อให้เหมาะกับโมเดลที่เลือก เราไม่ใช้อินสแตนซ์โมเดลจริงที่เราฝึกระหว่างการตรวจสอบข้ามสำหรับโมเดลขั้นสุดท้ายของเรา
ตัวอย่างเช่น เราสามารถใช้การตรวจสอบข้าม 5 เท่าเพื่อพิจารณาว่าโมเดลใดดีกว่าที่จะใช้ระหว่างโมเดลการถดถอยที่แตกต่างกันสองแบบ อย่างไรก็ตาม เมื่อเราระบุได้ว่าโมเดลใดเหมาะที่สุดที่จะใช้ เราจะใช้ข้อมูล ทั้งหมด เพื่อให้เหมาะกับโมเดลขั้นสุดท้าย กล่าวอีกนัยหนึ่ง เราไม่ลืมรอยพับใดๆ เมื่อสร้างโมเดลขั้นสุดท้าย