LightGBM类别型目标下sklearn cross_val_score的f1评分报错问题
问题原因
f1、precision、recall这类指标默认是为二分类任务设计的,sklearn会默认将正类标签设为1,但你的目标列是类别型字符串(如鸢尾花数据集的['Iris-setosa' 'Iris-versicolor' 'Iris-virginica']),不存在1这个标签,因此触发报错。而accuracy、log loss、roc_auc这些指标本身支持多分类场景,不需要指定单一正类,所以能正常运行。
解决方案
根据你的任务类型(二分类/多分类)选择对应方案:
情况1:二分类任务
如果你的任务实际是二分类(比如只区分'Iris-virginica'和其他类),可以通过以下两种方式解决:
方式1:自定义评分器指定正类标签
使用make_scorer封装f1/precision/recall函数,明确指定正类的类别字符串:
from sklearn.metrics import make_scorer, f1_score # 假设正类是'Iris-virginica' scorer = make_scorer(f1_score, pos_label='Iris-virginica') cv_results = cross_val_score(estimator, self.X_train, self.y_train, cv=kfold, scoring=scorer)
方式2:将目标列转为数值型
用LabelEncoder把类别型标签转成0、1、2这类数值,这样默认的pos_label=1就有效了:
from sklearn.preprocessing import LabelEncoder le = LabelEncoder() y_train_encoded = le.fit_transform(self.y_train) cv_results = cross_val_score(estimator, self.X_train, y_train_encoded, cv=kfold, scoring='f1')
情况2:多分类任务
如果是多分类任务,需要使用多分类版本的评分指标,sklearn支持直接通过带后缀的字符串指定:
- 宏平均(对每个类的指标取平均,不考虑类别不平衡):
f1_macro、precision_macro、recall_macro - 微平均(对所有样本的TP、FP、FN统一计算,适合类别平衡场景):
f1_micro、precision_micro、recall_micro - 加权平均(按类别样本量加权平均,适合类别不平衡场景):
f1_weighted、precision_weighted、recall_weighted
示例代码:
# 宏平均F1 cv_results = cross_val_score(estimator, self.X_train, self.y_train, cv=kfold, scoring='f1_macro') # 加权平均Recall cv_results = cross_val_score(estimator, self.X_train, self.y_train, cv=kfold, scoring='recall_weighted')
内容的提问来源于stack exchange,提问作者Zag Gol
相关产品推荐
相关产品推荐

