Olasılık tahminleri ile tekrarlanan 10 kat çapraz doğrulama için ortalama ROC


15

Makine öğrenimi algoritması kullanarak yaklaşık 10.000 vakada tekrarlanan (10 kez) tabakalı 10 kat çapraz doğrulamayı kullanmayı planlıyorum. Her seferinde tekrarlama farklı rastgele tohumlarla yapılacaktır.

Bu süreçte her durum için 10 olasılık tahmini örneği oluştururum. 10 misli çapraz validasyonun 10 tekrarının her biri için 1 olasılık tahmini

Her vaka için 10 olasılık ortalayabilir ve daha sonra eşleştirilmiş karşılaştırmalar ile diğer ROC eğrileriyle karşılaştırılabilecek yeni bir ortalama ROC eğrisi oluşturabilir miyim (tekrarlanan 10 kat CV sonuçlarını temsil eder)?

Yanıtlar:


13

Açıklamanıza göre çok mantıklı görünüyor: sadece ortalama ROC eğrisini hesaplamakla kalmaz, aynı zamanda güven aralıkları oluşturmak için etrafındaki varyansı da hesaplayabilirsiniz. Size modelinizin ne kadar kararlı olduğu fikrini vermelidir.

Örneğin, şöyle:

resim açıklamasını buraya girin

Burada ortalama eğri ve güven aralıklarının yanı sıra bireysel ROC eğrileri koydum. Eğrilerin kabul ettiği alanlar var, bu yüzden daha az varyansımız var ve katılmadıkları alanlar var.

Tekrarlanan CV için, bunu birkaç kez tekrarlayabilir ve tüm ayrı katlarda toplam ortalamayı alabilirsiniz:

resim açıklamasını buraya girin

Önceki resme oldukça benzer, ancak ortalama ve varyans için daha kararlı (yani güvenilir) tahminler verir.

İşte arsa almak için kod:

import matplotlib.pyplot as plt
import numpy as np
from scipy import interp

from sklearn.datasets import make_classification
from sklearn.cross_validation import KFold
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_curve

X, y = make_classification(n_samples=500, random_state=100, flip_y=0.3)

kf = KFold(n=len(y), n_folds=10)

tprs = []
base_fpr = np.linspace(0, 1, 101)

plt.figure(figsize=(5, 5))

for i, (train, test) in enumerate(kf):
    model = LogisticRegression().fit(X[train], y[train])
    y_score = model.predict_proba(X[test])
    fpr, tpr, _ = roc_curve(y[test], y_score[:, 1])

    plt.plot(fpr, tpr, 'b', alpha=0.15)
    tpr = interp(base_fpr, fpr, tpr)
    tpr[0] = 0.0
    tprs.append(tpr)

tprs = np.array(tprs)
mean_tprs = tprs.mean(axis=0)
std = tprs.std(axis=0)

tprs_upper = np.minimum(mean_tprs + std, 1)
tprs_lower = mean_tprs - std


plt.plot(base_fpr, mean_tprs, 'b')
plt.fill_between(base_fpr, tprs_lower, tprs_upper, color='grey', alpha=0.3)

plt.plot([0, 1], [0, 1],'r--')
plt.xlim([-0.01, 1.01])
plt.ylim([-0.01, 1.01])
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
plt.axes().set_aspect('equal', 'datalim')
plt.show()

Tekrarlanan CV için:

idx = np.arange(0, len(y))

for j in np.random.randint(0, high=10000, size=10):
    np.random.shuffle(idx)
    kf = KFold(n=len(y), n_folds=10, random_state=j)

    for i, (train, test) in enumerate(kf):
        model = LogisticRegression().fit(X[idx][train], y[idx][train])
        y_score = model.predict_proba(X[idx][test])
        fpr, tpr, _ = roc_curve(y[idx][test], y_score[:, 1])

        plt.plot(fpr, tpr, 'b', alpha=0.05)
        tpr = interp(base_fpr, fpr, tpr)
        tpr[0] = 0.0
        tprs.append(tpr)

İlham kaynağı: http://scikit-learn.org/stable/auto_examples/model_selection/plot_roc_crossval.html


3

Ortalama olasılıklar doğru değildir, çünkü bu, doğrulamaya çalıştığınız tahminleri temsil etmez ve doğrulama örnekleri arasında kontaminasyonu içerir.

Yeterli kesinlik elde etmek için 100 tekrar 10 kat çapraz doğrulamanın gerekli olabileceğini unutmayın. Veya aynı hassasiyet için daha az yineleme gerektiren Efron-Gong iyimserlik bootstrapini kullanın (bkz. Örneğin R rmspaket validatefonksiyonları).

ROC eğrileri hiçbir şekilde bu sorun hakkında bilgi sahibi değildir. Doğru bir doğruluk skoru kullanın ve Wilcoxon-Mann-Whitney istatistiği kullanılarak kolayca ve hızlı bir şekilde hesaplandığından eğriden çok daha kolay olan endeksi (uyum olasılığı; AUROC) ile eşlik edin .c


Ortalamalamanın neden doğru olmadığı konusunda daha ayrıntılı bilgi verebilir misiniz?
DataD'oh

Zaten belirtilmiş. Alanda kullanacağınız önlemi doğrulamanız gerekir.
Frank Harrell
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.