지금은마라톤중

멋사 AI스쿨 TIL - (26) 본문

멋쟁이사자처럼/Python

멋사 AI스쿨 TIL - (26)

달리는중 2023. 4. 18. 22:27

2023.03.27

 

 

질문🙋🏻‍♂️ : 왜 Accuracy 만으로는 제대로 된 분류의 평가를 하기 어려울까요?
데이터가 불균형한 경우에는 높은 Accuracy여도 정확하지 않기 때문이다.
예를 들어 암 여부를 예측하는 모델이라고 할 때 현실세계에서 건강검진을 했을 때 1000명 중에 1명이 암환자라면 학습을 했을 때 암환자의 특징을 학습하기도 어려울 뿐더러, 정확도인 Accuracy로 측정하게 되면 모두 암환자가 아니라고 했을 때 99.9%가 정확도로 나오게 됩니다. 1명의 암환자를 제대로 찾지 못했기 때문에 해당 모델은 잘 만든 모델이라고 평가할 수 없습니다.

 

 

● np.argmax -> 값이 가장 큰 인덱스(분류된 클래스!)를 반환

 

● 분류기 출력 품질을 평가하기 위한 precision-recall 메트릭의 예입니다.

precision-recall은 클래스가 매우 불균형할 때 예측의 성공 여부를 평가하는 유용한 척도입니다. 정보 검색에서 precision는 결과의 관련성을 측정하는 지표이고, recall은 얼마나 많은 관련성 있는 결과가 반환되는지를 측정하는 지표입니다.

precision-recall 곡선은 다양한 임계값에 대한 precision와 recall 간의 상충 관계를 보여줍니다. 곡선 아래의 넓은 영역은 높은 정확도와 높은 리콜을 모두 나타내며, 높은 정확도는 낮은 오탐률과 관련이 있고 높은 리콜은 낮은 오탐률과 관련이 있습니다. 두 점수가 모두 높으면 분류기가 정확한 결과(높은 정밀도)를 반환할 뿐만 아니라 모든 양성 결과의 대부분을 반환하고 있음을 나타냅니다(높은 재검출률).

정확도는 높지만 정확도가 낮은 시스템은 많은 결과를 반환하지만, 학습 라벨과 비교했을 때 예측된 라벨의 대부분이 부정확합니다. 정밀도는 높지만 정확도가 낮은 시스템은 정반대로, 매우 적은 수의 결과를 반환하지만 예측된 대부분의 레이블이 학습 레이블과 비교할 때 정확합니다. 정확도가 높고 재현율이 높은 이상적인 시스템은 많은 결과를 반환하며 모든 결과에 올바르게 레이블이 지정됩니다.

 

 

 

● SMOTE 기법

- SMOTE는 Synthetic Minority Over-sampling Technique의 약자로 합성 소수자 오버샘플링 기법입니다.

- 적은 값을 늘릴 때, k-근접 이웃의 값을 이용하여 합성된 새로운 값을 추가합니다.

- k-근접 이웃이란 가장 가까운 k개 이웃을 의미합니다.

- 새로 생성된 값은 좌표평면으로 나타냈을 때, k-근접 이웃의 중간에 위치하게 됩니다

 

 

● under-sampling과 over-sampling

  • 이런 문제를 해결하기 위해서 불균형한 데이터는 전체 데이터에서 샘플링을 하는 방식을 달리합니다.
  • 방법은 크게 under-sampling과 over-sampling 두 가지가 있습니다.
  • 주요 골자는 두 값의 비율이 비슷하게 맞춰주는 것입니다.
  • under-sampling은 더 값이 많은 쪽에서 일부만 샘플링하여 비율을 맞춰주는 방법입니다.
  • over-sampling은 더 값이 적은 쪽에서 값을 늘려 비율을 맞춰준 방법입니다.
  • under-sampling은 구현이 쉽지만 전체 데이터가 줄어 머신러닝 모델 성능이 떨어질 우려가 있습니다.
  • over-sampling은 어떻게 없던 값을 만들어야 하는지에 대한 어려움이 있습니다.

 

