การดำเนินการตรวจสอบข้ามซ้อน


10

ฉันพยายามที่จะเข้าใจว่าความเข้าใจของฉันเกี่ยวกับการตรวจสอบความถูกต้องแบบซ้อนกันดังนั้นฉันจึงเขียนตัวอย่างของเล่นนี้เพื่อดูว่าฉันพูดถูกหรือไม่:

import operator
import numpy as np
from sklearn import cross_validation
from sklearn import ensemble
from sklearn.datasets import load_boston

# set random state
state = 1

# load boston dataset
boston = load_boston()

X = boston.data
y = boston.target

outer_scores = []

# outer cross-validation
outer = cross_validation.KFold(len(y), n_folds=3, shuffle=True, random_state=state)
for fold, (train_index_outer, test_index_outer) in enumerate(outer):
    X_train_outer, X_test_outer = X[train_index_outer], X[test_index_outer]
    y_train_outer, y_test_outer = y[train_index_outer], y[test_index_outer]

    inner_mean_scores = []

    # define explored parameter space.
    # procedure below should be equal to GridSearchCV
    tuned_parameter = [1000, 1100, 1200]
    for param in tuned_parameter:

        inner_scores = []

        # inner cross-validation
        inner = cross_validation.KFold(len(X_train_outer), n_folds=3, shuffle=True, random_state=state)
        for train_index_inner, test_index_inner in inner:
            # split the training data of outer CV
            X_train_inner, X_test_inner = X_train_outer[train_index_inner], X_train_outer[test_index_inner]
            y_train_inner, y_test_inner = y_train_outer[train_index_inner], y_train_outer[test_index_inner]

            # fit extremely randomized trees regressor to training data of inner CV
            clf = ensemble.ExtraTreesRegressor(param, n_jobs=-1, random_state=1)
            clf.fit(X_train_inner, y_train_inner)
            inner_scores.append(clf.score(X_test_inner, y_test_inner))

        # calculate mean score for inner folds
        inner_mean_scores.append(np.mean(inner_scores))

    # get maximum score index
    index, value = max(enumerate(inner_mean_scores), key=operator.itemgetter(1))

    print 'Best parameter of %i fold: %i' % (fold + 1, tuned_parameter[index])

    # fit the selected model to the training set of outer CV
    # for prediction error estimation
    clf2 = ensemble.ExtraTreesRegressor(tuned_parameter[index], n_jobs=-1, random_state=1)
    clf2.fit(X_train_outer, y_train_outer)
    outer_scores.append(clf2.score(X_test_outer, y_test_outer))

# show the prediction error estimate produced by nested CV
print 'Unbiased prediction error: %.4f' % (np.mean(outer_scores))

# finally, fit the selected model to the whole dataset
clf3 = ensemble.ExtraTreesRegressor(tuned_parameter[index], n_jobs=-1, random_state=1)
clf3.fit(X, y)

ความคิดใด ๆ ชื่นชม


3
คุณสามารถให้รุ่นของความเข้าใจในการตรวจสอบข้ามในข้อความสำหรับผู้ที่ไม่ได้อ่าน Python ได้หรือไม่?
gung - Reinstate Monica

scikit-learnรุ่นของตัวเอง: scikit-learn.org/stable/auto_examples/model_selection/ …
ayorgo

คำตอบ:


14

UPS รหัสผิด แต่ในทางที่ลึกซึ้งมาก!

a) การแบ่งขบวนรถไฟออกเป็นชุดฝึกอบรมภายในและชุดทดสอบก็โอเค

b) ปัญหาคือสองบรรทัดสุดท้ายซึ่งสะท้อนความเข้าใจผิดอย่างละเอียดเกี่ยวกับจุดประสงค์ของการตรวจสอบความถูกต้องแบบซ้อน วัตถุประสงค์ของ CV ที่ซ้อนกันไม่ใช่เพื่อเลือกพารามิเตอร์ แต่เพื่อประเมินความเป็นกลางของความแม่นยำของอัลกอริทึมของคุณในกรณีensemble.ExtraTreesRegressorนี้ในข้อมูลนี้ด้วยพารามิเตอร์ที่ดีที่สุดไม่ว่ามันจะเป็นอะไร

และนี่คือสิ่งที่โค้ดของคุณคำนวณอย่างถูกต้องจนถึงบรรทัด:

    print 'Unbiased prediction error: %.4f' % (np.mean(outer_scores))

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

   print 'Best parameter of %i fold: %i' % (fold + 1, tuned_parameter[index])

ดังนั้นตอนนี้คุณต้องวนรอบ CV มาตรฐานเพื่อเลือกพารามิเตอร์ที่ดีที่สุดขั้นสุดท้ายโดยใช้การพับ:

