티스토리 뷰
본 포스팅은 『텐서플로2와 머신러닝으로 시작하는 자연어처리』를 참고하여 만들어졌습니다.
https://wikibook.co.kr/nlp-tf2/
사이킷런(scikit-learn)은 파이썬용 머신러닝 라이브러리다. 머신러닝 기술을 활용하는 데 필요한 다양한 기능을 제공하며, 파이썬으로 머신러닝 모델을 만들 수 있는 최적의 라이브러리이다. 라이브러리를 구성하는데 대부분의 모듈들이 통일된 인터페이스를 가지고 있어 간단하게 여러 기법을 적용할 수 있으며, 쉽고 빠르게 원하는 결과를 얻을 수 있다.
지도 학습 모듈에는 나이브 베이즈(Naive Bayes), 의사결정 트리(Decision Trees), 서포트 백터 머신(Support Vector Machines) 모델 등이 있다. 비지도 학습 모듈에는 군집화(Clustering), 가우시안 혼합 모델(Gaussian mixture models) 등이 있다.
모델 선택과 평가 모듈에서는 교차 검증(Cross validation), 모델 평가(Model evaluation), 모델의 지속성을 위해 모델 저장과 모델 불러오기를 위한 기능 등을 제공한다. 그리고 데이터 변환 모듈에서는 파이프라인(Pipeline), 특징 추출(Feature extraction), 데이터 전처리(preprocessing data), 차원 축소(dimensionality reduction) 등의 기능을 제공한다.
또한, 머신러닝 연구와 학습을 위해 라이브러리 안에 자체적으로 데이터 셋을 포함하고 있어 이를 쉽게 풀러와 사용 할 수 있다.
이어지는 설명에서는 사이킷런에 자체적으로 포함되어있는 붓꽃(iris) 데이터를 활용해보자.
from sklearn.datasets import load_iris
iris_dataset = load_iris()
1. 사이킷런을 이용한 데이터 분리
사이킷런을 이용하면 학습 데이터를 대상으로 학습 데이터와 평가 데이터로 쉽게 나눌 수 있다.
from sklearn.model_selection import train_test_split
train_input, test_input, train_label, test_label = \
train_test_split(iris_dateset['data'], iris_dataset['target'], test_size=0.25, random_state=42)
train_test_split 함수를 사용하려면 우선 나누고 싶은 데이터를 넣는다. 여기서는 데아터 값과 라벨인 타겟 값을 넣었다. 그리고 나서 평가 데이터의 크기를 결정하기 위해 전체 데이터에서 평가 데이터로 사용할 비율을 넣는다. 함수가 데이터를 나눌 때 무작위로 데이터를 선택해서 나누는데 이때 무작위로 선택되는 것을 제어할 수 있는 값이 random_state이다. random_state 값을 동일하게 하면 여러번 나누더라도 똑같이 분리된 데이터를 얻을 수 있다.
학습 데이터와 평가 데이터가 따로 존재하지 않는 경우에는 이처럼 학습 데이터의 일부분을 평가 데이터로 사용한다. 평가 데이더가 있는 경우에도 이 함수를 사용해 학습 데이터의 일부분을 따로 분리해 놓는 경우가 있는데, 이러한 경우는 학습 데이터를 학습 데이터와 검증 데이터로 구분하는 경우다. 즉, 학습 데이터, 평가 데이터, 검증 데이터로 총 3개의 데이터로 나눈다. 이 경우에는 우선 학습 데이터를 사용해서 모델을 학습시키고 학습시킨 모델의 하이퍼파라미터를 수정한다. 이처럼 학습과 검증 과정을 반복적으로 진행한 이후 최종적으로 나온 모델에 대해 평가 데이터를 사용해 평가한다. 이러한 방식은 모델을 만드는 과정에서 대부분 사용하는 방법이다.
2. 사이킷런을 이용한 지도 학습
사이킷런을 통해 지도 학습 모델을 만드는 방법을 알아보자. 우선 지도 학습이란 간단히 말해서 각 데이터에 대해 정답이 있는 경우 각 데이터의 정답을 예측할 수 있게 학습시키는 과정이다. 즉, 모델이 예측하는 결과를 각 데이터의 정답과 비교해서 모델을 반복적으로 학습시킨다.
이번 절에서는 지도 학습 모델 중 하나를 선택해서 직접 사용해 보겠다. 지도 학습 모델에는 다양한 모델이 있지만 간단하고 데이터 특성만 맞는다면 좋은 결과를 확인할 수 있는 K-최근접 이웃 분류기(K-nearest neighbor classifier, KNN)를 사용한다. K-최근접 이웃 분류기는 예측하고자 하는 데이터에 대해 가장 가까운 거리에 있는 데이터의 라벨과 같다고 예측하는 방법이다. 이 방법은 데이터에 대한 사전 지식이 없는 경우의 분류에 많이 사용된다.
여기서 K 값은 예측하고자 하는 데이터와 가까운 몇 개의 데이터를 참고할 것인지를 의미한다. 즉, K값이 1이라면 예측하고자 하는 데이터에서 가장 가까운 데이터 하나만 참고해서 그 데이터와 같은 라벨이라 예측하고, K값이 3인 경우에는 예측하려는 데이터에서 가장 가까운 3개의 데이터를 참고해서 그 3개의 데이터의 라벨 중 많은 라벨을 결과로 예측한다.
k-nearest neighbors algorithm - Wikipedia
In statistics, the k-nearest neighbors algorithm (k-NN) is a non-parametric machine learning method first developed by Evelyn Fix and Joseph Hodges in 1951,[1] and later expanded by Thomas Cover.[2] It is used for classification and regression. In both cas
en.wikipedia.org
이러한 K-최근접 이웃 분류기의 특징은 다음과 같다.
- 데이터에 대한 가정이 없이 단순하다.
- 다목적 분류와 회귀에 좋다.
- 높은 메모리를 요구한다.
- K값이 커지면 계산이 늦어질 수 있다.
- 관련 없는 기능의 데이터의 규모에 민감하다.
사이킷런을 이용하여 KNN 이웃 분류기를 직접 만들어보자.
우선 분류기 객체를 불러와 변수에 할당한다. 분류기를 생성할 때 인자 값으로는 n_neighbors 값을 받는데, 이 값은 위에서 설명한 K값을 의미한다.
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1)
fit 함수를 사용해 분류기 모델에 학습 데이터와 라벨 값을 적용하기만 하면 모델 학습이 간단하게 끝난다.
knn.fit(train_input, train_label)
predict 함수를 사용해서 예측 할 수 있다.
import numpy as np
new_input = np.array([6.1, 2.8, 4.7, 1.2]) #임의의 입력값
knn.predict(new_input)
이전에 따로 분리 해둔 평가 데이터를 사용해 모델의 성능을 측정해보자. 우선 따로 분리해둔 평가 데이터에 대해 예측을 하고 그 결과값을 변수에 저장하자.
predict_label = knn.predict(test_input)
print('test accuracy {:.2f}'.format(np.mean(predict_label == test_label)))
3. 사이킷런을 이용한 비지도 학습
비지도 학습이란 지도 학습과는 달리 데이터에 대해 정답, 즉 라벨을 사용하지 않고 만들 수 있는 모델이다. 모델을 통해 문제를 해결하고 싶은데 데이터에 대해 정답이 없는 경우에 적용하기에 적합한 모델이다.
비지도 학습 방법에도 여러 가지 장법이 있지만 여기서는 군집화 방법 중 하나인 K-평균 군집화(K-means Clustering) 모델을 사용해 진행한다. 군집화(Clustering)란 데이터를 특성에 따라 여러 집단으로 나누는 방법이다. 붓꽃 데이터의 경우에는 3개의 정답이 있으므로 3개의 군집으로 나누는 방법을 사용해야 할 것이다.
K-평균 군집화는 군집화 방법 중 가장 간단하고 널리 사용되는 군집화 방법이며, 데이터 안에서 대표하는 군집의 중심을 찾는 알고리즘이다. 알고리즘은 계속해서 반복적으로 수행되는데, 우선 K개만큼의 중심을 임의로 설정한다. 그러고 난 후, 모든 데이터를 가장 가까운 중심에 할당하며, 같은 중심에 할당된 데이터들을 하나의 군집으로 판단한다. 각 군집 내 데이터를 가지고 군집의 중심을 새로 구해서 업데이트한다. 이후 또 다시 가까운 중심에 할당되고 이러한 과정이 계속 반복된다. 이러한 반복은 할당되는 데이터에 변화가 없을 때까지 이뤄진다. 이후 반복이 종료되면 각 데이터가 마지막으로 할당된 중심에 따라 군집이 나뉜다.
k-means clustering - Wikipedia
From Wikipedia, the free encyclopedia Jump to navigation Jump to search Vector quantization algorithm minimizing the sum of squared deviations k-means clustering is a method of vector quantization, originally from signal processing, that aims to partition
en.wikipedia.org
사이킷런 라이브러리의 K-평균 군집화 함수를 사용해 붓꽃 데이터를 군집화해보자. 군집화 모듈에서 KMeans를 불러온 후 K-평균 군집화 모델을 만들면 된다. 이때 인자로 K값을 의미하는 군집의 개수를 설정한다.
from sklearn.cluster import KMeans
k_means = KMeans(n_clusters=3)
KNN을 이용한 지도학습에서와 같이 fit 함수를 사용해 데이터와 라벨을 입력하면 자동으로 데이터를 군집화한다. 하지만 앞서 진행한 지도 학습 모델과 다른 점은 fit 함수의 인자로 데이터의 라벨값을 넣지 않았다는 것이다. 비지도 학습 모델인 K-평균 군집화는 라벨을 필요로 하지 않고 입력 데이터만을 사용해서 비슷한 데이터끼리 구닙을 만들기 때문에 라벨을 넣지 않아도 된다.
라벨값을 넣지 않고 단순히 데이터 사이의 거리를 이용해 군집화한 것이기 때문에 바로 붓꽃의 라벨을 예측할 수 없다. 하지만 다음과 같이 군집화한 K-평균 군집화 모델의 라벨 속성을 확인하면 각 데이터의 라벨을 확인할 수 있다. 이 때 라벨은 군집화된 라벨이지 데이터셋에 저장된 라벨(실제 정답)과 다르다는 점에 유의하자!
k_means.labels_
데이터를 예측하기 위해선 다음과 같은 코드를 실행하면 된다.
import numpy as np
new_input = np.array([6.1, 2.8, 4.7, 1.2]) #임의의 입력값
prediction = k_means.predict(new_input)
print(prediction) #출력되는 라벨은 군집된 라벨이지 실제 데이터의 라벨과 다를 수 있음에 주의하자!
3. 사이킷런을 이용한 특징 추출
자연어 처리에서 특징 추출이란 텍스트 데이터에서 단어나 문장들을 어떤 특징 값으로 바꿔주는 것을 의미한다. 기존에 문자로 구성돼 있던 데이터를 모델에 적용할 수 있도록 특징을 뽑아 어떤 값으로 바꿔서 수치화한다. 이번 장에서는 사이킷런을 사용해 텍스트 데이터를 수치화하는 세 가지 방법에 대해 알아본다. 참고로 세 가지 방법 모두 텍스트 데이터를 다루면서 자주 사용하는 기법이다.
- CountVectorizer
- TfidfVectorizer
- HashingVectorizer
세 가지 방법 모두 텍스트를 벡터로 만드는 방법이다. CountVectorizer는 단순히 각 텍스트에서 횟수를 기준으로 특징을 추출하는 방법이다. TfidVectorizer는 TF-IDF라는 값을 사용해 텍스트의 특징을 추출한다. 마지막으로 HashingVectorizer는 앞에서 설명한 CountVectorizer와 동일한 방법이지만 텍스트를 처리할 때 해시 함수를 사용하기 때문에 실행 시간을 크게 줄일 수 있다. 따라서 텍스트의 크기가 클수록 HashingVectorizer를 사용하는 것이 효율적이다.
(1) CountVectorizer
CountVectorizer는 이름에서도 확인할 수 있듯이 텍스트 데이터에서 횟수를 기준으로 특징을 추출하는 방법이다.여기서 어떤 단위의 횟수를 셀 것인지는 선택 사항이다. 여기서 말하는 단위는 단어가 될 수도 있고, 문자 하나하나가 될 수도 있다. 보통 텍스트에서는 단어를 기준으로 횟수를 측정하는데, 문장을 입력으로 받아 단어의 횟수를 측정한 뒤 벡터로 만든다.
CountVectorizer를 사용하려면 먼저 객체를 만들어야 한다. 그리고 이 객체에 특정 텍스트를 적합시켜야 한다. 여기서 말하는 적합의 의미는 횟수를 셀 단어의 목록을 만드는 과정이다. 그 다음에 횟수를 기준으로 해당 텍스트를 벡터화 한다.
사이킷런의 모듈을 이용해 직접 구현해 보자. 우선 특징 추출 모듈 sklearn.feature_extraction.text에서 CounterVectorizer를 불러와 객체를 생성한다.
from sklearn.feature_extraction.text import CountVectorizer
count_vectorizer = CountVectorizer()
text_data = ['나는 배가 고프다', '내일 점심 뭐먹지', '내일 공부 해야겠다', '점심 먹고 공부 해야지']
생성한 객체에 fit 함수를 사용해 데이터를 적용하면 자동으로 단어 사전을 생성한다.
count_vectorizer.fit(text_date)

