You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在GridSearchCV中创建NPV自定义评分器及代码问题排查

GridSearchCV中自定义二分类指标(含NPV)及相关问题解决方案

1. 修复鸢尾花数据集准确率始终为1的问题

鸢尾花默认是三分类任务,数据可分性强,简单模型极易达到100%准确率。如果你要做二分类场景的实验,必须先筛选出两类样本,示例代码如下:

from sklearn.datasets import load_iris
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC
from sklearn.metrics import make_scorer, accuracy_score, precision_score

# 加载数据集并转为二分类(仅保留setosa和versicolor,对应类别0和1)
iris = load_iris()
X, y = iris.data, iris.target
mask = y != 2
X_bin, y_bin = X[mask], y[mask]

# 定义模型与调参网格
model = SVC()
param_grid = {'C': [0.1, 1, 10], 'kernel': ['linear', 'rbf']}

2. 自定义NPV指标并集成到GridSearchCV

NPV的计算公式为 NPV = TN / (TN + FN),我们可以通过make_scorer将自定义的NPV计算函数转为GridSearchCV可识别的评分器,同时还能添加precision等其他二分类指标:

import numpy as np
from sklearn.metrics import confusion_matrix

def negative_predictive_value(y_true, y_pred):
    tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()
    # 处理分母为0的边界情况
    return tn / (tn + fn) if (tn + fn) != 0 else 0.0

# 创建NPV评分器,设置greater_is_better=True表示得分越高模型越好
npv_scorer = make_scorer(negative_predictive_value, greater_is_better=True)

# 定义多指标评估字典,包含原生指标和自定义指标
scoring = {
    'accuracy': 'accuracy',
    'precision': make_scorer(precision_score),
    'npv': npv_scorer
}

# 初始化GridSearchCV,refit='npv'表示以NPV最优为标准选择最佳模型
grid_search = GridSearchCV(model, param_grid, scoring=scoring, refit='npv', cv=5, verbose=1)
grid_search.fit(X_bin, y_bin)

# 查看结果
print("最佳参数:", grid_search.best_params_)
print("最佳模型的NPV交叉验证得分:", grid_search.best_score_)

3. 在GridSearchCV中访问预测值

方法1:用最佳模型预测任意数据集

GridSearchCV的best_estimator_属性存储了交叉验证选出的最优模型,直接用它做预测即可:

# 预测二分类鸢尾花数据集
y_pred = grid_search.best_estimator_.predict(X_bin)

# 计算TP/TN/FP/FN
tn, fp, fn, tp = confusion_matrix(y_bin, y_pred).ravel()
print(f"TP: {tp}, TN: {tn}, FP: {fp}, FN: {fn}")

方法2:获取交叉验证过程中的预测结果

如果需要查看每一轮交叉验证的预测值,使用cross_val_predict配合最优模型:

from sklearn.model_selection import cross_val_predict

# 得到交叉验证的所有预测结果
y_pred_cv = cross_val_predict(grid_search.best_estimator_, X_bin, y_bin, cv=5)

# 基于交叉验证预测值计算NPV
cv_npv = negative_predictive_value(y_bin, y_pred_cv)
print("交叉验证整体NPV得分:", cv_npv)

注意事项

  • 自定义评分函数必须接收y_true和y_pred两个参数,返回单个数值。
  • 二分类场景下,若要指定正类(比如以类别0为正类),可以在make_scorer中添加pos_label参数,例如make_scorer(precision_score, pos_label=0)。
  • 当scoring参数为字典时,GridSearchCV会计算所有指定指标,refit参数决定了哪个指标的最优结果用来选择最佳模型。

内容的提问来源于stack exchange,提问作者meica_wuerstchen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 01:10:27