নেস্টেড ক্রস-বৈধকরণের বাস্তবায়ন


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
যারা পাইথন না পড়েন তাদের জন্য কি আপনি পাঠ্যে ক্রস-বৈধতা বোঝার একটি সংস্করণ সরবরাহ করতে পারেন?
গুং - মনিকা পুনরায়

scikit-learnনিজস্ব সংস্করণ: scikit-learn.org/stable/auto_example/model_selection/…
আয়োরগো

উত্তর:


14

ইউপিএস, কোডটি ভুল, তবে খুব সূক্ষ্মভাবে !

ক) ট্রেনের অভ্যন্তরীণ প্রশিক্ষণ সেট এবং পরীক্ষার সেটটিতে বিভক্ত করা ঠিক আছে।

খ) সমস্যাটি হ'ল শেষ দুটি লাইন, যা নেস্টেড ক্রস-বৈধকরণের উদ্দেশ্য সম্পর্কে সূক্ষ্ম ভুল বোঝাবুঝিকে প্রতিফলিত করে । নেস্টেড সিভির উদ্দেশ্য প্যারামিটারগুলি নির্বাচন করা নয় , তবে আপনার অ্যালগরিদমের প্রত্যাশিত নির্ভুলতা কী তা নিয়ে নিরপেক্ষ মূল্যায়ন করা, এই ক্ষেত্রে ensemble.ExtraTreesRegressorএই ডেটাতে সর্বোত্তম হাইপারপ্যারামিটারের সাথে যা-ই হোক না কেন

এবং এটিই আপনার কোডটিকে সঠিকভাবে গণনা করে:

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

এটি শ্রেণিবদ্ধের পক্ষপাতহীন পূর্বাভাস গণনা করতে নেস্টেড সিভি ব্যবহার করেছিল। তবে লক্ষ্য করুন যে বাইরের লুপের প্রতিটি পাস আলাদা আলাদা হাইপারপ্যারামিটার তৈরি করতে পারে, আপনি যখন জানতেন যে আপনি লাইনটি কখন লিখেছিলেন:

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

সুতরাং এখন আপনার ভাঁজগুলি ব্যবহার করে চূড়ান্ত সেরা হাইপারপ্যারামিটার নির্বাচন করার জন্য একটি স্ট্যান্ডার্ড সিভি লুপ দরকার :

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/… - এখানে, উত্তরে উল্লেখ করা হয়েছে যে বাইরের কে মডেলগুলির মধ্যে সেরা মডেলটি নির্বাচন করা এটি আসলেই অনাকাঙ্ক্ষিত। হতে পারে আমি এখনও কিছু ভুল বুঝছি, তবে আমি ভেবেছিলাম যে অভ্যন্তরীণ সিভি লুপের ধারণাটি সর্বোত্তম পারফর্মিং মডেলটি নির্বাচন করা এবং বাহ্যিক সিভি লুপটি পারফরম্যান্সটি অনুমান করার জন্য। আপনি কি দয়া করে পুরো সংশোধিত কোড সরবরাহ করতে পারেন?
আবুদিস

ঠিক আছে, আমি মনে করি আমি এটি পেয়েছি। আমি নিশ্চিত হয়েছি যদিও পুরো সংশোধিত কোডটি দেখতে চাই। ধন্যবাদ।
আবুদিস

1
আমি জ্যাক ওয়াইনারের উত্তর সম্পর্কে বিভ্রান্ত হয়েছি এবং আমি মনে করি এটি স্পষ্ট করার মতো is সুতরাং, ওয়াইনার কি প্রমিত পরামর্শ দেয় যে একটি প্রাথমিক সিভি লুপ প্রাথমিক প্রশ্নের দ্বারা প্রদত্ত কোডটি অনুসরণ করবে বা এটি কেবল প্রাথমিক "অভ্যন্তরীণ" অংশ কোডটি প্রতিস্থাপন করবে? ধন্যবাদ

স্ট্যান্ডার্ড সিভি লুপ নেস্টেড সিভি লুপ অনুসরণ করে
জ্যাক ওয়াইনার

2
প্রথম অংশটি ত্রুটির একটি নিরপেক্ষ ভবিষ্যদ্বাণী গণনা করা। আপনি যদি অনেকগুলি বিভিন্ন অ্যালগোরিদম পরীক্ষা করে দেখেন তবে আপনার কেবলমাত্র প্রথম অংশটি সম্পাদন করা উচিত, তবে সর্বনিম্ন ত্রুটি সহ অ্যালগরিদমটি নির্বাচন করুন এবং কেবলমাত্র সেইটির জন্য, হাইপারপ্যারামিটারগুলি নির্বাচন করতে 2 অংশ সঞ্চালন করুন। আপনি যদি একটি মাত্র অ্যালগরিদম ব্যবহার করে সেট আপ হন তবে 1 ম অংশটি কম গুরুত্বপূর্ণ, যদি না আপনি আপনার বস বা ক্লায়েন্টকে বলতে চান যে শ্রেণিবদ্ধের ভবিষ্যতের ত্রুটির বিষয়ে আপনার সেরা ভবিষ্যদ্বাণীটি x, এবং আপনাকে অবশ্যই 1 ম ব্যবহার করে x গণনা করতে হবে নেস্টেড সিভি
জ্যাক ওয়াইনার

0

জ্যাকের উত্তর সংক্ষিপ্তসার হিসাবে,

কোনও মডেলের পক্ষপাতহীন ত্রুটি অনুমানের জন্য নেস্টেড সিভি প্রয়োজনীয়। আমরা বিভিন্ন মডেলের স্কোরকে এই পদ্ধতিতে তুলনা করতে পারি। এই তথ্যটি ব্যবহার করে আমরা নির্বাচিত মডেলগুলির প্যারামিটার টিউনিংয়ের জন্য একটি পৃথক কে-ফোল্ড সিভি লুপ সঞ্চালন করতে পারি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.