この LSTM チュートリアルをwikigold.conll NER データ セットで実行しています。
training_data
シーケンスとタグのタプルのリストが含まれています。例:
training_data = [
("They also have a song called \" wake up \"".split(), ["O", "O", "O", "O", "O", "O", "I-MISC", "I-MISC", "I-MISC", "I-MISC"]),
("Major General John C. Scheidt Jr.".split(), ["O", "O", "I-PER", "I-PER", "I-PER"])
]
そして、私はこの機能を書き留めました
def predict(indices):
"""Gets a list of indices of training_data, and returns a list of predicted lists of tags"""
for index in indicies:
inputs = prepare_sequence(training_data[index][0], word_to_ix)
tag_scores = model(inputs)
values, target = torch.max(tag_scores, 1)
yield target
このようにして、トレーニング データの特定のインデックスの予測ラベルを取得できます。
ただし、すべてのトレーニング データの精度スコアを評価するにはどうすればよいですか。
精度は、すべての文で正しく分類された単語の量を単語数で割ったものです。
これは私が思いついたもので、非常に遅くて醜いです:
y_pred = list(predict([s for s, t in training_data]))
y_true = [t for s, t in training_data]
c=0
s=0
for i in range(len(training_data)):
n = len(y_true[i])
#super ugly and ineffiicient
s+=(sum(sum(list(y_true[i].view(-1, n) == y_pred[i].view(-1, n).data))))
c+=n
print ('Training accuracy:{a}'.format(a=float(s)/c))
これを pytorch で効率的に行うにはどうすればよいですか?
PS: sklearn の accuracy_scoreを使用しようとして失敗しました