매우 간단하게 텍스트 데이터에서 특징을 추출할 수 있다. 횟수를 사용해서 벡터를 만들기 때문에 직관적이고 간단해서 여러 상황에서 사용할 수 있다는 장점이 있다. 하지만 단순히 횟수만을 특징으로 잡기 때문에 큰 의미가 없지만 자주 사용되는 단어들, 예를 들면 조사 혹은 지시대명사가 높은 특징 값을 가지기 때문에 유의미하게 사용하기 어려울 수 있다. 이러한 문제는 TF-IDF 방식의 특징 추출을 통하여 보완 할 수 있다.
(2) TfidfVectorizer
TfidefVectorizer는 TF-IDF라는 특정한 값을 사용해서 텍스트 데이터의 특징을 추출하는 방법이다. 각 값이 의미하는 바를 간단히 설명하면 TF(Term Frequency)란 특정 단어가 하나의 데이터 안에서 등장하는 횟수를 의미한다. 그리고 DF(Document Frequency)란 문서 빈도 값으로 특정 단어가 여러 데이터에 자주 등장하는지를 알려주는 지표이다. IDF(Inverse Document Frequency)는 이 값에 역수를 취해서 구할 수 있으며, 특정 단어가 다른 데이터에 등장하지 않을수록 값이 커진다. TF-IDF란 이 두 값을 곱해서 사용하므로 어떤 단어가 해당 문서에 자주 등장하지만 다른 문에서는 없는 단어일수록 높은 값을 가지게 된다. 따라서 조사나 지시대명사처럼 자주 등장하는 단어는 TF 값은 크지만 IDF값이 작아지므로 CountVectorizer가 가진 문제점을 해결 할 수 있다.
tf–idf - Wikipedia
From Wikipedia, the free encyclopedia Jump to navigation Jump to search (term frequency–inverse document frequency) a numerical statistic intended to reflect the importance of a word to a document in a collection or text corpuscles In information retriev
en.wikipedia.org
사이킷런의 TfidfVectorizer를 사용하는 방법을 알아보자. 사이킷런의 특징추출 모듈에서 불러온 이후 객체를 생성하고, 객체에 데이터를 적합시켜 단어 사전을 만들면 된다.
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf_vectorizer = TfidfVectorizer() #객체 생성
text_date = ['나는 배가 고프다', '내일 점심 뭐먹지', '내일 공부 해야겠다', '점심 먹고 공부 해야지']
tfidf_vectorizer.fit(text_data) #데이터 적합
sentence=[text_data[3]]
print(tfidf_vectorizer.transform(sentence).toarray())

