HAN_PY 2020. 11. 19. 03:17
반응형

0. 들어가면서

사이킷런(scikit-learn)은 파이썬용 머신러닝 라이브러리이다. 딥러닝 모델은 텐서플로 등을 이용하여 생성할 수 있는 것과 같이 머신러닝 모델은 주로 사이킷런 라이브러리를 통해 만들 수 있다. 우리는 코드를 작성하기 위한 필수적인 부분만 요약하고 선별해서 배워볼 것이다. 

 

 

 

1. 설치

 기본적으로 사이킷런을 사용하기 위해서는 넘파이(Numpy)와 사이파이(Scipy)를 필수적으로 설치해야 한다. 물론 아나콘다에서 아래와 같이 설치하면 넘파이와 사이파이가 자동으로 설치된다.

$ conda install scikit-learn

만약 colab에서 한다면 아래와 같이 shell에 넣으면 된다.

$ pip install sklearn

그리고 import는 아래와 같이 한다.

import sklearn

 

 

 

2. 데이터 분리

기본적으로 데이터를 가져오고 전처리하는건 생략하겠다. 모델을 학습하기 위해서는 학습 데이터와 평가 데이터로 나눠야 한다. 사이킷런을 이용하면 학습 데이터를 대상으로 학습 데이터와 평가 데이터를 쉽게 나눌 수 있다. 아래와 같이 train_test_split를 사용한다.

train_input, test_input, train_label, test_label = train_test_split(dataset['data'], dataset['label'], 
                                                                   test_size = 0.25, random_state=42)

train_test_split는 당연히 먼저 dataset의 데이터와 라벨 값을 넣어준다. 

test_size는 0과 1 사이의 값을 넣어줘야 하고 0.25를 설정한 것은 전체 학습 데이터의 25%를 따로 나눠준다는 것이다.

random_state는 무작위서 선택되는 것을 제어해주는 값으로, 동일한 random_state라면 동일한 데이터를 선택하여 분리해 준다.

 

 

 

3. 모델 학습

아래는 k-최근접이웃분류기(K-nearest neighbor classifier) 분류가 객체를 불러와 변수에 할당하는 코드이다. 여기서는 알고리즘을 다루진 않고 특징 위주로 넘어갈 것이다.

from sklearn.neighbors import KNeighborsClassifier
model_hanpy = KNeighborsClassifier(n_neighbors = 1)

위의 n_neighbors는 알고리즘 분류기마다 들어가는 값이 다르다. 분류기를 변수에 할당했다면, 이제 학습을 진행하면 된다. 학습은 fit 함수를 사용에 분류기 모델에 학습 데이터와 라벨 값만 적용하면 된다. 이때, 지도 학습의 경우는 train_input과 train_label을 둘 다 넣어주면 되고, 비지도 학습의 경우는 train_input만 넣어주면 된다.

# 지도학습 경우
model_hanpy.fit(train_input, train_label)

# 비지도학습 경우
model_hanpy.fit(train_input)

 

 

 

 

4. 결과 예측

모델 학습까지 진행했다면, 이제 다른 input값을 넣어서 결괏값을 예측해보자. 이때는 분류기 모델의 predict 함수를 사용하여 결과를 예측하면 된다.

model_hanpy.predict(new_input)

 여기서 중요한 것은 new_input값을 넘파이 배열로 만들어서 넣어야 한다. 방식은 아래와 같다.

import numpy as np
new_input = np.array([[6.5, 2.5, 8.1, 3.2]])

배열을 생성할 때 리스트 안에 또 하나의 리스트가 포함된 방식으로 만들었다. 만약 하나의 리스트만 사용하여 대입한다면 오류가 난다.

predict 함수를 적용한 결괏값은 class로 지정한 label값 중 가까운 label값이 출력된다.

 

 

 

 

 

5. 자연어 특징 추출

