심화 프로젝트 2일 차.
오늘은 어제 이미지 범주화를 진행하다 발견한 문제를 해결해보려 한다.
사실 이미지 상위 5종은 디폴트 이미지(프로필사진 미설정)이고 하위 5종은 404 error로 자칫 성별을 유추할 수 있을 것으로 보이는 컬럼이 날아가게 될 상황이다.
이에 response code가 200인 것을 걸러 유효이미지의 숫자를 파악해보고자 한다.
이 작업의 결과에 따라 이미지 컬럼을 사용할 수 있을지 없을지가 달려있다.
# 유효 이미지 분류기
import requests
def is_image_url(url):
try:
response = requests.get(url)
if response.status_code == 200:
content_type = response.headers.get('Content-Type', '').lower()
if content_type.startswith('image'):
return True
return False
except requests.RequestException as e:
print(f"Error checking URL: {e}")
return False
# 이미지 URL 여부를 판단하여 새로운 열 추가
df['Is_Image'] = df['profileimage'].apply(is_image_url)
df
코드 실행 후, 약 2시간의 기다림 끝에 결과가 나왔다.
그러나 예상대로 대부분(14,432건 71.98%)의 이미지가 유효하지 않으며, 유효한 이미지 중에서도 디폴트(프로필 미지정)수치가 1,667건으로 많아 실제 사용할 수 있는 숫자는 4천건이 채 되지 않는다(3,951건 19.7%)
더구나 19.7%의 유효이미지조차 상당수 성별을 유추하기 어려워 보였다.
또 많이 걸러졌음에도 유효이미지는 4천 건에 가까워 수작업으로 바로 달려들기엔 물리적인 시간상 어려워 보인다.
일단 다른 컬럼들을 먼저 분석하고 추후에 다른 활용 안을 모색해 보아야겠다.
* 참고 : HTTP 상태 코드 - HTTP | MDN (mozilla.org)
[파이썬] URL 살아있는지 검사 - 주소가 200 인지 체크 - HTTP 응답 상태 코드 (tistory.com)
다음은 이번 주제를 까다롭게 만든 자연어처리(NLP)이다.
일단 자연어처리를 빠르게 학습하고 시도해 보았다.
일단 자연어처리는 총 3가지 라이브러리가 있다.
1. nltk (Natural Language Toolkit)
- 가장 오래된 자연어 처리 라이브러리 중 하나로, 풍부한 기능을 제공
- 다양한 자연어 처리 기능을 포함하며, 토큰화, 형태소 분석, 품사 태깅, 구문 분석 등을 지원
- 교육 목적으로 많이 사용되며, 학계에서 널리 인정받고 있음
- 다양한 자연어 처리 기능을 포함하고 있어 초기부터 많은 사용자와 커뮤니티가 형성
- 문서화가 잘 되어 있어 사용법을 쉽게 익힐 수 있음
- 처리 속도가 상대적으로 느릴 수 있음
2. spacy ▷ 채택!
- 빠른 처리 속도와 효율적인 자원 관리를 목표로 설계된 라이브러리
- 품사 태깅, 개체명 인식(Named Entity Recognition, NER), 의존 구문 분석 등의 고급 기능을 지원
- 다국적 언어 지원과 쉬운 모델 추가 기능
- 높은 처리 속도와 메모리 효율성을 제공하여 대용량 데이터셋에서도 효과적으로 작업
- 최신 자연어 처리 기술을 빠르게 적용할 수 있는 장점
- 초기 설정과 사용 방법이 NLTK에 비해 다소 복잡
3. KoNLPy (Korean Natural Language Processing in Python)
- 한국어 자연어 처리를 위한 라이브러리로, 다양한 한국어 텍스트 처리 기능을 제공
- 형태소 분석기를 중심으로, Okt(Open Korean Text), 꼬꼬마(Kkma), 한나눔(Hannanum), Komoran 등의 형태소 분석기를 제공
- 한국어 특화된 자연어 처리 작업을 간편하게 수행
위 3가지 중 KoNLPy는 한국어 대상이니 제외하고, 속도가 빠르고 메모리 효율성을 고려해 spacy를 채택하였다.
애초에 성별 패턴이 담긴 단어를 고려하였기 때문에 코드를 먼저 작성하였다.
# 1.토큰화
import spacy # NLTK보다 빠르고 효율적
# SpaCy 모델 로드
nlp = spacy.load('en_core_web_sm')
# NaN 값을 빈 문자열로 변환 (NaN이 있는 경우 처리)
df['description'] = df['description'].fillna('')
# 모든 값을 문자열로 변환 : 에러 대응(ValueError: [E1041] Expected a string, Doc, or bytes as input, but got: <class 'float'>)
df['description'] = df['description'].astype(str)
# SpaCy를 사용한 토큰화 함수 정의
def spacy_tokenize(text):
doc = nlp(text)
return [token.text for token in doc]
# 토큰화 적용
df['Tokenization'] = df['description'].apply(spacy_tokenize)
# 결과 출력
print(df[['Tokenization']])
>>결과
Tokenization
0 [i, sing, my, own, rhythm, .]
1 [I, 'm, the, author, of, novels, filled, with,...
2 [louis, whining, and, squealing, and, all]
3 [Mobile, guy, ., , 49ers, ,, Shazam, ,, Googl...
4 [Ricky, Wilson, The, Best, FRONTMAN, /, Kaiser...
... ...
20045 [(, rp, )]
20046 [Whatever, you, like, ,, it, 's, not, a, probl...
20047 [#, TeamBarcelona, .., You, look, lost, so, yo...
20048 [Anti, -, statist, ;, I, homeschool, my, kids,...
20049 [Teamwork, makes, the, dream, work, .]
이번 성별 예측 분류에 적합해 보이는 기법은 2가지를 발견!
1. TF-IDF (Term Frequency-Inverse Document Frequency)
텍스트 데이터를 수치화하여 벡터로 변환하는 방법 중 하나로 문서 내의 단어 빈도(Term Frequency, TF)와 단어의 희소성(Inverse Document Frequency, IDF)을 사용하여 각 단어의 가중치를 계산한다.
- TF (Term Frequency): 특정 단어가 문서 내에서 등장하는 빈도. 단어의 중요성을 문서 내에서 측정
- IDF (Inverse Document Frequency): 단어의 희소성을 측정. 특정 단어가 모든 문서에 많이 등장할수록 그 단어의 중요성은 낮아짐.
- 가중치 계산: TF-IDF 값은 TF와 IDF의 곱
출력예시
TF-IDF 벡터화 결과 (첫 2개 문서):
[[0. 0. 0. ... 0. 0. 0. ]
[0. 0.29017021 0.29017021 ... 0.29017021 0. 0. ]]
특징 이름:
['12345' 'python' '공부' '기법' '날씨' '논의했습니다' '데이터' '맑고' '모델의' '방법을' ... '처리' '팀' '포함하고' '하는']
tf-idf - 위키백과, 우리 모두의 백과사전 (wikipedia.org)
2. Word2Vec
딥러닝 기반의 단어 임베딩 기법으로, 단어를 고정된 크기의 저차원 밀집 벡터(dense vector)로 변환한다. 대표적으로 두 가지 주요 모델(CBOW, Skip-gram)이 있다.
- CBOW (Continuous Bag of Words): 문맥 단어들로부터 중심 단어를 예측
- Skip-gram: 중심 단어로부터 문맥 단어들을 예측
- 밀집 벡터: 단어를 고차원의 희소 벡터가 아닌 저차원의 밀집 벡터로 표현
- 학습 방식: 신경망을 통해 학습하며, 단어의 의미를 유지하는 벡터 공간을 생성
Word2vec - 위키백과, 우리 모두의 백과사전 (wikipedia.org)
적용 후보 학습모델은 3가지이다.
1. 트랜스포머 모델 (Transformer Model) 자연어 처리(NLP) 작업에 널리 사용되는 딥러닝 모델로, 병렬 처리를 통해 학습 속도와 성능을 크게 향상시킨 모델이다. (BERT, GPT, T5와 같은 모델들이 트랜스포머 구조를 기반)
- 병렬 처리: 트랜스포머는 셀프 어텐션(self-attention) 메커니즘을 사용하여 병렬 처리 속도를 높임.
- 장기 의존성 처리: 트랜스포머는 입력 시퀀스의 모든 단어 간의 관계를 한 번에 계산할 수 있어 장기 의존성 문제를 효과적으로 처리
- 사전 훈련된 모델: BERT, GPT 등의 사전 훈련된 트랜스포머 모델은 대규모 코퍼스에서 미리 학습되어 다양한 NLP 작업에서 뛰어난 성능
2. LSTM (Long Short-Term Memory)
순환 신경망(RNN)의 한 종류로, 긴 시퀀스 데이터를 학습할 때 발생하는 기울기 소실 문제를 해결하기 위해 고안된 구조이다.
- 셀 상태(cell state): LSTM은 셀 상태를 유지하여 정보의 흐름을 조절
- 게이트 메커니즘: 입력 게이트, 출력 게이트, 포겟 게이트를 통해 정보가 얼마나 저장되고 버려질지를 결정
- 장기 의존성 학습: LSTM은 긴 시퀀스에서도 학습 능력이 뛰어나며, 텍스트 생성, 시계열 예측 등에 자주 사용 됨
3. RNN (Recurrent Neural Network)
RNN은 시퀀스 데이터를 처리하기 위한 신경망 구조로, 이전 입력에 대한 정보를 메모리 형태로 유지하여 시퀀스 내의 종속성을 학습한다.
- 순차 처리: RNN은 입력 시퀀스를 순차적으로 처리하며, 각 단계의 출력이 다음 단계의 입력으로 사용
- 기울기 소실 문제: 긴 시퀀스 데이터를 학습할 때 기울기 소실(gradient vanishing) 문제가 발생할 수 있음
- 간단한 구조: RNN은 구조가 간단하며, LSTM이나 GRU로 확장되어 기울기 소실 문제를 해결가능
■ 차이점
ㅇ구조적 차이
- RNN: 단순한 순차 구조로, 이전 단계의 출력을 현재 단계의 입력으로 사용
- LSTM: RNN의 변형으로, 셀 상태와 게이트 메커니즘을 통해 정보를 더 효율적으로 전달하고 유지
- 트랜스포머: 셀프 어텐션 메커니즘을 사용하여 모든 단어 간의 관계를 한 번에 계산하며, 병렬 처리가 가능하여 학습 속도가 빠름
ㅇ 성능
- RNN: 기울기 소실 문제로 인해 긴 시퀀스 학습이 어려울 수 있음
- LSTM: 기울기 소실 문제를 해결하여 긴 시퀀스에서도 안정적으로 학습가능
- 트랜스포머: 셀프 어텐션 메커니즘 덕분에 장기 의존성 문제를 효과적으로 해결하며, 대규모 데이터에서 높은 성능
ㅇ 학습 속도
- RNN: 순차 처리로 인해 병렬화가 어렵고, 학습 속도가 느릴 수 있음
- LSTM: RNN보다 학습 속도가 빠르지만, 여전히 순차 처리의 한계.
- 트랜스포머: 병렬 처리가 가능하여 학습 속도가 매우 빠름.
ㅇ 결론
- 성별 예측 분류 작업에서는 트랜스포머 모델이 일반적으로 가장 높은 성능을 발휘할 가능성이 크다.
- 특히 BERT와 같은 사전 훈련된 모델을 활용하면 적은 데이터셋에서도 우수한 결과를 얻을 수 있다.
- LSTM은 긴 시퀀스 데이터를 효과적으로 처리할 수 있으며, RNN은 구조가 간단하지만 긴 시퀀스에서는 성능이 제한적이다. 데이터의 특성과 문제의 복잡성에 따라 적절한 모델을 선택하는 것이 관건!
그러나 생각해 보니 성별의 패턴은 단어뿐 아니라 문장에 흐름(뉘앙스) 등에서도 나타날 수 있다는 생각이 들었다.
그래서 이것도 튜터님의 조언을 받아보고 팀원들과 최종적으로 '단어 토큰화(Word Tokenization)'와 '문장 토큰화(Sentence Tokenization)' 중 어느 것을 채택할지 의사결정을 하도록 해야겠다.
구글링을 해보니 구두점을 그냥 날리면 안 되더라.. 수정해야지_!
* 참고 : 02-01 토큰화(Tokenization) - 딥 러닝을 이용한 자연어 처리 입문 (wikidocs.net)
'회고 > 내배캠_데이터분석가_'24.04~08' 카테고리의 다른 글
Chapter 3. 데이터 분석 입문 (10주차_4/5) (0) | 2024.06.20 |
---|---|
Chapter 3. 데이터 분석 입문 (10주차_3/5) (0) | 2024.06.20 |
Chapter 3. 데이터 분석 입문 (10주차_1/5) (0) | 2024.06.18 |
Chapter 3. 데이터 분석 입문 (9주차_5/5) (0) | 2024.06.15 |
Chapter 3. 데이터 분석 입문 (9주차_3/5) (1) | 2024.06.13 |