执行代码遇ValueError:pos_label=1无效,如何排查解决?
极端不平衡数据集下LearningCurveDisplay报错的成因与解决
错误成因
报错ValueError: pos_label=1 is not a valid label: It should be one of [0]的核心原因是:交叉验证的部分折数中,验证集完全没有少数类(标签1)的样本。
webpage属于极端不平衡数据集,正负样本比例悬殊。哪怕使用分层交叉验证,当少数类样本总数过少时,分层抽样仍可能导致某几折的验证集里只有标签0的样本。而average_precision评分指标默认以标签1为正类,当验证集不存在该标签时,就会触发这个错误。
解决办法
1. 优化分层交叉验证策略
使用StratifiedKFold并开启打乱(shuffle=True),同时调整折数(比如减少到3折),确保每折都能分到少数类样本:
from sklearn.model_selection import StratifiedKFold # 定义分层交叉验证规则,打乱数据保证样本分布均匀 cv = StratifiedKFold(n_splits=3, shuffle=True, random_state=0) LearningCurveDisplay.from_estimator( model, X, y, train_sizes=train_sizes, cv=cv, scoring='average_precision', line_kw={"marker": "o"}, )
2. 调整评分指标
方案A:自定义评分器处理单类别情况
手动编写评分函数,当验证集只有单一类别时返回合理默认值:
from sklearn.metrics import make_scorer, average_precision_score import numpy as np def custom_ap(y_true, y_score): if len(np.unique(y_true)) == 1: return 0.0 return average_precision_score(y_true, y_score, pos_label=1) # 生成自定义评分器 custom_scorer = make_scorer(custom_ap, needs_proba=True) LearningCurveDisplay.from_estimator( model, X, y, train_sizes=train_sizes, cv=10, scoring=custom_scorer, line_kw={"marker": "o"}, )
方案B:换用鲁棒性更强的指标
比如roc_auc,它在单类别验证集下不会报错,对不平衡数据集也更友好:
LearningCurveDisplay.from_estimator( model, X, y, train_sizes=train_sizes, cv=10, scoring='roc_auc', line_kw={"marker": "o"}, )
3. 平衡数据集分布
使用过采样/欠采样方法调整类别比例,避免交叉验证时出现单类别折:
from imblearn.over_sampling import SMOTE # 对少数类进行过采样 smote = SMOTE(random_state=0) X_balanced, y_balanced = smote.fit_resample(X, y) LearningCurveDisplay.from_estimator( model, X_balanced, y_balanced, train_sizes=train_sizes, cv=10, scoring='average_precision', line_kw={"marker": "o"}, )
内容的提问来源于stack exchange,提问作者Sole Galli
相关产品推荐
相关产品推荐

