[핸즈온 머신러닝 2판] 13장 정리

juyeon·2022년 10월 9일
0

핸즈온 머신러닝 2판

목록 보기
11/14
post-custom-banner
  • 출처
  • 되도록이면 책의 내용과 코드를 그대로 옮기기 보다는 요약과 보충설명!

읽기전에

개념 정리

13장. 텐서플로에서 데이터 적재와 전처리하기

  • 대규모 데이터셋 -> 텐서플로 데이터 API
  1. 데이터 로드
    1) 텍스트 파일(csv 파일 등), 고정 길이의 레코드를 가진 이진 파일, 텐서플로의 TFRecord 포맷을 사용하는 이진 파일
    2) SQL 데이터 베이스, 구글 빅쿼리

  2. 데이터 전처리
    1) 정규화
    2) 인코딩: 원-핫 인코딩, BoW 인코딩, 임베딩 등
    -> 사용자 정의 전처리 층, 표준 전처리 층 사용

데이터 API

tf.data.Dataset.from_tensor_slices(): 텐서를 받아서 데이터셋 생성

연쇄 변환

  • repeat(): 몇 번 반복?
  • batch(): 배치 사이즈 결정
    • drop_remainder=True: 마지막 배치가 길이가 모자랄 경우, 버린다.
  • map(): 데이터셋의 각 아이템에 함수 적용
    • num_parallel_calls: 여러 스레드로 나누어서 속도를 높인다.
  • apply(): 데이터셋 전체에 함수 적용
  • filter(): 데이터셋 필터링
  • take(): 몇개만 가져옴

데이터 셔플링

  • shuffle(buffer_size=n, seed=m): 샘플을 섞음
    • buffer_size 개수 만큼 추출해서 버퍼에 채우고 -> 랜덤하게 하나씩 꺼내서 반환하고 -> 다시 원본 데이터셋에서 새로운 아이템 추출해서 버퍼 채우고 -> 반복.
    • 버퍼 크기는 크게, 그렇지만 보유한 메모리 크기 안에서 지정.

메모리 용량보다 큰 대규모 데이터셋의 셔플 방법

  • 원본 데이터 자체를 섞음
  • 원본 데이터를 여러 파이롤 나눈 다음에 훈련하는 동안 무작위로 읽음
    • 그 안에서 shuffle() 사용
  • 방법: 여러 파일에서 한 줄씩 번갈아 읽기
    list_files(): 파일 경로를 섞은 데이터셋을 반환
    interleave(): 한번에 정해진 개수만큼의 파일을 한 줄씩 번갈아 읽음

데이터 전처리

-> 코드 살펴보기

데이터 적재와 전처리를 합치기

  • 효율적이고 재사용 가능한 코드를 만드는게 포인트
    -> 코드 살펴보기
  • prefetch(1): 한 배치로 훈련이 이루어질 때 다음 배치가 미리 준비됨

tf.keras와 데이터셋 사용하기

  • csv_reader_dataset(): 훈련 세트 만들기. (반복 지정 X)
  • fit(), predict()

TFRecord 포맷

  • 대용량 데이터셋으로 선호되는 포맷
  • 크기가 다른 연속된 이진 레코드를 저장하는 단순한 이진 포맷
    : 레코드 길이, 길이의 올바름을 체크하는 CRC 체크섬, 실제 데이터, 데이터를 위한 CRC 체크섬
  • tf.io.TFRecordWriter, tf.data.TFRecordDtataset

압축된 TFRecord

  • options 매개변수

프로토콜 버퍼 개요

  • 일반적으로 TFRecord는 직렬화된 프로토콜 버퍼(또는 protobuf)를 담음
    : 이식성과 확장성이 좋고 효율적인 이진 포맷
  • 텐서플로 연산이 아닌 직렬화, 파싱
    SerializeToString(): 직렬화
    ParseFromString(): 파싱

텐서플로 프로토콜 버퍼

SerializeToString(): 직렬화
tf.io.parse_single_example(): 하나씩 파싱
tf.io.parse_example(): 배치 단위로 파싱

SequneceExample 프로토콜 버퍼를 이용해 리스트의 리스트 다루기

  • 예: 텍스트 문서

입력 특성 전처리

  • 일일히 Lambda layer로 표준화 하거나,
  • 표준화 class 만들거나.

원-핫 벡터를 사용해 범주형 특성 인코딩하기

  • 어휘 사전을 지정하고, oov(out-of-vocabulary)을 지정하여 룩업 테이블 만듦: tf.lookup.StaticVocabularyTable()
  • tf.one_hot(): 원-핫 인코딩

Q. oov은?

  • 범주 개수가 많고, 데이터셋이 크거나 범주가 자주 바뀔 때 사용
  • 이 경우, 알려지지 않은 범주 개수보다 적은 버킷을 사용하면 충돌이 발생(다른 범주인데 같은 버킷에 할당된다던가..)

임베딩을 사용해 범주형 특성 인코딩하기

  • 범주 개수가 10개 이하면 원-핫 인코딩도 좋은데, 범주 개수가 50개 이상이면 임베딩이 선호됨.
  • 임베딩: 범주를 표현하는 훈련 가능한 밀집 벡터
  • 초기 랜덤값 지정, 점차 학습됨
  • 단어 임베딩
    : 단어 사이의 근접 정도와 대조/비교/연관된 의미 끼리의 연산 비스무리한것도 가능! 그러나 편향성이 존재.
  • 임베딩 행렬: keras.layers.Embedding()
  • tf.nn.embedding_lookup(): 임베딩 행렬에서 주어진 인덱스에 해당하는 행을 찾음
  • keras.layers.TextVectorization(): 입력에 있는 각 단어를 어휘 사전에 있는 인덱서를 인코딩

케라스 전처리 층

  • keras.layers.Normalization(), keras.layers.TextVectorization()
  • keras.layers.Discretization(): 연속적인 데이터를 구간으로 나누거, 각 구간을 원-핫 벡터로 인코딩
  • PreprpcessingStge: 여러 전처리 층 연결

BOW(bag of word)

: 단어 카운트로 표시.

TF-IDF

  • 자주 등장하는 단어는 중요하지 않을 확률이, 자주 등장하지 않는 단어는 중요할 확률이 높음.
  • TF IDF
    = 단어 카운트
    (로그(전체 샘플 수 / 단어가 등장하는 훈련 샘플 개수 ))

TF 변환

  • 훈련 속도를 높이고, 배포 시 유지 보수의 편의성을 위해서 전처리 연산을 딱 한 번만 정의해보자. -> TFX 컴포넌트 사용

텐서플로 데이터셋(TFDS) 프로젝트

  • mnist 등 다양한 데이터셋을 다운로드 할 수 있음: tensorflow_datasets 라이브러리

궁금증

  1. tf.lookup.StaticVocabularyTable()에서 oov 버킷을 지정하는것과 같은 기능을 하는 sklearn 함수는 없을까? 나는.. 일일히 범위 지정했는데ㅠ 그냥 onehotencoder는 무시 기능 밖에 없던데..
  • 그럼 test에서 먼저 fit 해야하나?!
profile
내 인생의 주연
post-custom-banner

0개의 댓글