[AI스쿨 7기, 13주차] stratify=y, validation_data, 오버피팅, 성능개선, 정규 표현식, 텍스트 분석, BOW, TF-IDF, KoNLPy, N-grams, min_df, max_df, ngram_range, max_features, analyzer, char_wb, char

hyemin·2022년 12월 12일

멋쟁이사자처럼

목록 보기
45/51

221212 멋쟁이 사자처럼 AI스쿨 7기, 박조은 강사님 강의

✅ 프리뷰

이번주 진행 주제 : 텍스트 분석과 자연어처리를 할 예정.

  • CNN은 주로 이미지에 주로 사용이되고 물론 텍스트에도 사용을 한다. 하지만 이미지에서 더 나은 성능을 보여준다.
  • 텍스트 분석을 할 때 머신러닝(Bag Of Words, TF-IDF), 딥러닝(RNN) 순서로 사용할 예정입니다.
  • 텍스트 분류, 텍스트로 주식의 가격을 예측하는 회귀 모델을 만든다든지 할 때는 주로 RNN이 CNN 보다 더 나은 성능을 내는 편이다. RNN은 주로 순서가 있는 데이터에 사용한다. 예를 들어 시계열데이터, 자연어도 말의 앞뒤에 순서가 있기 때문에 시계열, 자연어 등에 사용됩니다.
  • 자연어처리 실습 이후에는 RNN 으로 시계열 데이터를 다뤄볼 예정.

✅ 1004 실습파일

❓ 이미지 데이터를 읽어오면 다차원 형태의 구조로 되어있는데 np.array 형태로 되어있음에도 왜 다시 np.array 로 만들어주었을까?
◼ 리스트 안에는 np.array 로 되어 있더라도 여러 장의 이미지를 하나로 만들 때 파이썬 리스트에 작성해 주었다. 이미지 여러 장을 하나의 변수에 넣어주었을 때, 해당 변수의 데이터 타입은 파이썬 리스트 구조이다. train_test_split 에 사용하기 위해 넘파이 형태로 변경해주었다.

❓ 정답 인코딩이 제대로 되었는지 확인하고 클래스가 train, valid 균일하게 나뉘었는지 확인했다. 정답값을 균일하게 나누기 위해 사용하는 train_test_split 의 옵션은?
◼ stratify=y

모델

validation_split 을 사용하지 않고 위에서 따로 validation_data를 나눠서 사용한 이유는
class 를 stratify 로 층화표집을 해주지 않으면 균일하게 학습이 되지 않는다.
멀티클래스일 때 데이터를 따로 균일하게 나눠서 학습시키지 않으면 성능이 낮게 나올 때가 많다.

🦁 accuracy와 val_accuracy 혹은 loss와 val_loss가 대략 어느정도 차이나면 오버피팅이라 그러나요?
◼ 시각화를 하면 직관적으로 볼 수 있다. 더이상 val_loss 값이 감소하지 않는데, loss 값은 줄어든다면 오버피팅 되었다고 판단하는게 나아보인다.
◼ val_loss 값이 나아지지 않는데 loss 값이 나아진다면 오버피팅이라고 볼 수 있다.

❓ softmax 로 출력했기 때문에 합이 1이 되는 값으로 출력이 된다. 0번째 테스트 이미지에 대한 분류 확률이다. 여기에서 클래스를 어떻게 찾을까?
◼ np.argmax
❓ np.argmax 는 어떤 기능을 할까요?
◼ 가장 큰 값을 가지는 index를 반환

성능 개선

  • Conv, Pooling Layer의 층을 더 쌓는다든지 파라미터 값을 변경
  • fit 의 설정 값도 변경해보기
  • 이미지 사이즈나 이미지 전처리를 하면 더 나은 성능을 내지만, fit 속도를 빠르게 하기 위해서 기존 사이즈로 진행

🦁 맨 마지막 에포크 결과가 아닌, 성능이 가장 좋았을때의 모델을 사용하는 방법은 없을까요?
◼ 초기화 해서 다시 학습해서 성능이 잘 나오는 곳까지 early stop 이나 epoch값을 조정

CNN Summary

  • MNIST, FMNIST, cifar10 을 통해 이미지 분류 실습을 알아보았다.
  • CNN Explainer 를 통해 Conv, Pooling 과정을 이미지로 이해해봤다.
  • ❓ 왜 완전밀집연결층을 첫 레이어부터 사용하지 않고 합성곱 연산을 했을까?
    ◼ FC Layer 는 flatten 이 필요하기 때문에 지나치게 계산이 복잡해지고, 공간정보가 많이 손실된다.
    ◼ 합성곱을 하면 3D=>2D 로 변경된다. 합성곱은 1D, 2D, 3D 등의 기능을 제공한다. 텍스트 데이터는 1D로 넣어주고 주변 문맥을 학습하게 한다.
    ◼ 완전밀집연결층은 flatten 해서 이미지를 입력해주는데 그러면 주변 이미지를 학습하지 못하는 문제가 생긴다. 합성곱, 풀링 연산으로 특징을 학습하고 출력층에서 flatten 해서 완전연결밀집층에 주입해주고 결과를 출력한다.
  • 기존에 사용했던 DNN 에서 배웠던 개념을 확장해서 합성곱 이후 완전연결밀집층을 구성하는 형태로 진행해봤다.
  • 이미지 전처리 도구는 matplotlib.pyplot 의 imread 를 통해 array 로 읽어올 수도 있고, PIL, OpenCV 를 사용할 수도 있다.
  • 이미지 증강 기법 등을 통해 이미지를 변환해서 사용할 수도 있다.

