我仍然不确定这个问题应该在这个论坛还是在Cross-Validated上提问,但我会先在这里尝试,因为这个问题更多是关于代码的输出而不是技术本身。事情是这样的,我在运行一个CatBoost分类器,就像这样:
# 导入库import pandas as pdfrom catboost import CatBoostClassifierfrom sklearn.metrics import accuracy_score, recall_score, precision_score, f1_scorefrom sklearn.model_selection import train_test_split # 导入数据train = pd.read_csv("train.csv")# 获取特征和标签X = train[["Pclass", "Sex", "SibSp", "Parch", "Fare"]]y = train[["Survived"]]# 分割成训练和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)# 模型参数 model_cb = CatBoostClassifier( cat_features=["Pclass", "Sex"], loss_function="Logloss", eval_metric="AUC", learning_rate=0.1, iterations=500, od_type = "Iter", od_wait = 200)# 拟合模型model_cb.fit( X_train, y_train, plot=True, eval_set=(X_test, y_test), verbose=50,)y_pred = model_cb.predict(X_test)print(f1_score(y_test, y_pred, average="macro"))print(roc_auc_score(y_test, y_pred))
我使用的数据框来自泰坦尼克号竞赛(链接)。
问题在于,model_cb.fit步骤显示的AUC为0.87,但最后一行,sklearn的roc_auc_score显示的AUC为0.73,即低得多。据我所知,CatBoost的AUC应该已经是在测试数据集上的结果了。
有谁知道问题出在哪里,以及我该如何解决这个问题?
回答:
ROC曲线需要预测的概率或其他某种置信度测量,而不是硬类别预测。使用
y_pred = model_cb.predict_proba(X_test)[:, 1]