개발자의 스터디 노트
옐프 리뷰 데이터셋으로 학습한 데이터 평가, 추론, 분석 하기 본문
앞서 포스팅으로 학습까지 되었습니다.
학습하기 전에 우리는 학습 모델을 평가하기 위하여 테스트 데이터를 만들어 두었습니다. 이번에는 테스트 데이터로 모델을 평가해 보도록 하겠습니다.
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
'파이썬 > 파이토치 자연어처리' 카테고리의 다른 글
MLP로 성씨 분류하기 (1) : 학습 준비하기 (0) | 2022.02.18 |
---|---|
다층 퍼셉트론 (0) | 2022.02.17 |
옐프 리뷰 데이터셋으로 학습 하기 (0) | 2022.02.15 |
옐프 리뷰 데이터셋으로 학습 준비하기 (0) | 2022.02.14 |
부가적인 훈련 개념 (0) | 2022.02.12 |