在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
相关产品推荐
相关产品推荐