● ROC Curve (Reciever Operating Characteristic Curve)

- 각 기준값(threshold)의 변화에 따라 성능 평가 지표의 값이 어떻게 변하는지를 시각화

 

자연어처리

 

질문🙋🏻‍♂️ : 텍스트 데이터를 벡터화 한다는 것은 텍스트를 수치데이터로 변경해 주는 과정입니다. 어떻게 변경해 줄 수 있을까요?
원핫 인코딩

 

1. 등장 횟수 기반의 단어 표현(Counte-based Representation) : 단어가 문서(혹은 문장)에 등장하는 횟수를 기반으로 벡터화 하는 방법 - Bag-of-Words

- TF-IDF
2. 분포 기반의 단어 표현 ( Distributed Representation) : 타겟 단어 주변에 있는 단어를 벡터화 하는 방법

- Word2Vec

- Glove

- fastText

 

● 코퍼스 corpus 란?

- 언어 연구를 위해 텍스트를 컴퓨터가 읽을 수 있는 형태로 모아 놓은 언어

- 자료. 매체, 시간, 공간, 주석 단계 등의 기준에 따라 다양한 종류가 있다.

 

 

● Word Embedding (단어 임베딩)이란?

Embed : 심는다는 의미 !

- 언어 모델링에 포함되는 과정

- Text를 신호 공간에 숫자로 매핑하여 Dense하게 만드는 표현법

- 언어 사이의 유사도와 의미를 반영한 다차원 벡터를 활용하여 자연어 처리 모델의 성능 향상

 

 

● 토큰화란?

- 주어진 코퍼스(corpus)에서 Text를 토큰(token)이라 불리는 단위로 나누는 작업이다.

- 특정 문자(예. 띄어쓰기, 공백)으로 텍스트 데이터를 나눠준다.

- 대표적인 토큰화 패키지로 nltk가 있지만 실습에서는 사용하지 않습니다 !

 

 

● 어간추출과 표제어표기법

어간추출(Stemming) => 하다, 했다, 했습니다. 했고요. 했는데 등의 다양한 표현이 있는데 원형이 "하다"로 일관되게 만들 수 있다면 불필요한 벡터 공간을 낭비하지 않을 수 있으며, 의미를 하나로 모아줄 수 있습니다.

어간추출 => 원형을 잃을 수도 있습니다.

표제어표기법 => 원형을 보존합니다.

 

 

규칙 기반의 접근을 하고 있으므로 어간 추출 후의 결과에는 사전에 없는 단어들도 포함되어 있습니다.

가령, 포터 알고리즘의 어간 추출은 이러한 규칙들을 가집니다.

ALIZE → AL

ANCE → 제거

ICAL → IC

위의 규칙에 따르면 좌측의 단어는 우측의 단어와 같은 결과를 얻게됩니다.

formalize → formal

allowance → allow

electricical → electric

 

 

● 표제어 추출(Lemmatization) 단어들로부터 표제어를 찾아가는 과정

 

표제어 추출 전 : ['policy', 'doing', 'organization', 'have', 'going', 'love', 'lives', 'fly', 'dies', 'watched', 'has', 'starting']
표제어 추출 후 : ['policy', 'doing', 'organization', 'have', 'going', 'love', 'life', 'fly', 'dy', 'watched', 'ha', 'starting']

 

불용어

자주 등장하지만 분석을 하는 것에 있어서는 큰 도움이 되지 않는 단어

예를 들면, I, my, me, over, 조사, 접미사 같은 단어들은 문장에서는 자주 등장하지만 실제 의미 분석을 하는데는 거의 기여하는 바가 없는 경우가 있다.

 

 

● Bag Of Words

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

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

- 단어의 순서를 전혀 고려하지 않기 때문에 맥락을 구분하지 못한다는 단점을 가진다.

 

 

