파이썬/파이토치 자연어처리
옐프 리뷰 데이터셋으로 학습한 데이터 평가, 추론, 분석 하기
박개발씨
2022. 2. 16. 00:04
앞서 포스팅으로 학습까지 되었습니다.
학습하기 전에 우리는 학습 모델을 평가하기 위하여 테스트 데이터를 만들어 두었습니다. 이번에는 테스트 데이터로 모델을 평가해 보도록 하겠습니다.
1. 테스트 데이터로 평가하기
# 데이터로 평가하기
# 테스트 세트 평가
dataset.set_split('test')
batch_generator = generate_batches(dataset, batch_size=args.batch_size, device=args.device)
running_loss = 0.
running_acc = 0.
classifier.eval()
for batch_index, batch_dict in enumerate(batch_generator):
#출력을 계산합니다.
y_pred = classifier(x_in=batch_dict['x_data'].float())
#손실을 계산합니다.
loss = loss_func(y_pred, batch_dict['y_target'].float())
loss_batch = loss.item()
running_loss += (loss_batch - running_loss) / (batch_index + 1)
#정확도를 계산합니다.
acc_batch = compute_accuracy(y_pred, batch_dict['y_target'])
running_acc += (acc_batch - running_acc) / (batch_index + 1)
train_state['test_loss'] = running_loss
train_state['test_acc'] = running_acc
print("Test loss: {:.3f}".format(train_state['test_loss']))
print("Test Accuracy: {:.2f}".format(train_state['test_acc']))
Test loss: 0.329
Test Accuracy: 89.93
텟트 결과가 손실률은 0.329에 정확도는 89.93 정도 나왔습니다. 단층 구조의 퍼셉트론으로 머신러닝 하였으나 꽤 높은 정확도가 나왔습니다.
2. 새로운 데이터 포인트 추론하여 분류하기
- 학습을 했으면 학습 모델을 활용해야 합니다. 새로운 데이터를 추론해보도록 하겠습니다.
### 새로운 데이터 포인트 추론하여 분류하기
# 샘플 리뷰에 대한 예측 출력하기
def predict_rating(review, classifier, vectorizer, decision_threshold=0.5):
"""
리뷰 점수 예측하기
매개변수:
review(str) : 리뷰 텍스트
classifier (ReviewClassifier) : 훈련된 모델
vectorizer (ReviewVectorizer) : Vectorizer 객체
decision_threshold (float) : 클래스를 나눌 결정 경계
"""
review = preprocess_text(review)
voctorized_review = torch.tensor(vectorizer.vectorize(review)).to("cuda")
result = classifier(voctorized_review.view(1,-1))
probability_value = torch.sigmoid(result).item()
index = 1
if probability_value < decision_threshold:
index = 0
return vectorizer.rating_vocab.lookup_index(index)
test_review = "this is a pretty awesome book"
prediction = predict_rating(test_review, classifier, vectorizer)
print("{} -> {}".format(test_review, prediction))
this is a pretty awesome book -> positive
긍정적인 답변이 나왔습니다. 꽤 정확한거 같습니다.
3. 모델 가중치 분석
- 퍼셉트론의 가중치는 어휘 사전의 한 단어와 정확하게 대응하기 때문에 어휘 사전으로 가중치 분석을 해보겠습니다.
### 모델 가중치 분석
# 분류기의 가중치 분석하기
# 가중치 정렬
# gpu에 할당되어 있는 fc1_weights 텐서를 numpy()로 형변환 하면 에러가 발생
# 따라서 텐서 디바이스를 cpu로 변경 해줘야 한다.
fc1_weights = classifier.fc1.weight.detach()[0]
fc1_weights = torch.tensor(fc1_weights).to("cpu")
_, indices = torch.sort(fc1_weights, dim=0, descending=True)
indices = indices.numpy().tolist()
# 긍정적인 단어 상위 20개
print("긍정 리뷰에 영향을 미치는 단어:")
print("-------------------------------------------------")
for i in range(20):
print(vectorizer.review_vocab.lookup_index(indices[i]))
긍정 리뷰에 영향을 미치는 단어:
-------------------------------------------------
pleasantly
unassuming
rocked
painless
limo
squid
superb
luv
deliciousness
eclectic
watering
thailand
quicker
ms
komol
nbest
relaxed
nhighly
ichiza
drawback