자연어처리 개발을 하는데 있어서 사용되는 라이브러리에 대한 소개
두번째로는 사이킷런
02. 사이킷런
- 사이킷런은 파이썬용 머신러닝 라이브러리이다.
- 머신러닝 기술을 활용하는데 필요한 다양한 기능을 제공한다.
- 딥러닝 모델을 텐서플로, 케라스, 파이토치를 이용해서 생성 할 수 있는 것처럼, 머신러닝은 주로 사이킷런을 사용
- 지도학습을 위한 모듈, 비지도학습을 위한 모듈, 모델 선택 및 평가를 위한 모듈, 데이터 변환 및 데이터를 불러오기 위한 모듈, 계산 성능 향상을 위한 모듈로 구성돼 있다.
1> 사이킷런의 모듈
1. 지도 학습 모듈
- 나이브 베이즈, 의사결정 트리, 서포트 벡터 머신
2. 비지도 학습 모듈
- 군집화, 가우시안 혼합 모델
3. 모델 선택과 평가 모듈
- 교차 검증, 모델 평가, 모델을 지속성을 위한 모델 저장과 불러오기
4. 데이터 변환 모듈
- 파이프라인, 특징 추출, 데이터 전처리, 차원 축소
5. 올바른 알고리즘 선택을 위한 지도
2> 사이킷런을 이용한 데이터 분리
- 사이킷런을 이용하면 학습데이터를 대상으로 학습 데이터와 평가 데이터로 쉽게 나눌 수 있다.
from sklearn.model_selection import train_test_split
train_input, test_input, train_label, test_label = train_test_split(dataset['data'],
dataset['label'],
test_size = 0.2,
random_state = 42)
- train_test_split을 사용하려면 우선 인수로 데이터와 타킷값을 넣어준다.
- test_size : 0에서 1사이의 값, 테스트 데이터의 비율
- random_state : 무작위로 선택되는 것을 제어 할 수 있는 값
3> 사이킷런을 이용한 지도 학습
- 지도 학습 : 간단히 말해서 각 데이터에 대해 정답이 있는 경우 각 데이터의 정답을 예측할 수 있게 학습시키는 과정
즉, 모델이 예측하는 결과를 각 데이터의 정답과 비교해서 모델을 반복적으로 학습시킨다.
< K-nearest neighbor classifier : K-최근접 이숫 분류기 >
- 예측하고자 하는 데이터에 대해 가장 가까운 거리에 있는 데이터의 라벨과 같다고 예측하는 방법
- 이 방법은 데이터에 대한 사전 지식이 없는 경우의 분류에 많이 사용
- 여기서 K값은 예측하고자 하는 데이터와 가까운 몇 개의 데이터를 참고할 것인지를 의미한다.
- 특징 : 데이터에 대한 가정이 없어 단순하다
: 다목적 분류와 회귀에 좋다
: 높은 메모리를 요구한다
: K값이 커지면 계산이 늦어질 수 있다.
: 관련 없는 기능의 데이터의 규모에 민감하다
from sklearn.neighbors import KNeighborsClassifier
# 객체 생성
knn = KNeighborsClassifier(n_neighbors = 1)
#생성한 분류기를 데이터에 적용
knn.fit(train_input, train_label)
- 분류기를 생성한 후, 분류기 모델에 학습 데이터와 라벨을 적용하기만 하면 모델 학습이 끝난다.
# 학습된 분류기를 예측할 때
knn.predict(new_input)
- 분류기 모델에 predict함수를 사용하면 결과를 예측할 수 있다.
4> 사이킷런을 이용한 비지도 학습
- 비지도 학습이란 지도학습과는 달리 데이터에 대한 정답을 사용하지 않고 만들 수 있는 모델이다.
- 모델을 통해 문제를 해결하고 싶은데 데이터에 대한 정답이 없는 경우에 적용하기에 적합한 모델이다.
<K-means Clustering : K-평균 군집화)
- 군집이란 데이터를 특성에 따라 여러 집단으로 나누는 방법
- 데이터 안에서 대표하는 군집의 중심을 찾는 알고리즘이다.
- 진행과정 : 알고리즘은 계속해서 반복적으로 수행되는데, 우선 K개만큼의 중심을 임의로 설정한다.
: 그 후에, 모든 데이터를 가장 가까운 중심에 할당하며, 같은 중심에 할당된 데이터를 하나의 군집으로 판단
: 각 군집 내 데이터를 가지고 계속 군집의 중심을 새로 구해서 업데이트한다.
: 이러한 과정의 반복은 할당되는 데이터의 변화가 없을 때까지 이루어 진다.
: 반복이 종료되면 각 데이터가 마지막으로 할당된 중심에 따라 군집이 나뉜다.
from sklearn.cluster import KMeans
# 객체생성
k_means = KMeans(n_clusters = 3)
# 생성된 객체를 학습
k_means.fit(train_input)
- 사용법은 앞서 사용했던 모델과 비슷하다.
- k-평균 군집화 모델을 만드는데 인자로 k값을 의미하는 군집의 갯수를 정한다.
- 다른 점은 fit함수의 인자로 데이터의 라벨값을 넣지 않는다.
- 비슷한 데이터끼리 군집을 만들기 때문에 라벨은 넣지 않아도 된다.
5> 사이킷런을 이용한 특징 추출
- 자연어 처리에서 특징 추출이란 텍스트 데이터에서 단어나 문장들을 어떤 특징 값으로 바꿔주는 것을 의미
- 기존에 문자로 구성돼 있던 데이터를 모델에 적용할 수 있도록 특징을 뽑아 어떤 값으로 바꿔서 수치화
- 아래 3가지는 텍스트 데이터를 수치화하는 방법이다.
< CountVectorizer >
# 단순히 각 텍스트에서 횟수를 기준으로 특징을 추출하는 방법이다.
- 여기서 어떤 단위의 횟수를 셀 것인지는 선택사항이다.
- 여기서 말하는 단위는 단어가 될 수도 있고, 문자 하나하나가 될 수도 있다.
- 보통은 문자를 입력으로 받아 단어의 횟수를 측정한 뒤 벡터로 만든다.
from sklearn.feature_extraction.text import CountVectorizer
text_data = [ '나는 배가 고프다',
'내일 점심 뭐먹지',
'내일 공부 해야겠다',
'점심 먹고 공부해야지']
# 객체 생성
count_vectorizer = CountVectorizer()
# 객체에 특정 텍스트를 적합시킨다.
count_vectorizer.fit(text_data)
- 위의 fit 함수를 사용해 데이터를 적용하면 자동으로 단어 사전을 생성한다
- count_vectorizer.vocabulary_ : 단어에 대한 숫자들이 딕셔너리 형태로 구성되어있다.
- 이 사전을 활용하여 실제 텍스트 데이터를 벡터로 만든다.
- 이처럼 매우 간단하게 텍스트 데이터에서 특징을 추출할 수 있다.
- 횟수를 사용해서 벡터를 만들기 대문에 직관적이고 간단하다.
- 단순히 횟수만을 특징으로 잡기 때문에 큰 의미가 없다.
- 자주 사용되는 단어들, 예를들면 조사 혹은 지시대명사는 높은 특징값을 가지는 데이터를 유의미하게 사용하기 어려운 단점이있다. 이러한 문제를 해결할 수 있는 특징추출로는 TF-IDF방식이 있다.
< TfidfVectorizer >
# TF-IDF 라는 값을 사용해서 텍스트에서 특징을 추출한다.
<TF-IDF의 의미>
- TF : 특정 단어가 하나의 데이터 안에서 등장하는 횟수를 의미한다.
- DF : 문서의 빈도 값으로, 특정 단어가 여러 데이터에 자주 등장하는지를 알려주는 지표다.
- IDF : 이값에 역수를 취해서 구할 수 있으며, 특정 단어가 다른 데이터에 등장하지 않을수록 값이 커진다는것을 의미
- TF-IDF : 이 두 값을 곱해서 사용하므로 어떤 단어가 해당문서에 자주 등장하지만 다른 문서에는 많이 없는 단어일수록 높은 값을 가지게 된다. 따라서 조사나 지시대명사처럼 자주 등장하는 단어는 TF값은 크지만 IDF값은 작은 값을 가진다.
from sklearn.feature_extraction.text import TfidfVectorizer
text_data = [ '나는 배가 고프다',
'내일 점심 뭐먹지',
'내일 공부 해야겠다',
'점심 먹고 공부 해야지']
# 객체 생성
tfidf_vectorizer = TfidfVectorizer()
# 객체에 특정 텍스트를 적합시킨다.
tfidf_vectorizer.fit(text_data)
- 특징을 추출할 데이터를 정의하고 해당 객체를 생성한다.
- 위의 fit 함수를 사용해 데이터를 적용하면 자동으로 단어 사전을 생성한다
- 데이터 한 문장만 객체에 적용해 벡터로 바뀐 값도 출력해본다.
- 단어사전은 앞에서 만든 것과 동일한데, 특정 문장을 벡터로 만든 값이 CountVectorizer 로 만든 것과 다르다.
- 우선 1, 7번째 단어인 '공부'와 '점심'은 0.4정도의 값을 가진다.
- 그리고 4, 9번째 단어인 '먹고'와 '해야지'는 0.5정도의 값으로 앞의 단어보다 높은 값을 가진다.
>> TF-IDF의 측정 방법을 생각해보면 우선 해당 문장안에서 단어의 출현 빈도를 측정하고 해당 단어가 다른 데이터에서는 잘 나오지 않는 값일수록 높을 가진다고 했다. 이 문장에서 4단어 모두 한 번씩 나왔으나, '먹고'와 '해야지'는 다른 데이터에는 나오지 않은 단어이기 때문에 다른 두 단어보다 높은 값이 나왔다
>> 이처럼 TF-IDF값을 사용할 경우 단순 횟수를 이용하는 것보다 각 단어의 특성을 좀 더 잘 반영할 수 있다.
< HashingVectorizer >
# CountVectorizer와 동일한 방법이지만 텍스트를 처리할 때 해시 함수를 사용하기 때문에 실행시간을 크게 줄일 수 있다.
- 텍스트의 크기가 클수록 HashingVectorizer를 사용하는 것이 효율적이다.
'Natural_Language' 카테고리의 다른 글
[NLP] 03. 자연어 처리 개요 - 텍스트 분류 (0) | 2019.04.28 |
---|---|
[NLP] 03. 자연어 처리 개요 - 단어표현/단어임베딩/단어벡터 (0) | 2019.04.28 |
[NLP] 02. 자연어 처리 개발 준비 - 자연어 토크나이징 도구/전처리 (2) | 2019.04.27 |
[NLP] 02.자연어 처리 개발 준비 - Tensorflow (2) | 2019.04.27 |
[NLP] 텐서플로와 머신러닝으로 시작하는 자연어처리 (0) | 2019.04.27 |