Từ mô tả của bạn, nó dường như có ý nghĩa hoàn hảo: không chỉ bạn có thể tính toán đường cong ROC trung bình, mà cả phương sai xung quanh nó để xây dựng khoảng tin cậy. Nó sẽ cho bạn ý tưởng về mức độ ổn định của mô hình của bạn.
Ví dụ, như thế này:
Ở đây tôi đặt các đường cong ROC riêng lẻ cũng như đường cong trung bình và khoảng tin cậy. Có những khu vực mà các đường cong đồng ý, vì vậy chúng ta có ít phương sai hơn và có những khu vực chúng không đồng ý.
Đối với CV lặp đi lặp lại, bạn có thể chỉ cần lặp lại nhiều lần và nhận tổng số trung bình trên tất cả các nếp gấp riêng lẻ:
Nó khá giống với hình ảnh trước, nhưng đưa ra các ước tính ổn định hơn (nghĩa là đáng tin cậy) về giá trị trung bình và phương sai.
Đây là mã để có được cốt truyện:
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()
Đối với CV lặp đi lặp lại:
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)
Nguồn cảm hứng: http://scikit-learn.org/urdy/auto_examples/model_selection/plot_roc_crossval.html