✅ 17번 강의파일(텍스트분석, 자연어처리)

❓ 머신러닝에서 텍스트로 된 카테고리 범주 값을 어떻게 처리 했을까?
◼ 인코딩

❓ 텍스트는 영어로 학습한 내용을 한국어로 예측하면 성능이 어떻게 될까?

텍스트 데이터 전처리 -> 데이터 나누기 -> 벡터화(BOW, TF-IDF)

정규 표현식

문자, 숫자를 제외한 특수문자를 제외할 때 주로 사용한다. 특정 패턴으로 텍스트 전처리 시에도 사용한다. 정규표현식은 그 자체로 프로그래밍 언어이다. 정규 표현식은 많은 텍스트 편집기와 프로그래밍 언어에서 문자열의 검색과 치환을 위해 지원하고 있다.
https://ko.wikipedia.org/wiki/%EC%A0%95%EA%B7%9C_%ED%91%9C%ED%98%84%EC%8B%9D

❓ 정규표현식 [0-9]
◼ 모든 숫자
❓ 정규표현식 [^0-9]
◼ 숫자가 아닌 문자
◼ carrot ^ 이 문자열(대괄호) 밖에 있으면 처음을 의미

✅ 1101 실습파일

1101 번의 실습 목표 : BagOfWords,TF-IDF => 단어를 숫자로 인코딩 하는 방법에 대해 알아본다.
토큰화 => 특정 문자(예. 띄어쓰기, 공백)으로 텍스트 데이터를 나눠주는 것. NLTK, Spacy 도 대표적인 텍스트 전처리 도구이며, 토큰화, steming, lematization 등의 기능을 제공한다.
steming, lemitation => 한국어 형태소 분석기에서 제공하는 것도 있고, 안하는 형태소 분석기도 있다. 실습 때 예제에서 함께 다루어 볼 것. 원형을 어떻게 추출할지에 대한 방법을 다루는 것이다.

❓ 하지만 실습에서 잘 사용하지 않을것. 이유는?
◼ 한글을 지원하지 않아서.

❓ 했다. 했어요. 했습니다. 했나요? 하다 => 하다로 통일해서 변형해 주면 어떤 효과가 있을까?
◼ 머신러닝에서 데이터를 binning 해주는 것과 비슷한 효과를 낼 것이다.
◼ 비슷한 의미의 단어를 하나로 전처리해서 나중에 벡터화(인코딩을) 했을 때 데이터 용량을 줄이고 모델에 힌트도 줄 수 있다.
◼ 실습에서는 KoNLPy를 사용할 예정이다. 지원하는 형태소 분석기도 있고, 그렇지 않은 형태소 분석기도 있다.
◼ KoNLPy는 박사학위 논문으로 만들었던 도구이다. 자바, C, C++ 등으로 만들어진 형태소 분석기를 파이썬으로 사용할 수 있게 연결해주는 도구이다.
◼ 파이썬은 접착제 언어이기 때문에 다른 언어로 만들어진 형태소 분석기를 파이썬으로 래핑해서 사용할 수 있게 해주는 도구이다.

BOW

n-gram단어를 몇 개로 묶어서 사용할 것인지
stop_words : 불용어. ex) 나, 너
cvect.fit_transform : document-term matrix 를 반환
get_feature_names_out 으로 단어 사전을 볼 수 있다.
cvect.vocabulary_ : {"단어": 인덱스번호}

❓ N-grams 은 왜 사용할까?
◼ it's bad, not good at all.
it's good, not bad at all.
BOW의 앞 뒤 맥락을 고려하지 않는다는 단점을 해결하기 위해
◼ 묶어서 사용하게 되면 앞뒤 맥락을 고려할 수 있다.
❓ 너무 희귀한 단어를 제외하는 효과가 있는 것은 무엇을까?
◼ min_df
❓ 너무 많이 등장하는 불용어를 제외하는 효과가 있는 것은 무엇일까?
◼ max_df
❓ BOW를 사용하다보면 앞뒤 맥락을 고려하지 않는 단점이 있다. 이것을 해결하기 위한 것은 무엇일까?
◼ ngram_range
❓ 단어를 너무 많이 사용해서 dtm 가 너무 커지는 것을 방지하기 위해 최대 단어를 제한하는 것은 무엇일까?
◼ max_features
❓ 영어나 다른 외국어는 불용어 사전을 NLTK, Spacy 등에서 제공한다. 하지만 한국어는 불용어 사전이 따로 없다. 왜 그럴까?
◼ 정답이 따로 있지는 않다. 한국어는 맥락에 따라 복잡하고 다양한 의미를 갖고, 또 도메인마다 불용어가 다 다르다. 예를 들어 코로나 치료제 관련 논문을 연구한다면 코로나 라는 단어는 불용어가 된다. 예를 들어 파이썬 문서를 본다라고 했을 때 파이썬 문서에서도 파이썬이라는 단어는 불용어가 된다.
◼ 아직 연구가 많이 진행되지 않아서 일수도 있다.

analyzer

analyzer='char_wb', 'char' . n_gram 과 묶어서 많이 사용한다.
'char_wb':단어 안에서만 n_gram을 사용
'char':단어 밖에서도 n_gram을 사용

TF-IDF

전체 문서에서는 자주 등장하지 않지만 특정 문서에서 자주 등장한다면 가중치 값이 높게 나온다. 모든 문서에 자주 등장하는 값은 가중치가 낮게 나온다.

profile
아직 고쳐나가는 중.

0개의 댓글