자연어 처리에서 특징 추출이란 데이터의 단어나 문장을 특징 값(숫자)으로 바꿔주는 것을 의미한다. 즉, 토크나이징으로 문장을 특정 기준에 맞게 토큰 단위로 쪼갠 후에 특징을 추출하여 숫자로 바꿔서 모델 훈련을 위한 input값으로 넣는다고 생각하면 된다. 모듈은 CountVectorizer, TfidfVectorizer, HashingVectorizer로 세 가지 방법이다.

  • CountVectorizer - 각 텍스트에서 횟수를 기준으로 특징을 추출하는 방법이다.
  • TfidfVectorizer - TF-IDF라는 값을 사용해 텍스트의 특징을 추출한다.
  • HashingVectorizer - CountVectorizer와 동일하지만, 텍스트 처리 시 해시 함수를 사용하여 실행 시간을 크게 줄일 수 있다.

TF-IDF 값을 사용한다면 단순 횟수를 이용하는 것보다 각 단어의 특성을 좀 더 잘 반영할 수 있다. 따라서 모델을 적용할 때도 단순히 횟수를 이용하는 CountVectorizer보다 TF-IDF값으로 특징을 추철한 TfidfVectorizer를 사용하는 것이 일반적으로 더 좋은 결과를 낸다. 따라서 초입 단계인 우리는 TfidfVectorizer만 알아보도록 하겠다.(그냥 TfidfVectorizer 쓰자.)

 

TF-IDF에 대해 알아보면 TF(Term Frequency)란 특정 단어가 데이터에서 등장하는 횟수를 의미하고, DF(Document Frequency)는 문서 빈도 값으로, 특정 단어가 얼마나 자주 등장하는지를 알려주는 지표이다. IDF(Inverse Document Frequency)는 DF에 역수를 취해서 구할 수 있고, 특정 단어가 다른 데이터에 등장하지 않을수록 값이 커진다는 것을 의미한다.

 

정리하면, TF-IDF란 두 값을 곱해서 사용하므로 어떤 단어가 해당 문서에 자주 등장하지만 다른 문서에는 많이 없는 단어일수록 높은 값을 가진다. 따라서 조사나 지시대명사처럼 자주 등장하는 단어는 TF 값은 크지만 IDF 값은 작아지므로 CountVectorizer가 가지는 문제점을 해결할 수 있다.

 

 

TfidfVectorizer

 문자를 벡터로 만들기 위해서는 우선 단어 사전을 정의해야 한다. 그리고 단어 사전에 정의되어 있는 단어를 기준으로 특정 단어의 숫자를 판단한다.

 구현을 하려면 간단히 TfidfVectorizer은 사이킷런의 특징 추출 모듈에서 불러오면 된다. 코드 아래 colab에서 돌린 결괏값을 같이 올리겠다. 참고하면 된다.

from sklearn.feature_extraction.text import TfidVectorizer

 

 

데이터를 활용하여 실습을 해보자. 우선은 데이터를 정의하고 객체를 생성하자.

text_data = ['자연어처리는 쉽다', '자연어처리 공부는 내일 해야겠다', '점심먹고 공부를 해야겠다', '어제 공부한 자연어처리 복습을 내일해야겠다']
tfidf_vectorizer = TfidfVectorizer()   # 객체생성

 

 

 

우선은 단어 사전을 만들어 단어 사전의 목록을 보자. 그리고 해당 데이터의 한 문장만 객체에 적용해 벡터로 바뀐 값을 출력해 보자.

tfidf_vectorizer.fit(text_data)
print(tfidf_vectorizer.vocabulary_) # 단어 사전 목록보기

 

 

해당 데이터의 한 문장만 객체에 적용하여 최종 값인 벡터로 바뀐 값도 확인해 보자.

sectence = [text_data[3]]   # 어제 공부한 자연어처리 복습을 내일해야겠다
print(tfidf_vectorizer.transform(text_data).toarray())

 

 

 

6. 마무리

사실 최근 BERT가 나오고, 정확하게 분석해주는 알고리즘이 많아진 게 사실이다. 따라서 위의 내용보다는 최신의 것들을 현업에서는 사용하겠지만, 기초는 꼭 알아두고 심화기술로 넘어가야 이해가 더욱더 잘 될 것이다.

반응형