Середня ROC для повторної 10-кратної перехресної перевірки з оцінками ймовірності


15

Я планую використовувати повторну (10 разів) стратифіковану 10-кратну перехресну перевірку приблизно на 10000 випадків за допомогою алгоритму машинного навчання. Кожен раз, коли повторення буде проводитися з різними випадковими насінням.

У цьому процесі я створюю 10 екземплярів оцінки ймовірностей для кожного випадку. 1 екземпляр оцінки ймовірності для кожного з 10 повторень 10-кратної перехресної перевірки

Чи можу я оцінити 10 ймовірностей для кожного випадку, а потім створити нову середню криву ROC (що представляє результати повторного 10-кратного CV), яку можна порівняти з іншими кривими ROC за парними порівняннями?

Відповіді:


13

З вашого опису, здається, це має ідеальний сенс: ви можете не тільки обчислити середню криву ROC, але і дисперсію навколо неї для побудови довірчих інтервалів. Це повинно дати вам уявлення про стійкість вашої моделі.

Наприклад, наприклад:

введіть тут опис зображення

Тут я розміщую окремі криві ROC, а також середню криву та довірчі інтервали. Є ділянки, де криві погоджуються, тому у нас менше розбіжностей, і є ділянки, де вони не згодні.

Для повторного резюме ви можете просто повторити його кілька разів і отримати загальне середнє значення для всіх окремих складових:

введіть тут опис зображення

Він досить схожий на попередню картину, але дає більш стійкі (тобто достовірні) оцінки середнього та відхилення.

Ось код для отримання сюжету:

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

Для повторного резюме:

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)

Джерело натхнення: http://scikit-learn.org/stable/auto_examples/model_selection/plot_roc_crossval.html


3

Неправильно середні ймовірності, тому що це не відображатиме прогнози, які ви намагаєтесь перевірити, і передбачає забруднення для всіх зразків перевірки.

Зауважте, що для досягнення належної точності може знадобитися 100 повторень 10-кратної перехресної перевірки. Або скористайтеся завантажувачем оптимізму Efron-Gong, який вимагає меншої кількості ітерацій з однаковою точністю (див., Наприклад, функції rmsпакету R validate).

Криві ROC жодним чином не розуміють цієї проблеми. Використовуйте належний показник точності та супроводжуйте його -index (вірогідність узгодження; AUROC), з яким набагато простіше, ніж з кривою, оскільки він обчислюється легко та швидко, використовуючи статистику Вілкоксона-Манна-Вітні.c


Чи можете ви детальніше розібратися, чому усереднення не є правильним?
DataD'oh

Вже заявлено. Вам потрібно перевірити міру, яку ви будете використовувати в полі.
Френк Харрелл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.