[TIL] 22.12.12

문종현·2022년 12월 12일
0

TIL

목록 보기
57/119
post-custom-banner

👉 오늘 한 일

  • CNN 이어서(1004)
  • RNN 이론

CNN

🤔이미지 데이터를 읽어오면 다차원 형태의 구조로 되어있는데 np.array 형태로 되어있음에도 왜 다시 np.array 로 만들어주었을까?

  • 리스트 안에는 np.array 로 되어있더라도 여러 장의 이미지를 하나로 만들 때 파이썬 리스트에 작성해 주었음. 그래서 이미지 여러 장을 하나의 변수에 넣어주었을 때 해당 변수의 데이터 타입은 파이썬 리스트 구조임
  • train_test_split에 사용하기 위해, 계산의 편의를 위해 np.array 형태로 변경함

🤔accuracy와 val_accuracy 혹은 loss와 val_loss가 대략 어느정도 차이나면 오버피팅이라고 할 수 있을까?

  • 더 이상 val_loss 값이 감소하지 않는데(나아지지 않는데), loss 값은 줄어든다면(나아진다면) 오버피팅 되었다고 판단할 수 있으며, 딱 수치가 얼마가 차이가 나면 오버피팅이다 이렇게 공식으로 얘기는 잘 하지 않는 편
  • 시각화를 해보는게 좀 더 직관적으로 볼 수 있음

🤔모델을 초기화해서 다시 학습하는 방법?

  • 모델 컴파일을 다시 하면 됨

🤔early_stop 중 가장 좋은 성능으로 되돌리는 방법?

  • restore_best_weights=True 지정

🤔실습 과정에서 왜 완전밀집연결층을 첫 레이어 부터 사용하지 않고 합성곱 연산을 했을까?

  • FC Layer는 flatten이 필요하기 때문에 지나치게 계산이 복잡해지고, 공간정보가 많이 손실됨(주변 이미지를 학습하지 못함)

  • 합성곱, 풀링 연산으로 특징을 학습하고 출력층에서 flatten해서 완전연결밀집층에 주입해 주고 결과를 출력함

  • 합성곱을 하면 3D => 2D 로 변경됨

  • 합성곱은 1D, 2D, 3D 등의 기능을 제공함

  • 텍스트 데이터는 1D로 넣어주고 주변 문맥을 학습하게 함

📌Summary

CNN
1) MNIST, FMNIST, cifar10, 말라리아 혈액도말 이미지, 날씨이미지 를 통해 이미지 분류 실습을 진행함.
2) CNN Explainer 를 통해 Conv, Pooling 과정을 이미지로 이해함.
3) 기존에 사용했던 DNN 에서 배웠던 개념을 확장해서 합성곱 이후 완전연결밀집층을 구성하는 형태로 진행해봄
4) 이미지 전처리 도구는 matplotlib.pyplot 의 imread 를 통해 array 로 읽어올 수도 있고, PIL, OpenCV를 사용할 수도 있음.
5) 이미지 증강 기법 등을 통해 이미지를 변환해서 사용할 수도 있음.

RNN

💡머신러닝을 활용한 자연어 분류 과정

  1. 데이터 로드
  2. 텍스트 전처리
  3. 텍스트 데이터 벡터화(BOW, TF-IDF)
  4. 데이터 나누기(train_test_split)
  5. 학습 세트, 예측 세트로 모델 학습, 예측
  6. 모델 평가

정규표현식 => 문자, 숫자를 제외한 특수문자를 제외할 때 주로 사용. 특정 패턴으로 텍스트 전처리 시에도 사용함. 정규표현식은 그 자체로 프로그래밍 언어임

BagOfWords,TF-IDF => 단어를 숫자로 인코딩 하는 방법
토큰화 => 특정 문자(e.g. 띄어쓰기, 공백)으로 텍스트 데이터를 나눠주는 것

NLTK, Spacy 도 대표적인 텍스트 전처리 도구이며, 토큰화, steming, lematization, 불용어 등의 기능을 제공함. 하지만 한글을 지원하지 않음

🤔했다. 했어요. 했습니다. 했나요? 하다. => 하다로 통일해서 변형해 주면 어떤 효과가 있을까?

  • 비슷한 의미의 단어를 하나로 전처리해서 나중에 벡터화(인코딩을) 했을 때 데이터의 용량을 줄이고 모델에게 힌트도 줄 수 있음

💡Bag Of Words(BOW)

  • 가장 간단하지만 효과적이라 널리쓰이는 방법

  • 장, 문단, 문장, 서식과 같은 입력 텍스트의 구조를 제외하고 각 단어가 이 말뭉치에 얼마나 많이 나타나는지만 헤아림.

  • 구조와 상관없이 단어의 출현횟수만 세기 때문에 텍스트를 담는 가방(bag)으로 생각할 수 있음.

  • BOW는 단어의 순서가 완전히 무시 된다는 단점이 있음.

    • 예를 들어 의미가 완전히 반대인 두 문장이 있음
    • it's bad, not good at all.
    • good, not bad at all.
    • 문장은 의미가 전혀 반대지만 완전히 동일하게 반환됨.
    • 이를 보완하기 위해 n-gram을 사용하는 데 BOW는 하나의 토큰을 사용하지만 n-gram은 n개의 토큰을 사용할 수 있도록 함.
    • min_df는 문서에 특정 단어가 최소 몇 번 이상 문서에 등장하는 단어를 가방에 담겠다는 의미.

