Python ValueError:分类指标可以';t处理多类和多标签指示器目标的混合

Python ValueError:分类指标可以';t处理多类和多标签指示器目标的混合,python,machine-learning,lstm,data-science,text-classification,Python,Machine Learning,Lstm,Data Science,Text Classification,我有2000个不同标签的多类标签文本分类问题。使用带有手套嵌入的LSTM进行分类 目标变量的标签编码器 带嵌入层的LSTM层 误差度量为F2分数 标签编码的目标变量: LSTM网络如下图所示,带有手套嵌入 我的误差指标是F1分数。我为误差度量构建了下面的函数 class Metrics(Callback): def on_train_begin(self, logs={}): self.val_f1s = [] self.val_recalls = []

我有2000个不同标签的多类标签文本分类问题。使用带有手套嵌入的LSTM进行分类

  • 目标变量的标签编码器
  • 带嵌入层的LSTM层
  • 误差度量为F2分数
  • 标签编码的目标变量: LSTM网络如下图所示,带有手套嵌入 我的误差指标是F1分数。我为误差度量构建了下面的函数
    class Metrics(Callback):
        def on_train_begin(self, logs={}):
            self.val_f1s = []
            self.val_recalls = []
            self.val_precisions = []
    
        def on_epoch_end(self, epoch, logs={}):
            val_predict = (np.asarray(self.model.predict(self.validation_data[0]))).round()
            val_targ = self.validation_data[1]
            _val_f1 = f1_score(val_targ, val_predict)
            _val_recall = recall_score(val_targ, val_predict)
            _val_precision = precision_score(val_targ, val_predict)
            self.val_f1s.append(_val_f1)
            self.val_recalls.append(_val_recall)
            self.val_precisions.append(_val_precision)
            print("— val_f1: %f — val_precision: %f — val_recall %f" % (_val_f1, _val_precision, _val_recall))
            return
    
    metrics = Metrics()
    
    模型拟合是 第一个历元后出现以下错误:

    ValueError: Classification metrics can't handle a mix of multiclass and continuous-multioutput targets
    
    你能告诉我我的密码哪里出错了吗


    我试图解决我自己,但我没有得到任何线索。你能在这方面帮助我吗?F1分数、召回率和精度是二进制分类的指标,用于多类/多标签问题。你需要在函数中添加一个参数
    F1\u分数
    recall\u分数
    precision\u分数

    试试这个:

    _val_f1 = f1_score(val_targ, val_predict, average='weighted')
    _val_recall = recall_score(val_targ, val_predict, average='weighted')
    _val_precision = precision_score(val_targ, val_predict, average='weighted')
    
    在此处查找平均参数的更多信息:

    F1分数、召回率和精度是二进制分类的指标,用于解决多类/多标签问题。您需要在函数
    F1\u分数
    召回率分数
    精度分数
    中添加一个参数

    试试这个:

    _val_f1 = f1_score(val_targ, val_predict, average='weighted')
    _val_recall = recall_score(val_targ, val_predict, average='weighted')
    _val_precision = precision_score(val_targ, val_predict, average='weighted')
    
    在此处查找平均参数的更多信息:

    您的问题是由这行代码中val_predict中的连续值引起的

    _val_f1 = f1_score(val_targ, val_predict)
    
    在计算f1_分数之前,您应该在val_predict中对您的预测进行四舍五入

    示例解决方案:

     _val_f1 = f1_score(val_targ,np.round(val_predict))
    
    需要说明的是:如果要更改舍入函数的阈值(默认值为0.5),可以在[0,1]间隔内添加或减去值:

    >>> a = np.arange(0,1,0.1)
    >>> print(a, abs(np.round(a-0.1)), sep='\n')
    >>> print(a, abs(np.round(a+0.3)), sep='\n')
    
    [0.  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]
    array([0.  0.  0.  0.  0.  0.  1.  1.  1.  1.])
    
    [0.  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]
    array([0., 0., 0., 1., 1., 1., 1., 1., 1., 1.])
    

    希望有帮助

    您的问题是由这行代码中val_predict中存在的连续值引起的

    _val_f1 = f1_score(val_targ, val_predict)
    
    在计算f1_分数之前,您应该在val_predict中对您的预测进行四舍五入

    示例解决方案:

     _val_f1 = f1_score(val_targ,np.round(val_predict))
    
    需要说明的是:如果要更改舍入函数的阈值(默认值为0.5),可以在[0,1]间隔内添加或减去值:

    >>> a = np.arange(0,1,0.1)
    >>> print(a, abs(np.round(a-0.1)), sep='\n')
    >>> print(a, abs(np.round(a+0.3)), sep='\n')
    
    [0.  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]
    array([0.  0.  0.  0.  0.  0.  1.  1.  1.  1.])
    
    [0.  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]
    array([0., 0., 0., 1., 1., 1., 1., 1., 1., 1.])
    

    希望有帮助

    这不走运,这不走运。