【发布时间】:2019-11-09 16:37:14
【问题描述】:
在以下代码中,我使用 X_test(特征)和 y_test(标签)数据拟合 LogisticRegressionCV 模型。
然后,使用我应用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。
然后,我这次使用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 进行了训练和测试,但它的表现会更差。
有什么想法吗?你认为这正常吗(如果是,为什么)?另外,我想知道我的代码是否看起来不错。感谢您的建议。
【问题讨论】:
标签: python machine-learning scikit-learn logistic-regression cross-validation