실용 자연어처리 Ch.4

송종빈·2023년 4월 22일
0

23-1

목록 보기
13/31

머신러닝 실습

머신러닝 과정 실습 (감정분석)

데이터구하기

datasets 다운로드

  • Huggingface 데이터셋 패키지 다운로드
!pip install datasets

필요한 패키지

import warnings
import matplotlib.pyplot as plt
from datasets import load_dataset

from konlpy.tag import Mecab
from konlpy.tag import Komoran

from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.svm import LinearSVC
from sklearn.model_selection import cross_val_score
from sklearn.metrics import accuracy_score

데이터 다운로드

sentiment_data = load_dataset("sepidmnorozy/Korean_sentiment")

경고문 무시하기

warnings.filterwarnings('ignore')

데이터 구조 훑어보기

print("Data type: ", type(data))
print("Data structure: ", data)
print("Data keys: ", data.keys())

print(data['train'][0])

결과

Data type: <class 'datasets.dataset_dict.DatasetDict'>
Data structure: DatasetDict({
	train: Dataset({
    	features: ['label', 'text'],
        num_rows: 36000
    })
    test: (위와 유사)
    validation: (위와 유사)
})
Data keys: dict_keys(['train, 'test', 'validation'])
{'label': 1, 'text': '역시 명작 어렸을때 봤을때도 재밌었고 지금 봐도 몇억배 이상으로 재밌어요'}

테스트 세트 만들기

train_data = data['train']
dev_data = data['validation']
test_data = data['test']

데이터 탐색 시각화

데이터 이해를 위한 탐색과 시각화

plt.hist(data['train']['label'], color='red')
plt.hist(data['validation']['label'], color = 'blue')
plt.hist(data['test']['label'], color = 'green')

데이터 준비

데이터 정제

  • 누락된 특성값을 정제
  • 수치 데이터의 경우
    • 해당 구역 제거
    • 전체 특성 삭제
    • 어떤 값으로 채우기 (ex. 0, 평균, 중간값)
  • 자연어 처리인 경우 → 해당 데이터 제거

텍스트와 범주형 특성 다루기

  • 텍스트를 숫자로 바꿈 (벡터화)
    • Bag of words
    • 단어의 빈도수를 통해 문서 표현

sklearn의 fit, transform, fit_transofrm

fit

  • 데이터를 학습시키는 메소드
  • 데이터의 통계량을 계산하기 위해 사용

transform

  • fit에 의해 계산된 통계량을 기준으로 입력을 변환하는 메소드
  • 실제 학습시킨 것을 적용하는 과정

fit_transform

  • fit과 transform을 동시에 하는 메소드
from sklearn.feature_extraction.text import CountVectorizer

vectorizer = CountVectorizer(ngram_range=(1, 3))
vectorizer.fit(train_data['text'])

print(vectorizer.vocabulary_)
print(len(vectorizer.vocabulary_))

train_vectors = vectorizer.transform(train_data['text'])
dev_vectors = vectorizer.transform(dev_data['text'])
test_vectors = vectorizer.transform(test_data['text'])

print(train_data[0]['text'])
print(train_vectors)
sample_num = 0	# 확인하고 싶은 샘플 번호
sample_origin = train_data[sample_num]	# 확인하고 싶은 샘플의 원래 문장
sample_transform = train_vectors[sample_num]	# 확인하고 싶은 샘플의 transform된 결과
sample_inverse_transform = vectorizer.inverse_transform(sample_transform) # 확인하고 싶은 샘플의 transform된 결과를 다시 단어의 조합으로 바꾼 결과

print('Original Input: {}\nTransformed: {}\nInv-transformed: {}'.format(sample_origin, sample_transform, sample_inverse_transform))

결과

Original Input: {'label': 0, 'text': "큰 의미없이 연결'만' 되는 살인들."}
Transformed:   (0, 124544)	1
  (0, 124606)	1
  (0, 224501)	1
  (0, 306290)	1
  (0, 306293)	1
  (0, 306294)	1
  (0, 350325)	1
  (0, 350328)	1
  (0, 350329)	1
Inv-transformed: [array(['되는', '되는 살인들', '살인들', '연결', '연결 되는', '연결 되는 살인들', '의미없이',
       '의미없이 연결', '의미없이 연결 되는'], dtype='<U140')]

선택 훈련

SVM 분류 모델 사용

  • 학습데이터와 정답 레이블을 가지고 학습
  • 학습 후 weight (w)와 bias (b)의 값을 확인 가능
from sklearn.svm import LinearSVC

svm = LinearSVC()
svm.fit(train_vectors, train_data['label'])
print(svm.coef_)	# weights
print(svm.intercept_)	# bias

교차 검증을 사용한 평가

  • 전체 데이터를 n개로 나눈 후, n-1개를 학습 데이터로, 나머지 1개를 테스트 데이터로 사용

5-fold 교차 검증 구현

from sklearn.model_selection import cross_val_score

all_data = train_data['text'] + dev_data['text'] + test_data['text']
all_label = train_data['label'] + dev_data['label'] + test_data['label']

all_vectorizer = vectorizer.transform(all_data)
scores = cross_val_score(svm, all_vectors, all_label, cv=5)

print('All scores: ', scores)
print('Average: {:.2f}%'.format(scores.mean()*100))	# 5번의 스코어 평균 출력
print('Standard Deviation: {:.6f}'.format(scores.std()))

모델 조정

그리드 탐색

탐색하고자 하는 하이퍼파라미터와 시도해볼만한 값을 조합해서 테스트

  • param_grid 설정에 따라 사이킷런이 하이퍼파라미터의 조합으로 모델 평가
from sklearn.model_selection import GridSearchCV

param_grid = [{'max_iter':[500, 1000, 5000], 'C':[1, 10, 100]}]	# max_iter & c를 변동 하이퍼파라미터로 설정
grid_search = GridSearchCV(svm, param_grid, cv=3)
grid_search.fit(train_vectors, train_data['label'])

print(grid_search.cv_results_['mean_test_score'])	# 파라미터 서치 결과
print(grid_search.best_params_)	# 최고의 모델 파라미터

# 파라미터 서치 결과 출력
for mean_score, params in zip(grid_search.cv_results_['mean_test_score'], grid_search.cv_results_['params']):
  print(mean_score, params)

랜덤 탐색

RandomizedSearchCV

  • 가능한 모든 조합을 시도하는 대신 각 반복마다 하이퍼파라미터에 임의의 수를 대입하여 지정한 횟수만큼 평가

앙상블 방법

각기 다른 형태의 오차를 만드는 여러 모델을 함께 사용

최상의 모델과 오차 분석

  • 추가 특성 포함
  • 불필요한 특성 제거
  • 이상치 제외

솔루션 제시

최적의 하이퍼파라미터를 갖는 모델을 최종 모델로 선택하고 test 실행 결과 확인

from sklearn.metrics import accuracy_score

final_model = grid_search.best_estimator_

pred_results = final_model.predict(test_vectors)
accuracy = accuracy_score(test_data['label'], pred_results)

print("Accuracy: {.2f}%".format(accuracy * 100))

시스템 런칭, 모니터링, 유지보수

  • 모델을 상용 환경에 배포
  • 모니터링 코드 작성 → 일정 간격으로 시스템의 실시간 성능을 체크하고 성능이 떨어졌을때 알람 통지
  • 데이터셋을 업데이트하고 모델을 정기적으로 다시 훈련 (자동화 가능)
    • 정기적으로 새로운 데이터 수집 & 레이블 추가
    • 모델을 훈련하고 하이퍼파라미터를 자동으로 세부 튜닝하는 스크립트 작성 (매일 or 매주 자동 실행)
    • 업데이트된 테스트 세트에서 새로운 모델과 이전 모델을 평가하는 스크립트 작성
    • 성능이 감소하지 않으면 새로운 모델을 제품에 배포
    • 만든 모든 모델을 백업

피쳐 엔지니어링을 통한 성능 향상

피쳐 엔지니어링

  • 도메인 지식을 활용하여 데이터에서 특징을 추출하는 작업
  • 문제 해결에 유용한 관련성 있는 추가 정보를 제공하여 기계 학습 모델의 정확성 개선

자연어처리에 대표적으로 쓰이는 피쳐

  • N-gram feature
  • TF-IDF feature

N-gram feature 사용

from sklearn.feature_extraction.text import CountVectorizer

vectorizer = CountVectorizer(ngram_range=(1, 3)) # ngram_range 파라미터 수정

TF-IDF feature 사용

from sklearn.feature_extraction.text import TfidfVectorizer

vectorizer = TfidfVectorizer()

형태소 분석 실습

  1. 토큰화
  • 문자를 연속적인 단위인 토큰으로 분해
  • 한국어는 형태소 단위 토큰도 많이 사용
  1. 표제어 추출 & 어간 추출
  • 표제어 추출: 단어의 뿌리를 의미하는 기본 사전형 단어 추출
  • 어형 변화의 기초가 되는 부분이자 단어의 의미를 담고 있는 핵심 부분 추출
  1. 불용어 처리
  • 분석에 의미없는, 사용되지 않는 단어 제거
  1. 벡터화
  • 단어, 문장, 문서를 컴퓨터가 이해하도록 수치화해주는 과정

자연어처리 전처리 실습

  1. nltk
  • 영어 처리를 위한 가장 널리 알려진 고성능 파이썬 NLP 라이브러리
  • 학계 타겟
  • 분류, 토큰화, 스테밍, 태깅, 파싱, 시멘틱 추론, 스탠포드 파서 등 가능
  1. spacy
  • 64개 언어 지원 (한국어 x)
  • 산업용
  • 음성태깅, 종속성 파싱, 명명 엔티티 인식, 토큰화, 규칙 기반 매칭 작업, 워드 벡터 등 가능
  1. konlpy
  • 한국어용 nlp 라이브러리
  • konlpy의 mecab 형태소 분석 라이브러리는 빠른 속도 때문에 산업에서 유용하게 사용됨

Google Colab 연결

from google.colab import drive
drive.mount('/content/drive')

Mecab 다운로드

%cd ./drive/MyDrive/Colab\ Notebooks/
! git clone https://github.com/SOMJANG/Mecab-ko-for-Google-Colab.git
%cd ./Mecab-ko-for-Google-Colab
!bash install_mecab-ko_on_colab_light_220429.sh

Mecab 동작 확인코드 실행

from konlpy.tag import Mecab
mecab = Mecab()

example_sentence = '실용자연어처리 실습 진행중입니다.'

print(mecab.morphs(sentence))
print(mecab.nouns(sentence))
print(mecab.pos(sentence))

형태소 단위로 tokenized된 텍스트를 데이터로 사용

train_data = train_data.map(lambda example: {'label': example['label'], 'text': ' '.join(mecab.morphs(example['text']))})
dev_data = dev_data.map(lambda example: {'label': example['label'], 'text': ' '.join(mecab.morphs(example['text']))})
test_data = test_data.map(lambda example: {'label': example['label'], 'text': ' '.join(mecab.morphs(example['text']))})
profile
Student Dev - Language Tech & Machine Learning

0개의 댓글