В следующем коде я соответствую модели LogisticRegressionCV с данными X_test
(функции) и y_test
(метка).
Затем, используя модель, я применяю cross_val_predict
в 10 раз, чтобы оценить производительность с помощью CV. Я рассчитываю две разные оценки AUC
, одна с помощью метода roc_auc_score
для прогнозов, а другая с методом auc
для вероятностей.
#CV LOGISTIC REGRESSION
classifier = linear_model.LogisticRegressionCV(penalty='l1',class_weight='balanced', tol=0.01, Cs=[0.1],
max_iter=4000, solver='liblinear', random_state = 42, cv=10)
classifier.fit(X_test, y_test);
predicted = sklearn.model_selection.cross_val_predict(classifier, X_test, y_test, cv=10)
print ("AUC1:{}".format(sklearn.metrics.roc_auc_score(y_test, predicted)))#np.average(scores)))
probas_ = sklearn.model_selection.cross_val_predict(classifier, X_test, y_test, cv=10, method='predict_proba')
fpr, tpr, thresholds = sklearn.metrics.roc_curve(y_test, probas_[:, 1])
roc_auc = sklearn.metrics.auc(fpr, tpr)
print ("AUC2 :{}".format(roc_auc))
Баллы AUC составляют 0,624 и 0,654 соответственно.
Затем я строю другую модель LogisticRegression на этот раз, используя GridSearchCV
. Модель обучается на тех же данных обучения (используется в CV), но на этот раз она предсказывает данные теста:
## GRIDSEARCHCV LOGISTIC REGRESSION
param_grid={'C': np.logspace(-2, 2, 40)}
# Create grid search object
clf = sklearn.model_selection.GridSearchCV(linear_model.LogisticRegression(penalty='l1',
class_weight='balanced',
solver = 'liblinear',
max_iter=4000,
random_state = 42),
param_grid = param_grid,
cv = 5,
scoring = 'roc_auc',
verbose=True,
n_jobs=-1)
best_clf = clf.fit(X_train, y_train)
predicted = best_clf.predict(X_test)
print ("AUC1:{}".format(best_clf.best_score_))
probas_ = best_clf.predict_proba(X_test)
fpr, tpr, thresholds = sklearn.metrics.roc_curve(y_test, probas_[:, 1])
roc_auc = sklearn.metrics.auc(fpr, tpr)
print ("AUC2 :{}".format(roc_auc))
На этот раз оценки AUC равны 0,603 и 0,688 соответственно.
То есть одно превосходит другое в зависимости от используемого показателя AUC. В этом посте рекомендует второй счет AUC, о котором я сообщил здесь. Но теперь я понимаю, как CV работает хуже, хотя его обучают и тестируют с теми же данными.
Есть идеи? Как вы думаете, это нормально (если так, почему)? Кроме того, мне интересно, если мой код выглядит хорошо. Я ценю ваши предложения.