【问题标题】:Measuring classifier accuracy on word-level在单词级别测量分类器的准确性
【发布时间】:2020-01-13 11:35:47
【问题描述】:

我有一个与单词句子相对应的列表列表。

X = [
        ['John','has','house'],
        ['Mary','works','at','home']
    ]

您可以将每个句子视为一个训练样本。我的模型 tagger 用一些标签标记每个单词:

y = [
        ['proper','verb','noun'],
        ['proper','verb','prep','noun']
    ]

我想根据单词级别的标记准确性对我的标记器进行网格搜索:

search = GridSearchCV(tagger, parameters, cv=10, scoring='accuracy')
search.fit(X, y)

但是,accuracy_score() 方法抱怨

{ValueError}您似乎正在使用旧的多标签数据表示。不再支持序列序列;改用二进制数组或稀疏矩阵 - MultiLabelBinarizer 转换器可以转换为这种格式。

这不会发生,当列表列表 y 被展平时,例如:

> y_pred = ['proper','verb','noun', 'proper','verb','prep','noun']
> y_true = ['proper','verb','noun', 'proper','verb','prep','noun']
> accuracy_score(y_pred, y_true)
1.0

我仍然希望我的标记器(Keras 模型)预测()一个列表列表以保留文本结构(句子、单词),但我希望记分器在单词级别进行评估。

我怎样才能优雅地解决它?

【问题讨论】:

    标签: python scikit-learn


    【解决方案1】:

    我发现的一个可能的解决方案是构建自定义评分函数:

    from sklearn.metrics import make_scorer, accuracy_score
    
    
    def flatten(l):
        return [item for sublist in l for item in sublist ]
    
    def word_accuracy_score(y, y_pred):
        y = flatten(y)
        y_pred = flatten(y_pred)
        return accuracy_score(y, y_pred)
    

    并将其传递给GridSearchCV:

    scorer = make_scorer(word_accuracy_score)
    search = GridSearchCV(tagger, parameters, cv=10, scoring=scorer)
    

    【讨论】:

      猜你喜欢
      • 2013-03-27
      • 2014-11-24
      • 2021-07-25
      • 1970-01-01
      • 2021-08-11
      • 2020-08-06
      • 2021-06-01
      • 2016-06-16
      • 2018-04-11
      相关资源
      最近更新 更多