단어 사전은 앞에서 만든 것과 동일한데, 특정 문장을 벡터로 만든 값이 CountVectorizer의 결과와 다르다. TF-IDF 측장 방법을 생각해보면 우선 해당 문장 안에서 단어의 출현 빈도를 측정하고 해당 단어가 다른 데이터에서 잘 나오지 않는 값일수록 높은 값을 가진다.
이처럼 특징 추출 방법으로 TF-IDF 값을 사용할 경우 단순 횟수를 이용하는 것보다 각 단어의 특성을 좀 더 잘 반영할 수 있다. 따라서 모델에 적용할 때도 단순히 횟수를 이용해 특징을 추출하는 것보다 TfidfVectorizer를 사용하는 편이 일반적으로 좀 더 좋은 결과를 만들어낸다.
'인공지능, 자연어처리 > 텐서플로2와 머신러닝으로 시작하는 자연어처리' 카테고리의 다른 글
3장 자연어 처리 개요(2) : 텍스트 분류 (0) | 2021.01.05 |
---|---|
3장 자연어 처리 개요(1) : 단어표현 (0) | 2021.01.05 |
2장 자연어 처리 개발 준비(4) : 그 밖의 라이브러리 (0) | 2021.01.03 |
2장 자연어 처리 개발 준비(3) : 자연어 토크나이징 도구 (0) | 2021.01.03 |
2장 자연어처리 개발 준비(1) : 텐서플로 (2) | 2020.12.26 |
- Total
- Today
- Yesterday
- CBOW
- web
- 융
- 코딩하는 신학생
- Tutorial
- word2vec
- 코딩테스트
- Mikolov
- 심리학
- word embedding
- 당신의 그림자가 울고 있다.
- AI
- NLP
- 단어표현
- Python
- word vector
- 자연어처리
- WebProgramming
- 분석심리학
- Polls
- django
- 인공지능
- 텍스트분류
- 그림자
- lstm
- 로버트존슨
- 젠심
- 알고스팟
- Skip-gram
- text classification
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |