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:
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:
Ö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