如何针对非平衡数据集计算分层K折交叉验证的假阳性率(FPR)
要实现在分层K折交叉验证中计算假阳性率(FPR),你只需要自定义FPR的评分函数,添加到现有scoring字典即可,具体实现如下:
实现步骤
- 首先自定义FPR计算函数:FPR的计算公式为 假阳性样本数 / (假阳性样本数 + 真阴性样本数),我们可以借助sklearn的混淆矩阵接口计算
- 用
make_scorer包装自定义的FPR函数,加入到现有的评分字典中 - 运行交叉验证即可同时返回FPR的每折结果
完整修改后代码
# 新增导入混淆矩阵接口和决策树分类器(原代码漏了决策树的导入) from sklearn.metrics import make_scorer, accuracy_score, precision_score, recall_score, f1_score, confusion_matrix from sklearn.model_selection import StratifiedKFold from sklearn.model_selection import cross_validate from sklearn.tree import DecisionTreeClassifier # 自定义FPR评分函数,增加除零保护避免特殊样本分布报错 def false_positive_rate(y_true, y_pred): tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel() denominator = fp + tn if denominator == 0: return 0.0 return fp / denominator scoring = {'accuracy' : make_scorer(accuracy_score), 'precision' : make_scorer(precision_score), 'recall' : make_scorer(recall_score), 'f1_score' : make_scorer(f1_score), # 新增FPR评分项 'fpr': make_scorer(false_positive_rate)} skfold = StratifiedKFold(n_splits=10) dt_clf = DecisionTreeClassifier() results = cross_validate(estimator=dt_clf, X=data_train_X, y=target_train_Y, cv=skfold, scoring=scoring) print("Results", results) # 可单独调取每折FPR结果 print("每折FPR结果:", results['test_fpr']) # 查看10折平均FPR print("平均FPR:", results['test_fpr'].mean())
多分类场景适配说明
如果是多分类任务,只需要修改自定义FPR函数的计算逻辑,根据需求指定平均方式(宏平均、微平均、加权平均)、对应类别标签即可。
内容的提问来源于stack exchange,提问作者Arun Kumar Dey
相关产品推荐
相关产品推荐