💡CountVectorizer

  • sklearn.feature_extraction.text.CountVectorizer
  • 텍스트 문서 모음을 토큰 수의 행렬로 변환.

  • 단어들의 카운트(출현 빈도)로 여러 문서들을 벡터화

  • 문서목록에서 각 문서의 feature(문장의 특징) 노출수를 가중치로 설정한 BOW 벡터를 생성함

  • 카운트 행렬, 단어 문서 행렬 (Term-Document Matrix, TDM)

  • max_df, min_df 인수를 사용하여 문서에서 토큰이 나타난 횟수를 기준으로 단어장을 구성할 수도 있음

  • 토큰의 빈도가 max_df로 지정한 값을 초과 하거나 min_df로 지정한 값보다 작은 경우에는 무시하며 인자 값은 정수인 경우 횟수, 부동소수점인 경우 비율을 의미

💡CountVectorizer 사용 시 fit, transform, fit_transfrom의 차이점

  • fit(): 원시 문서에 있는 모든 토큰의 어휘 사전을 배움
  • transform(): 문서를 문서 용어 매트릭스로 변환함. transform 이후엔 매트릭스로 변환되어 숫자형태로 변경됨
  • fit_transform(): 어휘 사전을 배우고 문서 용어 매트릭스를 반환함. fit 다음에 변환이 오는 것과 동일하지만 더 효율적으로 구현됨

💡N-grams

🤔N-grams 은 왜 사용할까?

  • BOW 의 앞뒤 맥락을 고려하지 않는다는 단점을 해결하기 위해. 즉, 앞뒤 맥락을 고려하기 위해
  • 토큰을 몇 개 사용할 것인지를 구분함. 지정한 n개의 숫자 만큼의 토큰을 묶어서 사용함.
    • e.g. (1, 1) 이라면 1개의 토큰을, (2, 3)이라면 2~3개의 토큰을 사용.
  • analyzer 설정에 따라 단어단위, 캐릭터 단위에 따라 사용할 수 있음.

인자 값

  • 기본값 = (1, 1)
  • ngram_range(min_n, max_n)
  • min_n <= n <= max_n

💡min_df, max_df, max_features

💡min_df, max_df

  • 기본값=1

  • int값은 빈도수, float값은 비율을 의미

  • min_df는 문서 빈도(문서의 %에 있음)가 지정된 임계값보다 엄격하게 낮은 용어를 무시함

  • max_df는 어휘를 작성할 때 주어진 임계값보다 문서 빈도가 엄격히 높은 용어는 무시

    • e.g. min_df를 0.1, 0.2로 설정한다면 10%, 20%보다 많이 나타나는 용어만 학습
    • e.g. 코로나 관련 기사를 분석하면 90%에 '코로나'라는 용어가 등장할 수 있는데, 이 경우 max_df=0.89 로 비율을 설정하여 너무 빈번하게 등장하는 단어를 제외할 수 있음

💡max_features

  • 기본값 = None
  • 벡터라이저가 학습할 기능(어휘)의 양 제한
  • corpus중 빈도수가 가장 높은 순으로 해당 갯수만큼만 추출

🤔너무 희귀한 단어를 제외하는 효과가 있는 것?

  • min_df

🤔너무 많이 등장하는 불용어를 제외하는 효과가 있는 것?

  • max_df

🤔BOW를 사용하다보면 앞뒤 맥락을 고려하지 않는 단점이 있음. 이것을 해결하기 위한 것?

  • ngram_range

🤔단어를 너무 많이 사용해서 dtm 가 너무 커지는 것을 방지하기 위해 최대 단어를 제한하는 것?

  • max_features

💡stop_words

  • stop_words : 불용어
  • 문장에 자주 등장하지만 "우리, 그, 그리고, 그래서" 등 관사, 전치사, 조사, 접속사 등의 단어로 문장 내에서 큰 의미를 갖지 않는 단어
  • 영어나 다른 외국어는 불용어 사전을 NLTK, Spacy 등에서 제공함. 하지만 한국어는 불용어 사전이 따로 없음.
    • 이유는 정해져 있지 않지만, 조사나 접속사 같은 경우는 전처리로 해결할 수 있기도 하고, 아직 연구가 많이 진행되지 않아서일 수도 있음
    • 모듈을 쓰지 않고 직접 지정해서 제거할 수도 있음

💡analyzer

  • 기본값='word'
  • 종류: word, char, char_wb
  • 기능을 단어 n-그램으로 만들지 문자 n-그램으로 만들어야 하는지 여부. 옵션 'char_wb'는 단어 경계 내부의 텍스트에서만 문자 n-gram을 생성함. 단어 가장자리의 n-gram은 공백으로 채워짐.
  • 띄어쓰기가 제대로 되어 있지 않은 문자 등에 사용할 수 있음.
  • char 옵션은 단어 밖에서도 n_gram을 사용하도록 함

📌오늘의 회고

  • 사실(Fact) : CNN 모델을 이용해 날씨 이미지를 예측하고, 예측한 이미지를 test 값과 비교해보았다. BOW, TF-IDF도 학습했다.
  • 느낌(Feeling) : 이미지 데이터를 처리하는 것 보다는 텍스트 데이터를 전처리하는게 과정이 직관적인 것 같다.
  • 교훈(Finding) : 열심히 복습해서 프로젝트에 적용해보자.
profile
자라나라 새싹새싹🌱
post-custom-banner

0개의 댓글