การตรวจสอบข้าม k-fold ใน python (ทีละขั้นตอน)


ในการประเมินประสิทธิภาพของแบบจำลองในชุดข้อมูล เราจำเป็นต้องวัดว่าการคาดการณ์ที่ทำโดยแบบจำลองนั้นตรงกับข้อมูลที่สังเกตได้ดีเพียงใด

วิธีการที่ใช้กันทั่วไปในการทำเช่นนี้เรียกว่า การตรวจสอบข้าม k-fold ซึ่งใช้แนวทางต่อไปนี้:

1. สุ่มแบ่งชุดข้อมูลออกเป็น k กลุ่ม หรือ “พับ” โดยมีขนาดเท่ากันโดยประมาณ

2. เลือกพับใดพับหนึ่งเป็นชุดอุปกรณ์ยึดเหนี่ยว ปรับเทมเพลตเป็นพับ k-1 ที่เหลือ คำนวณการทดสอบ MSE จากการสังเกตในชั้นที่ถูกดึง

3. ทำซ้ำขั้นตอนนี้ k ครั้ง ในแต่ละครั้งโดยใช้ชุดอื่นเป็นชุดแยก

4. คำนวณการทดสอบ MSE โดยรวมเป็นค่าเฉลี่ยของการทดสอบ k MSE

บทช่วยสอนนี้ให้ตัวอย่างทีละขั้นตอนของวิธีดำเนินการตรวจสอบข้าม k-fold สำหรับโมเดลที่กำหนดใน Python

ขั้นตอนที่ 1: โหลดไลบรารีที่จำเป็น

ขั้นแรก เราจะโหลดฟังก์ชันและไลบรารีที่จำเป็นสำหรับตัวอย่างนี้:

 from sklearn. model_selection import train_test_split
from sklearn. model_selection import KFold
from sklearn. model_selection import cross_val_score
from sklearn. linear_model import LinearRegression
from numpy import means
from numpy import absolute
from numpy import sqrt
import pandas as pd

ขั้นตอนที่ 2: สร้างข้อมูล

ต่อไป เราจะสร้าง DataFrame แพนด้าที่มีตัวแปรทำนายสองตัว x1 และ x2 และตัวแปรตอบสนอง y ตัวเดียว

 df = pd.DataFrame({' y ': [6, 8, 12, 14, 14, 15, 17, 22, 24, 23],
                   ' x1 ': [2, 5, 4, 3, 4, 6, 7, 5, 8, 9],
                   ' x2 ': [14, 12, 12, 13, 7, 8, 7, 4, 6, 5]})

ขั้นตอนที่ 3: ดำเนินการตรวจสอบข้าม K-Fold

ต่อไป เราจะใส่ โมเดลการถดถอยเชิงเส้นหลายตัว เข้ากับชุดข้อมูล และดำเนินการ LOOCV เพื่อประเมินประสิทธิภาพของโมเดล

 #define predictor and response variables
X = df[[' x1 ', ' x2 ']]
y = df[' y ']

#define cross-validation method to use
cv = KFold ( n_splits = 10 , random_state = 1 , shuffle = True )

#build multiple linear regression model
model = LinearRegression()

#use k-fold CV to evaluate model
scores = cross_val_score(model, X, y, scoring=' neg_mean_absolute_error ',
                         cv=cv, n_jobs=-1)

#view mean absolute error
mean(absolute(scores))

3.6141267491803646

จากผลการวิจัยพบว่าค่าคลาดเคลื่อนสัมบูรณ์ (MAE) เท่ากับ 3.614 นั่นคือ ข้อผิดพลาดสัมบูรณ์โดยเฉลี่ยระหว่างการทำนายแบบจำลองกับข้อมูลที่สังเกตได้จริงคือ 3.614

โดยทั่วไป ยิ่งค่า MAE ต่ำ แบบจำลองก็ยิ่งสามารถทำนายการสังเกตจริงได้ดีขึ้นเท่านั้น

ตัวชี้วัดที่ใช้กันทั่วไปอีกตัวหนึ่งในการประเมินประสิทธิภาพของโมเดลคือข้อผิดพลาดรูทค่าเฉลี่ยกำลังสอง (RMSE) รหัสต่อไปนี้แสดงวิธีคำนวณหน่วยเมตริกนี้โดยใช้ LOOCV:

 #define predictor and response variables
X = df[[' x1 ', ' x2 ']]
y = df[' y ']

#define cross-validation method to use
cv = KFold ( n_splits = 5 , random_state = 1 , shuffle = True ) 

#build multiple linear regression model
model = LinearRegression()

#use LOOCV to evaluate model
scores = cross_val_score(model, X, y, scoring=' neg_mean_squared_error ',
                         cv=cv, n_jobs=-1)

#view RMSE
sqrt(mean(absolute(scores)))

4.284373111711816

จากผลลัพธ์เราจะเห็นว่าค่าความผิดพลาดรากกำลังสองเฉลี่ย (RMSE) เท่ากับ 4.284

ยิ่ง RMSE ต่ำ โมเดลก็ยิ่งสามารถทำนายการสังเกตจริงได้ดีขึ้น

ในทางปฏิบัติ โดยทั่วไปเราจะติดตั้งโมเดลต่างๆ ไว้หลายรุ่นและเปรียบเทียบ RMSE หรือ MAE ของแต่ละรุ่นเพื่อตัดสินใจว่ารุ่นใดสร้างอัตราข้อผิดพลาดในการทดสอบต่ำที่สุด จึงเป็นรุ่นที่ดีที่สุดที่จะใช้

โปรดทราบว่าในตัวอย่างนี้ เราเลือกใช้การพับ k=5 แต่คุณสามารถเลือกจำนวนการพับเท่าใดก็ได้ที่คุณต้องการ

ในทางปฏิบัติ เรามักเลือกระหว่าง 5 ถึง 10 ชั้น เนื่องจากนี่เป็นจำนวนที่เหมาะสมที่สุดที่สร้างอัตราความผิดพลาดในการทดสอบที่เชื่อถือได้

คุณสามารถดูเอกสารฉบับเต็มเกี่ยวกับฟังก์ชัน KFold() ของ sklearn ได้ที่นี่

แหล่งข้อมูลเพิ่มเติม

ข้อมูลเบื้องต้นเกี่ยวกับการตรวจสอบข้าม K-Fold
คู่มือฉบับสมบูรณ์เกี่ยวกับการถดถอยเชิงเส้นใน Python
การตรวจสอบความถูกต้องแบบ Cross-One-Out ใน Python

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

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