본문 바로가기

Natural_Language

[NLP] 02. 자연어 처리 개발 준비 - 사이킷런

반응형

자연어처리 개발을 하는데 있어서 사용되는 라이브러리에 대한 소개

두번째로는 사이킷런

 

02. 사이킷런

Scikit-learn

 

- 사이킷런은 파이썬용 머신러닝 라이브러리이다.

- 머신러닝 기술을 활용하는데 필요한 다양한 기능을 제공한다.

- 딥러닝 모델을 텐서플로, 케라스, 파이토치를 이용해서 생성 할 수 있는 것처럼, 머신러닝은 주로 사이킷런을 사용

- 지도학습을 위한 모듈, 비지도학습을 위한 모듈, 모델 선택 및 평가를 위한 모듈, 데이터 변환 및 데이터를 불러오기 위한 모듈, 계산 성능 향상을 위한 모듈로 구성돼 있다.

 

 

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를 사용하는 것이 효율적이다.

 

반응형