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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 05:07:11