कैलिब्रेटेडक्लासीफायरसीवी के साथ सहपाठियों को जांचने का सही तरीका


16

Scikit में CalibratedClassifierCV है , जो हमें एक विशेष X, y जोड़ी पर हमारे मॉडल को कैलिब्रेट करने की अनुमति देता है। यह भी स्पष्ट रूप से बताता है कि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)

जिससे प्रशिक्षण के लिए कम डेटा छोड़ने का नुकसान होता है। इसके अलावा, अगर CalibratedClassifierCV केवल एक अलग प्रशिक्षण सेट पर फिट होने वाले मॉडल पर फिट होना चाहिए , तो यह डिफ़ॉल्ट विकल्प क्यों होगा cv=3, जो आधार अनुमानक भी फिट होगा? क्या क्रॉस सत्यापन अपने आप ही असंतुष्ट नियम को संभालता है?

प्रश्न: CalibratedClassifierCV का उपयोग करने का सही तरीका क्या है?

जवाबों:


18

CalibratedClassifierCV डॉक्स में उल्लिखित दो चीजें हैं जो उन तरीकों की ओर संकेत करती हैं जिनका उपयोग किया जा सकता है:

base_estimator: यदि cv = prefit है, तो क्लासिफायरियर डेटा पर पहले से ही फिट होना चाहिए।

cv: यदि "प्रीफ़िट" पारित हो जाता है, तो यह माना जाता है कि base_estimator पहले से ही फिट किया गया है और सभी डेटा का उपयोग अंशांकन के लिए किया जाता है।

मैं स्पष्ट रूप से इस गलत व्याख्या कर सकता हूं, लेकिन ऐसा प्रतीत होता है कि आप CCCV (कैलिब्रेटेडक्लासीफायरसीवी के लिए कम) का दो तरीकों से उपयोग कर सकते हैं:

नंबर एक:

  • तुम्हें पता है, हमेशा की तरह अपने मॉडल को प्रशिक्षित 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)। क्योंकि आपका मॉडल अप्रशिक्षित है, एक्स और वाई को प्रशिक्षण और अंशांकन दोनों के लिए उपयोग किया जाना है। यह सुनिश्चित करने का तरीका है कि डेटा 'डिसऑइंट' है, क्रॉस वेलिडेशन है: किसी भी गुना के लिए, CCCV आपके प्रशिक्षण और अंशांकन डेटा में X और y को विभाजित करेगा, इसलिए वे ओवरलैप नहीं होते हैं।

TLDR: विधि एक आपको प्रशिक्षण के लिए और अंशांकन के लिए उपयोग करने के लिए नियंत्रित करने की अनुमति देती है। दो उद्देश्यों के लिए अपने डेटा का अधिकतम उपयोग करने और बनाने के लिए विधि दो क्रॉस वेलिडेशन का उपयोग करता है।


14

मैं इस सवाल में भी दिलचस्पी रखता हूं और CalibratedClassifierCV (CCCV) को बेहतर ढंग से समझने के लिए कुछ प्रयोग जोड़ना चाहता हूं।

जैसा कि पहले ही कहा जा चुका है, इसका उपयोग करने के दो तरीके हैं।

#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_, जो कि कैलिब्रेटेड क्लैसेफायरसीवी ऑब्जेक्ट से अनुपलब्ध हैं)। (क्या किसी को पता है कि इसे कैलिब्रेटेड क्लासिफायर से कैसे प्राप्त किया जाना है --- एक के लिए, उनमें से तीन हैं तो क्या आप गुणांक को औसत करेंगे?)।

मैंने इन 3 तरीकों की तुलना पूरी तरह से आयोजित परीक्षण सेट पर उनके अंशांकन के संदर्भ में करने का निर्णय लिया।

यहाँ एक डेटासेट है:

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')

तो, बैरियर स्कोर परिणाम अनिर्णायक हैं, लेकिन घटता के अनुसार दूसरी विधि का उपयोग करना सबसे अच्छा लगता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.