질문🙋🏻‍♂️ : Bag Of Words 단어가방을 만들었을 때 전혀 다른 의미가 같은 의미로 만들어질 수도 있습니다. 이를 보완하려면 어떻게 하면 좋을까요?

이를 보완하기 위해 n-gram을 사용, BOW는 하나의 토큰을 사용하지만 n-gram은 n개의 토큰을 사용

 

 

● Countvectorizer

단어 토큰을 생성하고 단어 수를 세어 BOW 벡터 생성

 

●  용어정리

lowercase : 전부 소문자로 만들기


preprocessor : 사용자가 함수를 만들어서 넣어주면 텍스트에 일괄 적용해줌 (예: 품사를 제거해주는 함수 등)


tokenizer : 단어 단위로 해줌(문자 단위로 해주기도 합니다)


stop_words : 불용어


analyzer : word, char, char_wb (단어 단위, 글자 단위, 'charwb' 옵션은 단어 경계 안쪽의 텍스트에서만 n-그램 문자를 생성하고, 단어 가장자리의 n-그램은 공백으로 채워집니다.)

 

 

● BoW 변환 과정

(1) 각 단어에 고유한 정수 인덱스를 부여하여 단어 집합을 생성.

(2) 각 인덱스의 위치에 단어 토큰의 등장 횟수를 기록한 벡터 생성


데이콘 전화해지여부 대회

split 하지 않은 데이터로 fit하고 데이콘 점수를 봤을 때 왜 더 높았을까요?

split 하지 않았을 때가 학습할 데이터가 더 많았기 때문이다.

 

질문🙋🏻‍♂️ :  경진대회에서 제출 제한이 있는 이유는 ?

진행중인 대회는 대부분 3~10회로 제출 제한이 있습니다. => 어뷰징 때문이에요

 

질문🙋🏻‍♂️ : 제출을 여러번 해보지 못하기 때문에 그 전에 해볼 수 있는게 무엇일까요?

hold-out-validation, cross-validation 을 통해 검증하고 제출하게 됩니다

 

질문🙋🏻‍♂️ : 보통 머신러닝을 돌릴 때 주피터 노트북이 터지는 원인과 터지지 않기 위해 할 수 있는 조치로는 무엇이 있나요?

메모리를 너무 많이 사용하면 보통 노트북이 다운됩니다. => 작게 나눠 돌리는 것을 추천합니다

예) 그리드서치, 랜덤서치를 한다면 구간이나 횟수를 조정할 수 있습니다. 밤새도록 돌릴만큼 설정하는것이 아니라 1시간 정도 돌아갈 분량으로 밥먹으러 가기 전에 돌려 놓고 밥먹고 와서 확인하기!

혹은 실습하면서 EDA 하면서 10분 내로 확인할 수 있는 분량으로 돌리기 그리고 다른 구간으로 변경해서 확인하기!

파라미터 중에 시간이 오래 걸리는 파라미터

=> 부스팅 모델은 early stop을 대부분 제공하기 때문에 끝까지 돌리기 보다는 중간에 멈추게 설정하기


 

 

질문🙋🏻‍♂️ : Countvectorizer에서 max_features를 적용할 때 빈도수가 같은 단어의 경우에는 어떤 기준으로 처리하나요?
Scikit-learn의 TfidfVectorizer를 사용하면 max_features 매개변수를 사용할때, 단어의 빈도수에 상관없이 빈도가 높은 단어를 우선적으로 선택합니다. 만약 빈도수가 같다면 알파벳 순으로 정렬된다고 합니다 
순차정렬 기준으로 남겨둡니다. (역순으로 제외합니다.)

 

