Почему перекрестная проверка работает хуже, чем тестирование? - PullRequest
1 голос
/ 27 июня 2019

В следующем коде я соответствую модели 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 работает хуже, хотя его обучают и тестируют с теми же данными.

Есть идеи? Как вы думаете, это нормально (если так, почему)? Кроме того, мне интересно, если мой код выглядит хорошо. Я ценю ваши предложения.

1 Ответ

2 голосов
/ 27 июня 2019

Ну, я думаю, вам нужно использовать данные для обучения, а не данные испытаний. Ваша первая модель (классификатор LGR) установлена ​​на X_test, y_test, как и ваша модель перекрестной проверки ('предсказанная).

Поскольку в наборе тестовых данных обычно меньше экземпляров или строк данных, чем в наборе обучающих данных, возможно, модель недостаточно подходит из-за меньшего размера данных.

Старайтесь делать их все на тренировочном наборе, тестовый набор обычно предназначен только для прогнозирования, подходящий тестовый набор отрицает, что он имеет смысл проверять производительность модели на неподходящих (невидимых) данных.

Удачи ~

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...