CalibratedClassifierCV এর সাথে শ্রেণিবদ্ধকারীদের ক্যালিবিট করার সঠিক উপায় Sci


16

সাইকিটের ক্যালিব্রেটেড ক্লাসিফায়ারসিভি রয়েছে , যা আমাদের মডেলগুলিকে একটি নির্দিষ্ট এক্স, ওয়াই জুটিতে ক্যালিব্রেট করতে দেয়। এটি পরিষ্কারভাবে বলেছে যেdata for fitting the classifier and for calibrating it must be disjoint.

যদি তাদের অবশ্যই বিভেদ হয়, তবে নিম্নলিখিতগুলির সাথে শ্রেণিবদ্ধকে প্রশিক্ষণ দেওয়া কি বৈধ?

model = CalibratedClassifierCV(my_classifier)
model.fit(X_train, y_train)

আমি আশঙ্কা করি একই প্রশিক্ষণ সেটটি ব্যবহার করে আমি disjoint dataনিয়ম ভঙ্গ করছি । বিকল্প একটি বৈধতা সেট থাকতে পারে

my_classifier.fit(X_train, y_train)
model = CalibratedClassifierCV(my_classifier, cv='prefit')
model.fit(X_valid, y_valid)

যার প্রশিক্ষণের জন্য কম ডেটা রেখে যাওয়ার অসুবিধা রয়েছে। এছাড়াও, যদি ক্যালিবিটেডক্লাসিফায়ারসিভি কেবলমাত্র একটি ভিন্ন প্রশিক্ষণ সংস্থায় ফিট হওয়া মডেলগুলির সাথে ফিট করে, তবে এটির ডিফল্ট বিকল্পগুলি কেন হবে cv=3, যা বেস অনুমানকারীকেও ফিট করবে? ক্রস বৈধকরণ তার নিজস্ব মতবিরোধ নিয়ম পরিচালনা করে?

প্রশ্ন: CalibratedClassifierCV ব্যবহার করার সঠিক উপায় কী?

উত্তর:


18

CalibratedClassifierCV ডক্সে দুটি জিনিস উল্লেখ করা আছে যা এটি কীভাবে ব্যবহার করা যেতে পারে সে সম্পর্কে ইঙ্গিত দেয়:

বেস_স্টিমেটার: সিভি = প্রিফিট থাকলে শ্রেণিবদ্ধকারী অবশ্যই ডেটাতে আগে থেকেই ফিট থাকতে পারে।

সিভি: যদি "প্রিফিট" পাস করা হয় তবে ধরে নেওয়া হয় যে বেস_স্টিমেটারটি ইতিমধ্যে লাগানো হয়েছে এবং সমস্ত ডেটা ক্রমাঙ্কণের জন্য ব্যবহৃত হয়।

আমি সম্ভবত এই ভুলটির ব্যাখ্যা দিচ্ছি, তবে মনে হচ্ছে আপনি সিসিসিভি (ক্যালিব্রেটেড ক্লাসিফায়ারসিভির জন্য সংক্ষিপ্ত) দুটি উপায়ে ব্যবহার করতে পারেন:

এক নম্বর:

  • আপনি আপনার মডেলটিকে যথারীতি প্রশিক্ষণ দিন your_model.fit(X_train, y_train),।
  • তারপর, আপনি, আপনার CCCV দৃষ্টান্ত তৈরি your_cccv = CalibratedClassifierCV(your_model, cv='prefit')। আপনি চিহ্নিত করতে লক্ষ্য করুন cvযে আপনার মডেলটি ইতিমধ্যে ফিট রয়েছে।
  • অবশেষে, আপনি কল your_cccv.fit(X_validation, y_validation)। এই বৈধতা ডেটা সম্পূর্ণরূপে ক্রমাঙ্কনের উদ্দেশ্যে ব্যবহৃত হয়।

নাম্বার দুই:

  • আপনার কাছে একটি নতুন, প্রশিক্ষণপ্রাপ্ত মডেল রয়েছে।
  • তাহলে আপনি তৈরি your_cccv=CalibratedClassifierCV(your_untrained_model, cv=3)। নোটিশ cvএখন ভাঁজ সংখ্যা।
  • অবশেষে, আপনি কল your_cccv.fit(X, y)। আপনার মডেল প্রশিক্ষণ না থাকায়, এক্স এবং ওয়াই প্রশিক্ষণ এবং ক্রমাঙ্কন উভয়ের জন্য ব্যবহার করতে হবে। ডেটা 'ডিসজেইন্ট' নিশ্চিত করার উপায়টি ক্রস বৈধতা: যে কোনও ফোল্ডের জন্য, সিসিসিভি এক্স এবং ওয়াইটিকে আপনার প্রশিক্ষণ এবং ক্রমাঙ্কণের ডেটাতে বিভক্ত করবে, সুতরাং সেগুলি ওভারল্যাপ হয় না।

