在以下代码中,我将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的表现较差。
有什么想法吗?您认为这是正常现象吗(如果是,为什么)?另外,我想知道我的代码是否正常。感谢您的建议。
答案 0 :(得分:2)
嗯,我认为您需要对CV使用培训数据而不是测试数据。 您的第一个模型(LGR分类器)安装在X_test,y_test上,交叉验证模型('predicited)也安装了
。由于测试数据集通常比训练数据集具有更少的实例或数据行,因此可能由于数据量较小而导致模型不适合。
尝试在训练集上全部完成测试,测试集通常仅用于预测,拟合测试集否认了检查未拟合(看不见)数据的模型性能的意思。
祝你好运〜