1. 전체적인 내용
데이터셋: 20newsgropus
목적: 주어진 문서들의 카테고리 분류하기
방식:
1)텍스트를 정규화하고 피쳐 벡터화를 사용한다.
2)적절한 알고리즘을 사용하여 분류를 학습/예측/검증한다.
이번 시간에 해볼 것:
1)카운트 기반, tfidf 기반
2)grid search 기반의 tuning
3)pipeline을 통해 피처 벡터화와 그리드 서치 한꺼번에 수행하기
2. 실습
먼저 sklearn.datasets로부터 20newsgroups를 받고 key값을 통해서 어떤 정보들이 있는 지 확인한다. 예를 들어서, filenames, description, target, targetname 등이 있는데 이를 통해서 무엇이 있는 지 알 수 있다. 여기서 밑의 텍스트 예시처럼 header, title 등의 정보가 들어있는 걸 확인할 수 있는데 이 정보를 사용하면 분류가 너무 쉽게 돼서 순수하게 내용만을 가지고 분류하기 위해서 다시 다운로드 받는데 remove를 통해 삭제하자.
From: egreen@east.sun.com (Ed Green - Pixel Cruncher)
Subject: Re: Observation re: helmets
Organization: Sun Microsystems, RTP, NC
Lines: 21
Distribution: world
Reply-To: egreen@east.sun.com
NNTP-Posting-Host: laser.east.sun.com
In article 211353@mavenry.altcit.eskimo.com, maven@mavenry.altcit.eskimo.com (Norman Hamer) writes:
>
> The question for the day is re: passenger helmets, if you don't know for
>certain who's gonna ride with you (like say you meet them at a .... church
>meeting, yeah, that's the ticket)... What are some guidelines? Should I just
>pick up another shoei in my size to have a backup helmet (XL), or should I
>maybe get an inexpensive one of a smaller size to accomodate my likely
>passenger?
If your primary concern is protecting the passenger in the event of a
crash, have him or her fitted for a helmet that is their size. If your
primary concern is complying with stupid helmet laws, carry a real big
spare (you can put a big or small head in a big helmet, but not in a
small one).
---
Ed Green, former Ninjaite |I was drinking last night with a biker,
Ed.Green@East.Sun.COM |and I showed him a picture of you. I said,
DoD #0111 (919)460-8302 |"Go on, get to know her, you'll like her!"
(The Grateful Dead) --> |It seemed like the least I could do...



자, 여기서 보면 먼저 데이터를 불러오고 train,test를 나눠준다.
문서로 되어있으므로 countvectorizer을 통해서 feature vectorization을 해주면 데이터를 위한 준비끝
이때, train을 위해서 fit, transform해주고 test를 위해서 transform해주면 된다.
준비된 데이터를 분류하기 위해서 svm, logistic regression, naive bayes 등의 방법이 있다.
여기서는 로지스틱 회귀 방법을 사용하였다. 모델 객체를 만들고 학습데이터의 피쳐와 라벨을 제공하여 학습을 시킨다.
그리고 predict을 해서 pred를 만들고 accuracy_score을 통해서 실제 y_test와 비교해본다.
자 이제 기본적인 과정을 거쳤고 여기에 grid search를 통해서 최적의 파라메터를 찾을 수 있다.
정리. 최적의 ml algorithm 선택, 최적의 feature preprocessing, 최적의 hyperparameter 찾기



시간이 너무 오래 걸려서 걍 코드만 올린다!

이를 sklearn.pipeline을 사용하면 한번에 사용할 수 있다.
데이터 전처리, 머신러닝 학습, 하이퍼파라메터 튜닝을 한번에 처리하는데 더 직관적이고, 피쳐벡터화 결과를 별도 데이터로 저장하지 않고 스트림 기반에서 바로 머신러닝 알고리즘의 데이터로 입력할 수 있어서 수행 시간을 절약할 수 있습니다.
(이외에도 scailing, pca등이 가능합니다.)
근데, gridsearch를 이용할때, tfidf_vect__ngram_range 처럼 최적화하려는 파라메터를 가진 객체에 언더바를 두 번해서 표시를 해줘야합니다.
그런데 이렇게 모든 객체에 대한 파라메터를 최적화하려면 너무 많은 튜닝시간이 들어가서 시간이 오~래 걸리게 됩니다!
위의 예시의 코드에서는 27개의 파라메터 경우의 수 곱하기 3개의 cross validation으로 81번의 학습/검증 과정을 수행하게돼서 약 24분 소모됩니다.!
최종정리.
sklearn을 통해서 20개의 토픽이 있는 신문기사 dataset을 다운 받았다. 여기에는 다양한 정보가 있었는데 header, title 등을 포함시키지 않고, 순수하게 기사 내용만으로 신문기사의 토픽을 분류하였다. train, test로 나누어서 데이터셋을 확보하였다. 원래는 텍스트에 전처리를 해야하지만 sklearn의 countvectorizer, tfidfvectorizer에는 preprocessing, feature_vectorization이 모두 포함되어있어서 안해줘도 됐다. 그래서 주어진 x_train을 기준으로 x_train, x_test를 tfidf 방식으로 벡터화를 하였다. 그렇게 신문 기사 내용을 벡터로 바꿔줬고 이를 이제 모델에 넣어서 학습/검증 과정을 거쳤다. 이때, logistic regression을 사용해서 fit하고 predict값과 y_test를 비교해서 accuracy_score로 검증을 했다. 그 후에는 gridsearchCV를 통해서 최적의 하이퍼파라메터를 찾아줬다. pipeline을 사용하면 tfidf같은 feature_extraction과 logistic_regression 그리고 gridsearchCV를 동시에 사용할 수 있는데 이를 통해 시간은 오래 걸렸지만 가장 좋은 성능을 얻었다. 즉, 데이터를 준비하고 모델링을 한 후에는 성능을 높이는 작업을 해서 문서가 잘 분류되도록 하였다.
과제. SVM, NB로도 텍스트 분류를 실습해보기 and svm, nb, logistic regression, gridsearch 개념학습 정리.
'이제는 사용하지 않는 공부방 > Artificial intelligence' 카테고리의 다른 글
| [자연어처리] (4) 토픽 모델링 topic modeling (0) | 2021.06.10 |
|---|---|
| [자연어처리] (3) sentiment analysis 실습 (0) | 2021.06.09 |
| [자연어처리] (1) 텍스트 분석 (0) | 2021.06.08 |
| [밑바닥부터 시작하는 딥러닝2] word2vec (0) | 2021.06.05 |
| [tensorflow] 텐서플로우 여러가지 기능 (0) | 2021.06.02 |