질문🙋🏻‍♂️ : 영어에서 CountVectorizer의 analyzer='char' 옵션을 많이 사용하는 이유는?
(chat GPT 답변)
CountVectorizer에서 analyzer='char' 옵션은 문자(character) 단위로 텍스트를 분석하여 단어를 추출합니다. 이 옵션은 어떤 언어든지 사용이 가능하지만, 영어에서 많이 사용되는 이유는 영어 단어들이 대체로 길이가 짧고 철자가 다양하기 때문입니다.
한국어나 중국어와 같은 언어는 한 글자로 의미가 있는 단어가 많이 있기 때문에 analyzer='char'를 사용하면 매우 많은 수의 단어가 추출됩니다. 반면에 영어는 한 글자로 의미가 있는 단어가 그렇게 많지 않기 때문에, analyzer='char' 옵션을 사용해도 비교적 적은 수의 단어가 추출됩니다.
또한 영어에서는 대체로 특수문자나 숫자가 적게 사용되어 이들이 단어 추출에 큰 영향을 끼치지 않기 때문에 analyzer='char'를 사용해도 문제가 되지 않습니다. 하지만 다른 언어에서는 특수문자나 숫자가 많이 사용되기 때문에 analyzer='char'를 사용하면 이들이 불필요하게 단어 추출에 포함될 가능성이 높아집니다.
따라서 다른 언어에서는 analyzer='char'보다는 analyzer='word'를 사용하는 것이 보다 적절합니다.

 

 

 

질문🙋🏻‍♂️ : 원핫인코딩과 단어가방(bag of words)의 차이점?

 

 

 

● 단어가방과 TF-IDF 의 차이점

단어가방은 빈도만 보기 때문에 최근 이슈가 되고 있는 "얼룩말 세로"라는 단어는 최근 신문기사에서는 중요한 주제입니다.

그런데 과거 1년치 신문기사를 분석한다면 해당 단어는 빈도가 낮아 중요하지 않는 단어로 볼 수 있습니다.

하지만 특정 기사에서는 "얼룩말 세로"가 자주 등장하기 때문에 해당 기사에서는 "얼룩말 세로"가 중요한 역할이라고 볼 수 있을 것입니다. 전체 문서에는 자주 등장하지 않지만 특정 문서에 자주 등장하는 단어에 가중치를 주는 것이 TF-IDF 입니다

 

 

 

TF-IDF

CountVectorizer + TfidfTransformer -> TfidfVectorizer

TF-IDF(Term Frequency-Inverse Document Frequency)는 단어의 빈도와 역 문서 빈도(문서의 빈도에 특정 식을 취함)를 사용하여 DTM 내의 각 단어들마다 중요한 정도를 가중치로 주는 방법입니다. 우선 DTM을 만든 후, TF-IDF 가중치를 부여합니다. TF-IDF는 주로 문서의 유사도를 구하는 작업, 검색 시스템에서 검색 결과의 중요도를 정하는 작업, 문서 내에서 특정 단어의 중요도를 구하는 작업 등에 쓰일 수 있습니다.

 

질문🙋🏻‍♂️ : 단어 가방으로 벡터화 했을 때와 TF-IDF로 벡터화 했을 때 어떤 차이점이 있을까요?
CountVectorizer 단어의 빈도만 고려한다. 
TF-IDF는 문서 내 단어의 상대적 중요성과 전체적인 코퍼스를 고려하고, TF와 IDF의 곱으로 나타냅니다!(희귀한 단어에 중점을 두기 때문에 문서를 구별하는데 유용하다.) 
현재 데이콘에서 진행중인 월간 데이콘 ChatGPT 활용 AI 경진대회에서도 GPT에게 관련된 코드를 물어보면 TF-IDF를 사용한 코드를 추천해준다!

 

'멋쟁이사자처럼 > Python' 카테고리의 다른 글

멋사 AI스쿨 TIL - (28)  (0) 2023.04.18
멋사 AI스쿨 TIL - (27)  (0) 2023.04.18
멋사 AI스쿨 TIL - (25)  (0) 2023.03.23
멋사 AI스쿨 TIL - (24)  (0) 2023.03.23
멋사 AI스쿨 TIL - (23)  (0) 2023.03.23
Comments