Моя цель - рассчитать AUC, специфичность, чувствительность с 95% доверительным интервалом из 5 * 10 StratifiedKfold CV. Мне также нужны специфичность и чувствительность для порога 0,4, чтобы максимизировать чувствительность.
Пока мне удалось реализовать это для AUC. Код ниже:
seed = 42
# Grid Search
fit_intercept=[True, False]
C = [np.arange(1,41,1)]
penalty = ['l1', 'l2']
params = dict(C=C, fit_intercept = fit_intercept, penalty = penalty)
print(params)
logreg = LogisticRegression(random_state=seed)
# instantiate the grid
logreg_grid = GridSearchCV(logreg, param_grid = params , cv=5, scoring='roc_auc', iid='False')
# fit the grid with data
logreg_grid.fit(X_train, y_train)
logreg = logreg_grid.best_estimator_
cv = RepeatedStratifiedKFold(n_splits = 5, n_repeats = 10, random_state = seed)
logreg_scores = cross_val_score(logreg, X_train, y_train, cv=cv, scoring='roc_auc')
print('LogReg:',logreg_scores.mean())
import scipy.stats
def mean_confidence_interval(data, confidence=0.95):
a = 1.0 * np.array(data)
n = len(a)
m, se = np.mean(a), scipy.stats.sem(a)
h = se * scipy.stats.t.ppf((1 + confidence) / 2, n-1)
return m, m-h, m+h
mean_confidence_interval(logreg_scores, confidence=0.95)
Выход: (0,7964761904761904, 0,7675441789148183, 0,8254082020375626)
Пока я действительно доволен, но как я могу реализовать это для вероятностей, чтобы я мог рассчитать FPR, TPR и пороги? Для простого 5-кратного я бы сделал это так:
def evaluate_threshold(threshold):
print('Sensitivity(',threshold,'):', tpr[thresholds > threshold][-1])
print('Specificity(',threshold,'):', 1 - fpr[thresholds > threshold][-1])
logreg_proba = cross_val_predict(logreg, X_train, y_train, cv=5, method='predict_proba')
fpr, tpr, thresholds = metrics.roc_curve(y_train, log_proba[:,1])
evaluate_threshold(0.5)
evaluate_threshold(0.4)
#Output would be:
#Sensitivity( 0.5 ): 0.76
#Specificity( 0.5 ): 0.7096774193548387
#Sensitivity( 0.4 ): 0.88
#Specificity( 0.4 ): 0.6129032258064516
Если я попробую это сделать с резюме 5 * 10:
cv = RepeatedStratifiedKFold(n_splits = 5, n_repeats = 10, random_state = seed)
y_pred = cross_val_predict(logreg, X_train, y_train, cv=cv, method='predict_proba')
fpr, tpr, thresholds = metrics.roc_curve(y_train, log_proba[:,1])
evaluate_threshold(0.5)
evaluate_threshold(0.4)
выдает ошибку:
cross_val_predict only works for partitions
Не могли бы вы помочь мне решить эту проблему?