인터넷 영화 대이터베이서(Internet Movie Database)로 부터 가져온 양극단의 리뷰 5만 개로 이루어진 IMDB 데이터셋을 사용하겠습니다. 이 데이터셋은 훈련 데이터 2만 5,000개의 테스트 데이터 2만 5,000개로 나누어 있고 각각 50%는 부정, 50%는 긍정 리뷰로 구성되어 있습니다.
왜 훈련 데이터와 테스트 데이터를 나눌까요? 같은 데이터에서 머신 러닝 모델을 훈련하고 테스트해서는 절대 안 되기 때문입니다! 모델이 훈련 데이터에서 잘 작동한다는 것이 처음 만난 데이터에서도 잘 작동한다는 것을 보장하지 않습니다. 중요한 것은 새로운 데이터에 대한 모델의 성능입니다(사실 훈련 데이터의 레이블은 이미 알고 있기 때문에 이를 예ㅊ측하는 모델은 필요하지 않습니다). 예를 들어 모델이 훈련 샘플과 타깃 사이의 매핑을 모두 외워 버릴 수 있습니다. 이런 모델은 처음 만나는 데이터에서 타깃을 예측하는 작업에는 쓸모가 없습니다. 다음 장에서 이에 대해 더 자세히 살펴봅니다.
MNIST데이터셋처럼 IMDB 데이터셋도 케라스에 포함되어 있습니다. 이 데이터는 전처리 되어있어 각 리뷰(단어 시퀀스)가 숫자 스퀀스로 변화되어 있습니다. 여기서 각 숫자는 사전에 있는 고유한 단어를 나타냅니다.
다음 코드는 데이터셋을 로드합니다(처음 실행하면 17MB 정도의 데이터를 컴퓨터에 내려받습니다).
from keras.datasets import imdb
(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)
num_words=10000 매개변수는 훈련 데이터에서 가장 자주 나타나는 단어 1만 개만 사용하겠다는 의미입니다. 드물게 나타나는 단어는 무시하겠습니다. 이렇게 하면 적절한 크기의 벡터 데이터를 얻을 수 있습니다.
변수 train_data와 test_data는 리뷰의 목적입니다. 각 리뷰는 단어 인텍스의 리스트입니다(단어 시퀀스가 인코딩된 것입니다). train_labels와 test_labels는 부정을 나타내는 0과 긍정을 나타내는 1의 리스트입니다.
>>> train_data[0]
[1, 14, 22, 16, ... 178, 32]
>>> train_labels[0]
1
가장 자주 등장하는 단어 1만 개로 제한했기 때문에 단어 인덱스는 9.9999를 넘지 않습니다.
>>> max([max(sequence) for sequence in train_data])
9999
재미 삼아 이 리뷰 데이터 하나를 원래 영어 단어로 어떻게 바꾸는지 보겠습니다.
word_index = imdb.get_word_index() ................. word_index는 단어와 정수 인텍스를 매핑한 딕셔너리입니다.
reverse_word_index = dict(
[(value, key) for (key, value) in word_index.items()]) ....... 정수 인덱스와 단어 매핑되도록 뒤집습니다.
decoded_review = ' '.join(
[reverse_word_index.get(i -3, '?') for i in train_data[0]])
댓글 없음:
댓글 쓰기