GridSearchCV ‘roc_auc‘结果和roc_auc_score不一致

最近XGBoost调参时发现这个问题,解决后记录一下。

from sklearn.model_selection import GridSearchCV
import xgboost as xgb
from sklearn.metrics import classification_report, roc_curve, auc, confusion_matrix, recall_score, precision_score, f1_score, roc_auc_score, make_scorer

param_test1 = {
    'max_depth': [i for i in range(3, 10, 2)],
    'min_child_weight': [i for i in range(1, 6, 2)]
}
gsearch = GridSearchCV(
    estimator=xgb.XGBClassifier(
        learning_rate=0.1,
        n_estimators=140, 
        max_depth=5,
        min_child_weight=1,
        gamma=0,
        subsample=0.8,
        colsample_bytree=0.8,
        nthread=4,
        scale_pos_weight=1,
        seed=27),
    param_grid=param_test1,
    scoring='roc_auc',
    cv=5)
gsearch.fit(X_train, y_train)
y_pred = gsearch.predict(X_test)
print('max_depth, min_child_weight')
print('Best parameters:', gsearch.best_params_)
print('Best cross-validation score(AUC):{:.3f}'.format(gsearch.best_score_
### 关于 `roc_auc_score` ROC 曲线 #### 定义与关系 接收者操作特征 (Receiver Operating Characteristic, ROC) 曲线下面积(Area Under the Curve, AUC),即 `roc_auc_score` 是衡量二元分类器性能的一种方式[^1]。AUC 值表示的是整个二维图上由 ROC 曲线所包围的区域大小,该值越接近于 1 表明模型区分正负样本的能力越好。 ROC 曲线通过绘制同阈值下的真正率(True Positive Rate, TPR)假正率(False Positive Rate, FPR),来展示分类器的表现情况。而 `roc_auc_score` 函数计算的就是这条曲线下方的总面积,在理想情况下其数值会趋向于最大值 1.0;当预测完全随机时,则等于 0.5 左右[^2]。 #### Python 中使用 Sklearn 实现 为了更好地理解如何利用 Scikit-Learn 库中的 `roc_auc_score` 来评估机器学习算法的效果,下面给出一段简单的代码示例: ```python from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.preprocessing import label_binarize from sklearn.multiclass import OneVsRestClassifier from sklearn.svm import SVC from sklearn.metrics import roc_curve, auc, roc_auc_score import matplotlib.pyplot as plt import numpy as np # 加载数据集并做预处理 iris = datasets.load_iris() X = iris.data y = iris.target y = label_binarize(y, classes=[0, 1, 2]) n_classes = y.shape[1] # 划分训练集测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.5, random_state=0) # 训练多标签分类器 classifier = OneVsRestClassifier(SVC(kernel='linear', probability=True)) y_score = classifier.fit(X_train, y_train).decision_function(X_test) # 计算每一类别的ROC曲线以及AUC得分 fpr = dict() tpr = dict() roc_auc = dict() for i in range(n_classes): fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i]) roc_auc[i] = auc(fpr[i], tpr[i]) # 绘制所有类别对应的ROC曲线 plt.figure(figsize=(8,6)) colors = ['aqua', 'darkorange', 'cornflowerblue'] for i, color in zip(range(n_classes), colors): plt.plot(fpr[i], tpr[i], color=color, lw=2, label=f'Class {i} (area = {roc_auc[i]:.2f})') plt.plot([0, 1], [0, 1], 'k--', lw=2) plt.xlim([-0.05, 1.05]) plt.ylim([-0.05, 1.05]) plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plt.title('Some extension of Receiver operating characteristic to multi-class') plt.legend(loc="lower right") plt.show() ``` 这段程序展示了如何基于鸢尾花数据集构建一个多类别支持向量机分类器,并针对每一对 "其他 vs 单独一类" 的情况进行 ROC 分析及 AUC 得分计算。最后还画出了相应的图形化结果以便直观观察各个类别的表现差异。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值