টিএলডিআর: পদ্ধতিটি আপনাকে প্রশিক্ষণের জন্য এবং ক্রমাঙ্কণের জন্য কী ব্যবহৃত হয় তা নিয়ন্ত্রণ করতে দেয়। উভয় উদ্দেশ্যে আপনার ডেটা থেকে সর্বাধিক ব্যবহার করার চেষ্টা করার জন্য দুটি পদ্ধতি ক্রস বৈধতা ব্যবহার করে।


14

আমি এই প্রশ্নেও আগ্রহী এবং CalibratedClassifierCV (সিসিসিভি) আরও ভালভাবে বুঝতে কিছু পরীক্ষা যুক্ত করতে চাই add

যেমন ইতিমধ্যে বলা হয়েছে, এটি ব্যবহারের দুটি উপায় রয়েছে।

#Method 1, train classifier within CCCV
model = CalibratedClassifierCV(my_clf)
model.fit(X_train_val, y_train_val)

#Method 2, train classifier and then use CCCV on DISJOINT set
my_clf.fit(X_train, y_train)
model = CalibratedClassifierCV(my_clf, cv='prefit')
model.fit(X_val, y_val)

বিকল্পভাবে, আমরা দ্বিতীয় পদ্ধতিটি চেষ্টা করতে পারি তবে আমরা যে একই ডেটা লাগিয়েছিলাম তার উপর কেবল ক্রমাঙ্কন করতে পারি।

#Method 2 Non disjoint, train classifier on set, then use CCCV on SAME set used for training
my_clf.fit(X_train_val, y_train_val)
model = CalibratedClassifierCV(my_clf, cv='prefit')
model.fit(X_train_val, y_train_val)

যদিও দস্তাবেজগুলি পৃথকীকরণ সেটটি ব্যবহার করার জন্য সতর্ক করে, এটি কার্যকর হতে পারে কারণ এটি আপনাকে পরে পরিদর্শন করতে দেয় my_clf(উদাহরণস্বরূপ, এটি দেখার জন্য coef_, যা CalibratedClassifierCV অবজেক্ট থেকে অনুপলব্ধ)। (ক্যালিব্রেটেড ক্লাসিফায়ারদের কাছ থেকে কীভাবে এটি পাবেন তা কি কেউ জানেন --- একটির জন্য, তাদের মধ্যে তিনটি রয়েছে তাই আপনি গড় সহগটি চান?)।

আমি সিদ্ধান্ত নিয়েছি যে এই তিনটি পদ্ধতির সম্পূর্ণভাবে আউট টেস্ট সেটটিতে তাদের ক্রমাঙ্কণের শর্তে তুলনা করব।

এখানে একটি ডেটাসেট রয়েছে:

X, y = datasets.make_classification(n_samples=500, n_features=200,
                                    n_informative=10, n_redundant=10,
                                    #random_state=42, 
                                    n_clusters_per_class=1, weights = [0.8,0.2])

আমি কিছু শ্রেণির ভারসাম্যহীনতা ফেলেছি এবং এটিকে একটি সমস্যা তৈরি করতে কেবল 500 টি নমুনা সরবরাহ করেছি।

আমি প্রতিবার প্রতিটি পদ্ধতি চেষ্টা করে এবং এর ক্রমাঙ্কন বক্ররেখার পরিকল্পনা করে 100 টি ট্রায়াল চালাই।

এখানে চিত্র বর্ণনা লিখুন

বক্সার প্লট অফ বারিয়ার স্কোর সমস্ত পরীক্ষায়:

এখানে চিত্র বর্ণনা লিখুন

নমুনার সংখ্যা বাড়িয়ে 10,000:

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন

যদি আমরা ক্লাসিফায়ারটিকে নাইভ বেয়েসে পরিবর্তন করি, 500 টি নমুনায় ফিরে যাচ্ছি:

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন

এটি ক্যালিব্রেট করার জন্য পর্যাপ্ত নমুনাগুলি নয় বলে মনে হয়। নমুনা বাড়িয়ে 10,000

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন

