为什么交叉验证的性能比测试差?

时间:2019-06-27 15:49:50

标签: python machine-learning scikit-learn logistic-regression cross-validation

在以下代码中,我将LogisticRegressionCV模型与X_test(功能)和y_test(标签)数据配合使用。

然后,使用10倍的模型应用cross_val_predict,以使用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。

然后,这次我使用GridSearchCV构建另一个LogisticRegression模型。该模型是在相同的训练数据(用于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得分,一个胜过另一个。 This post推荐了我在这里报告的第二个AUC分数。但是,尽管我使用相同的数据对CV进行了训练和测试,但我现在仍然做CV的表现较差。

有什么想法吗?您认为这是正常现象吗(如果是,为什么)?另外,我想知道我的代码是否正常。感谢您的建议。

1 个答案:

答案 0 :(得分:2)

嗯,我认为您需要对CV使用培训数据而不是测试数据。 您的第一个模型(LGR分类器)安装在X_test,y_test上,交叉验证模型('predicited)也安装了

由于测试数据集通常比训练数据集具有更少的实例或数据行,因此可能由于数据量较小而导致模型不适合。

尝试在训练集上全部完成测试,测试集通常仅用于预测,拟合测试集否认了检查未拟合(看不见)数据的模型性能的意思。

祝你好运〜