scikit-learn报”ValueError: Target is multiclass but average=’binary’. Please choose another average setting, one of [None, ‘micro’, ‘macro’, ‘weighted’]. “的原因以及解决办法

  • Post category:Python

scikit-learn中的某些模型有默认参数需要选择不同的average数值,而不选择会出现”ValueError: Target is multiclass but average=’binary'”错误。说明样本属于多分类情况,但是选择了二分类指标。例如,二分类算法需要选择f1_score、precision、recall、roc_auc等。而在多分类任务中,需要选择评估指标。

解决办法:

1.选择合适的评价标准:将average改成’weighted’,’micro’,’macro’或者None。

  • 如果目标值是二分类的,可以使用’binary’。如果目标值是多分类的,可以使用’weighted’、’micro’、’macro’或者’None’。
  • ‘weighted’:对不同的类分别计算分值,并在分值的权重下求和。权重由每个类的出现频率确定。因此,如果某个类比其他类更常出现,那么该类所对应的样本的分值在计算总分时将具有更大的权重。
  • ‘micro’:先计算出总体的TP、FN和FP之和,再计算precision、recall和f1_score。它的结果相当于每个实例的预测结果都被视为一个“微小的分类器”,这个分类器完成了所有正确分类和错误分类的工作并把结果合并起来。
  • ‘macro’:分别计算每个类的precision、recall和f1_score然后再取平均值。它不考虑样本的不平衡性。
  • ‘None’:返回每个类的分值。在多标签分类等情况下使用。

2.修改模型的默认参数:可以考虑在使用sklearn中的模型时,修改clf的参数.例如:

clf = RandomForestClassifier(n_estimators=100, class_weight='balanced_subsample')

将模型的base_estimator参数设置为具有正确avg数量的分类器:

clf = MultiOutputClassifier(SVC(), n_jobs=-1)

3.重新检查数据以确定它实际上是否是二分类数据集。当数据集的target array是多分类时,模型要求我们选择合适的average参数,避免 “ValueError: Target is multiclass but average=’binary'”的错误。

以上是该错误的原因分析及解决办法。