সম্পূর্ণ কোড

print(__doc__)

# Based on code by Alexandre Gramfort <alexandre.gramfort@telecom-paristech.fr>
#         Jan Hendrik Metzen <jhm@informatik.uni-bremen.de>

import matplotlib.pyplot as plt

from sklearn import datasets
from sklearn.naive_bayes import GaussianNB
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import brier_score_loss
from sklearn.calibration import CalibratedClassifierCV, calibration_curve
from sklearn.model_selection import train_test_split


def plot_calibration_curve(clf, name, ax, X_test, y_test, title):

    y_pred = clf.predict(X_test)
    if hasattr(clf, "predict_proba"):
        prob_pos = clf.predict_proba(X_test)[:, 1]
    else:  # use decision function
        prob_pos = clf.decision_function(X_test)
        prob_pos = \
            (prob_pos - prob_pos.min()) / (prob_pos.max() - prob_pos.min())

    clf_score = brier_score_loss(y_test, prob_pos, pos_label=y.max())

    fraction_of_positives, mean_predicted_value = \
        calibration_curve(y_test, prob_pos, n_bins=10, normalize=False)

    ax.plot(mean_predicted_value, fraction_of_positives, "s-",
             label="%s (%1.3f)" % (name, clf_score), alpha=0.5, color='k', marker=None)

    ax.set_ylabel("Fraction of positives")
    ax.set_ylim([-0.05, 1.05])
    ax.set_title(title)

    ax.set_xlabel("Mean predicted value")

    plt.tight_layout()
    return clf_score

    fig, (ax1, ax2, ax3) = plt.subplots(nrows=3, ncols=1, figsize=(6,12))

    ax1.plot([0, 1], [0, 1], "k:", label="Perfectly calibrated",)
    ax2.plot([0, 1], [0, 1], "k:", label="Perfectly calibrated")
    ax3.plot([0, 1], [0, 1], "k:", label="Perfectly calibrated")

    scores = {'Method 1':[],'Method 2':[],'Method 3':[]}


fig, (ax1, ax2, ax3) = plt.subplots(nrows=3, ncols=1, figsize=(6,12))

ax1.plot([0, 1], [0, 1], "k:", label="Perfectly calibrated",)
ax2.plot([0, 1], [0, 1], "k:", label="Perfectly calibrated")
ax3.plot([0, 1], [0, 1], "k:", label="Perfectly calibrated")

scores = {'Method 1':[],'Method 2':[],'Method 3':[]}

for i in range(0,100):

    X, y = datasets.make_classification(n_samples=10000, n_features=200,
                                        n_informative=10, n_redundant=10,
                                        #random_state=42, 
                                        n_clusters_per_class=1, weights = [0.8,0.2])

    X_train_val, X_test, y_train_val, y_test = train_test_split(X, y, test_size=0.80,
                                                        #random_state=42
                                                               )

    X_train, X_val, y_train, y_val = train_test_split(X_train_val, y_train_val, test_size=0.80,
                                                      #random_state=42
                                                     )

    #my_clf = GaussianNB()
    my_clf = LogisticRegression()

    #Method 1, train classifier within CCCV
    model = CalibratedClassifierCV(my_clf)
    model.fit(X_train_val, y_train_val)
    r = plot_calibration_curve(model, "all_cal", ax1, X_test, y_test, "Method 1")
    scores['Method 1'].append(r)

    #Method 2, train classifier and then use CCCV on DISJOINT set
    my_clf.fit(X_train, y_train)
    model = CalibratedClassifierCV(my_clf, cv='prefit')
    model.fit(X_val, y_val)
    r = plot_calibration_curve(model, "all_cal", ax2, X_test, y_test, "Method 2")
    scores['Method 2'].append(r)

    #Method 3, train classifier on set, then use CCCV on SAME set used for training
    my_clf.fit(X_train_val, y_train_val)
    model = CalibratedClassifierCV(my_clf, cv='prefit')
    model.fit(X_train_val, y_train_val)
    r = plot_calibration_curve(model, "all_cal", ax3, X_test, y_test, "Method 2 non Dis")
    scores['Method 3'].append(r)

import pandas
b = pandas.DataFrame(scores).boxplot()
plt.suptitle('Brier score')

সুতরাং, বেরিয়ার স্কোরের ফলাফলগুলি বেআইনী, তবে বক্ররেখা অনুসারে দ্বিতীয় পদ্ধতিটি ব্যবহার করা ভাল বলে মনে হয়।

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