관리 메뉴

개발자의 스터디 노트

옐프 리뷰 데이터셋으로 학습한 데이터 평가, 추론, 분석 하기 본문

파이썬/파이토치 자연어처리

옐프 리뷰 데이터셋으로 학습한 데이터 평가, 추론, 분석 하기

박개발씨 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