在词级上测量分类器准确性

时间:2019-09-11 15:24:30

标签: python scikit-learn

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

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模型)能够预测()一个列表列表以保留文本结构(句子,单词),但是我希望记分员在单词级别上进行评估。

我该如何优雅地解决它?

1 个答案:

答案 0 :(得分: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)