디지털 마케팅 LAB

BDA X 이지퍼블리싱 스터디 (3주차) 본문

BDA 딥러닝 easystudy

BDA X 이지퍼블리싱 스터디 (3주차)

홍보하swu 2023. 5. 29. 18:03

1. 날씨 시계열 예측

막스 플랑크 생물 지구화학 연구소에서 기록한 날씨 시계열 데이터셋을 사용해서 시계열 데이터를 분석해보고 미래의 날씨를 예측한다.

데이터

온도, 대기압, 습도 등 14가지 feature로 이루어져있다.

10분 간격으로 되어있던 데이터를 step 6으로 슬라이싱하여 1시간 간격으로 바꿔준다.

검사 및 정리

풍속의 min이 -9999로 나온 것을 오류로 생각하여 0으로 교체

특성 엔지니어링

  • 풍향과 속도 열을 바람 벡터로 변환한다.
  • 사인 및 코사인 변환을 사용하여 시간 및 시간 신호를 지워 사용가능한 신호를 얻는다.
  • 고속 푸리에 변환을 사용하여 특성을 추출하여 중요한 빈도를 결정한다.

데이터 분할 및 정규화

훈련, 검증 및 테스트 데이터 세트를 (70%, 20%, 10%)로 분할한다.

신경망을 훈련하기 전에 특성의 크기를 정하는 것이 중요하다. 정규화는 평균을 빼고 각 특성의 표준 편차로 나누어 크기 조정을 수행하는 일반적인 방법이다.

데이터 창 작업

작업 및 모델 유형에 따라 다양한 데이터 창을 생성할 수 있다. 예를 들어, 

24시간의 기록이 주어졌을 때 앞으로 24시간의 미래를 단일 예측하기 위해 다음과 같은 창을 정의할 수 있다.
6시간의 기록이 주어졌을 때 앞으로 1시간의 미래를 예측하는 모델에는 다음과 같은 창이 필요할 수다.

나머지 부분에서는 WindowGenerator 클래스를 정의한다. 이 클래스는 다음을 수행할 수 있다.

  1. 위의 다이어그램과 같이 인덱스와 오프셋을 처리한다.
  2. 특성 창을 (features, labels) 쌍으로 분할한다.
  3. 결과 창의 내용을 플롯한다.
  4. tf.data.Dataset를 사용하여 훈련, 평가 및 테스트 데이터로부터 이러한 창을 여러 배치로 효율적으로 생성한다.

단일 스텝 모델

이러한 종류의 데이터를 기반으로 빌드할 수 있는 가장 간단한 모델은 현재 조건만을 기초로 1 타임스텝(1시간) 후의 단일 특성 값을 예측하는 모델이다.

따라서 1시간 미래의 T (degC) 값을 예측하는 모델을 빌드하는 것으로 시작한다.

 

 

 

 

 

 

 

 

 

 

 

다음과 같은 단일 스텝 (input, label) 쌍을 생성하도록 WindowGenerator 객체를 구성한다.

예측 비교

컨볼루션 신경망의 예측 결과
순환 신경망의 예측 결과

성능 비교

대체적으로 이전 모델보다 성능이 좋아지는 것을 확인할 수 있다.

 

 

2. 순환 신경망을 활용한 셰익스피어의 문자열 생성

셰익스피어 데이터셋을 이용해서 셰익스피어풍의 작품을 생성하는 순환신경망을 만들어본다. 생성된 문장은 의미를 해석하기는 어렵지만 언뜻 보기에는 자연스러운 문장으로 보일 것이다.

  • 문자 기반 순환 신경망
  • 데이터 셋에서 문자 시퀀스 ("Shakespear")가 주어지면, 시퀀스의 다음 문자("e")를 예측하는 모델을 훈련
  • 모델은 작은 텍스트 배치(각 100자)로 훈련되었으며, 모델을 반복하여 호출하면 더 긴 텍스트 시퀀스 생성이 가능

데이터

케라스에서 데이터 파일을 불러와 파이썬과 호환되도록 디코딩 후에 사용한다.

텍스트 길이는 1115394자이고, 고유 문자수는 '\n', ' ', '!', '$', '&', "'", ',', '-', '.', '3', ':', ';', '?' 부터 대문자 알파벳과 소문자 알파벳까지 총 65개이다.

텍스트 전처리

1) 텍스트 벡터화

  • 문자들을 수치화
  • 두 개의 조회 테이블(lookup table)을 만들어 하나는 문자를 숫자에 매핑하고 다른 하나는 숫자를 문자에 매핑

이처럼 고유 문자에서 숫자 인덱스로 매핑을 생성한다.

2) 훈련 샘플과 target 만들기

  • 모델의 입력은 문자열 시퀀스가 될 것이고, 모델을 훈련시켜 출력을 예측
  • 출력 = 현재 타임 스텝(time step)의 다음 문자
  • 각 입력 시퀀스에서, 해당 타깃은 한 문자를 오른쪽으로 이동한 것을 제외하고는 동일한 길이의 텍스트를 포함 -> 텍스트를 시퀀스 길이 + 1개의 청크(chunk)로 나눈다

ex) seq_length=4, 텍스트="Hello" -> 입력 시퀀스는 "Hell"이고 타깃 시퀀스는 "ello" -> 텍스트를 시퀀스 길이 + 1개의 청크(chunk)로 나눈다

3) 훈련 배치 생성

모델 설계

  • tf.keras.layers.Embedding : 입력층, embedding_dim 차원 벡터에 각 문자의 정수 코드를 매핑하는 훈련 가능한 검색 테이블
  • f.keras.layers.GRU : 크기가 units = rnn_units인 RNN의 유형
  • tf.keras.layers.Dense : 크기가 vocab_size인 출력을 생성하는 출력층

각 문자에 대해 모델은 임베딩을 검색하고, 임베딩을 입력으로 하여 LSTM을 1개의 타임 스텝으로 실행하고, 완전연결층을 적용하여 다음 문자의 로그 가능도(log-likelihood)를 예측하는 로짓을 생성

텍스트 생성

훈련 epoch가 적어 논리적인 문장을 형성하는 것은 아직 훈련되지 않은 상태