tuned_parameter = [1000, 1100, 1200]
for param in tuned_parameter:

    scores = []

    # normal cross-validation
    kfolds = cross_validation.KFold(len(y), n_folds=3, shuffle=True, random_state=state)
    for train_index, test_index in kfolds:
        # split the training data
        X_train, X_test = X[train_index], X[test_index]
        y_train, y_test = y[train_index], y[test_index]

        # fit extremely randomized trees regressor to training data
        clf2_5 = ensemble.ExtraTreesRegressor(param, n_jobs=-1, random_state=1)
        clf2_5.fit(X_train, y_train)
        scores.append(clf2_5.score(X_test, y_test))

    # calculate mean score for folds
    mean_scores.append(np.mean(scores))

# get maximum score index
index, value = max(enumerate(mean_scores), key=operator.itemgetter(1))

print 'Best parameter : %i' % (tuned_parameter[index])

ซึ่งเป็นรหัสของคุณ แต่มีการอ้างอิงถึงการลบภายใน

ตอนนี้พารามิเตอร์ที่ดีที่สุดคือtuned_parameter[index]และตอนนี้คุณสามารถเรียนรู้ลักษณนามสุดท้ายclf3เช่นเดียวกับในรหัสของคุณ


ขอบคุณ! ฉันพิจารณาแล้วว่าฉันอาจเลือกbestพารามิเตอร์ที่แตกต่างกันในการพับที่แตกต่างกัน แต่ฉันไม่รู้วิธีเลือกที่ดีที่สุด stats.stackexchange.com/questions/65128/ … - ที่นี่ในคำตอบมีการกล่าวถึงว่าจริง ๆ แล้วไม่พึงประสงค์ที่จะเลือกรุ่นที่ดีที่สุดจากรุ่น k นอก บางทีฉันยังคงเข้าใจผิดบางอย่าง แต่ฉันคิดว่าแนวคิดของวง CV ภายในคือการเลือกรุ่นที่มีประสิทธิภาพดีที่สุดและวง CV ด้านนอกคือการประมาณประสิทธิภาพ คุณช่วยระบุรหัสที่แก้ไขเต็มรูปแบบได้ไหม
abudis

โอเคฉันคิดว่าฉันเข้าใจแล้ว ฉันต้องการที่จะเห็นรหัสดัดแปลงเต็มรูปแบบ แต่เพื่อให้แน่ใจว่า ขอบคุณ
abudis

1
ฉันสับสนเกี่ยวกับคำตอบของ Jacques Wainer และฉันคิดว่ามันคุ้มค่าที่จะอธิบาย ดังนั้น Wainer แนะนำว่าวง CV มาตรฐานควรทำตามรหัสที่ให้ไว้โดยคำถามเริ่มต้นหรือว่าควรแทนที่รหัสชิ้นส่วน "inner" เริ่มต้นหรือไม่ thanx

CV CV มาตรฐานจะวนตาม CV ที่ซ้อนกัน
Jacques Wainer

2
ส่วนแรกคือการคำนวณการทำนายข้อผิดพลาดที่เป็นกลาง หากคุณกำลังทดสอบอัลกอริธึมที่แตกต่างกันจำนวนมากคุณควรดำเนินการเฉพาะส่วนที่ 1 จากนั้นเลือกอัลกอริทึมที่มีข้อผิดพลาดต่ำที่สุดและเฉพาะสำหรับส่วนนั้นให้ดำเนินการ 2 ส่วนเพื่อเลือกพารามิเตอร์ ถ้าคุณตั้งค่าโดยใช้อัลกอริทึมเดียวเท่านั้นส่วนที่ 1 นั้นมีความสำคัญน้อยกว่าเว้นแต่คุณต้องการ stateto เจ้านายหรือลูกค้าของคุณว่าการทำนายข้อผิดพลาดในอนาคตที่ดีที่สุดของลักษณนามคือ x และคุณต้องคำนวณ x โดยใช้อันดับที่ 1 CV ที่ซ้อนกัน
Jacques Wainer

0

เพื่อสรุปคำตอบของ Jacques

ต้องใช้ CV ที่ซ้อนกันสำหรับการประเมินข้อผิดพลาดที่ไม่เอนเอียงของแบบจำลอง เราสามารถเปรียบเทียบคะแนนของรุ่นต่าง ๆ ในลักษณะนี้ เมื่อใช้ข้อมูลนี้เราสามารถทำการแยก K-fold CV loop สำหรับการปรับพารามิเตอร์ของรุ่นที่เลือกได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.