我有一个与单词句子相对应的列表列表。
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模型)能够预测()一个列表列表以保留文本结构(句子,单词),但是我希望记分员在单词级别上进行评估。
我该如何优雅地解决它?
答案 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)