วิธีตรวจสอบประสิทธิภาพของโมเดลใน 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 เท่าเพื่อพิจารณาว่าโมเดลใดดีกว่าที่จะใช้ระหว่างโมเดลการถดถอยที่แตกต่างกันสองแบบ อย่างไรก็ตาม เมื่อเราระบุได้ว่าโมเดลใดเหมาะที่สุดที่จะใช้ เราจะใช้ข้อมูล ทั้งหมด เพื่อให้เหมาะกับโมเดลขั้นสุดท้าย กล่าวอีกนัยหนึ่ง เราไม่ลืมรอยพับใดๆ เมื่อสร้างโมเดลขั้นสุดท้าย

เพิ่มความคิดเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *