텍스트 분류 실습(20 뉴스그룹 분류)
텍스트를 피처 벡터화로 변환하면 일반적으로 희소행렬 형태가 되고,
이러한 희소 행렬에 분류를 효과적으로 잘 처리할 수 있는 알고리즘은 로지스틱 회귀, 선형 서포트 벡터 머신, 나이브 베이즈 등임.
** subset 파라미터 이용하면 학습 데이터 세트와 테스트 데이터 세트를 분리해 내려받을 수 있음.
from sklearn.datasets import fetch_20newsgroups
#subset = 'train'으로 학습용 데이터만 추출, remove=('headers', 'footers', 'quotes')로 내용만 추출
fetch_20newsgroups(subset='train', remove=('headers', 'footers', 'quotes'), random_state=156)
X_train =train_new.data
y_train = train_news.target
#test 데이터도 마찬가지로..
- 피처 벡터화 변환과 머신러닝 모델 학습/예측/평가
** 테스트 데이터에서 피처 벡터화 수행할 때 유의할 점
→ 테스트 데이터에서 CountVectorizer를 적용할 때는 반드시 학습 데이터를 이용해 fit()이 수행된 CountVectorizer 객체를 이용해 테스트 데이터를 변환(transform) 해야한다는 것.
⇒ 그래야만!! 학습 시 설정된 CountVectorizer의 피처 개수와 테스트 데이터를 CountVectorizer로 변환할 피처 개수가 같아짐.
(테스트 데이터의 피처 벡터화는 학습 데이터에 사용된 CountVectorizer 객체 변수인 cnt_vect.transform()을 이용해 변환함)
+ 테스트 데이터의 피처 벡터화 시 fit_transform()을 사용하면 안됨.
(CountVectorizer.fit_transform(테스트 데이터)을 테스트 데이터 세트에 적용하면 테스트 데이터 기반으로 다시 CountVectorizer가 fit()을 수행하고 transform()하기 때문에 학습 시 사용된 피처 개수와 예측 시 사용할 피처 개수가 달라짐,)
from sklearn.feature_extraction.text import CountVectorizer
cnt_vect = CountVectorizer()
cnt_vect.fit(X_train)
X_train_cnt_vect = cnt_vect.transform(X_train)
#학습 데이터로 fit 된 CountVectorizer를 이용해 테스트 데이터를 피처 벡터화 변환 수행
X_test_cnt_vect = cnt_vect.transform(X_test)
#TF-IDF 벡터화도 비슷하게 적용
로지스틱 회귀 짚고 넘어가기
로지스틱 회귀는 선형회귀방식을 분류에 적용한 알고리즘임. 가중치 변수가 선형이므로 선형 회귀 계열임.
로지스틱 회귀가 선형 회귀와 다른 점은 학습을 통해 선형함수의 회귀 최적선을 찾는 것이 아니라 시그모이드 함수 최적선을 찾고, 이 시그모이드 함수의 반환 값을 확률로 간주해 확률에 따라 분류를 결정함. 즉, 로지스틱 회귀는 선형 회귀 방식을 기반으로 하되 시그모이드 함수를 이용해 분류를 수행하는 회귀임.
시그모이드 함수 - x값이 아무리 커지거나 작아져도 y값은 항상 0과 1 사이 값을 반환한다. x값이 커지면 1에 근사하며 x값이 작아지면 0에 근사한다. 그리고 x가 0일 때는 0.5이다.
- 사이킷런에서 로지스틱 회귀는 Logistic Regression() 클래스를 통해 구현되는데, 주요 하이퍼 파라미터로는 penalty와 C가 있음
-> penalty = 규제의 유형을 설정하며 ‘l1’은 L1 규제를, ‘l2’는 L2 규제를 적용하게 된다. 디폴트는 l2.
-> C = 규제 강도를 조절하는 alpha 값의 역수임. C 값이 작을수록 규제 강도가 큼.
- 사이킷런 파이프라인 사용 및 GridSearchCV와의 결합
피처 벡터화와 ML 알고리즘 학습/예측을 위한 코드 작성을 한번에 진행할 수 있음. (데이터 전처리와 머신러닝 학습 과정을 통일된 API 기반에서 처리가능)
from sklearn.pipeline import Pipeline
pipeline = Pipeline([
('tfidf_vect', TfidfVectorizer(stop_words='english', ngram_range=(1,2), max_df=300)),
('lr_clf', LogisticRegression(solver='liblinear', C=10))
])
# 별도의 TfidfVectorizer 객체의 fit(), transform()과 LogisticRegression의 fit(), predict()가 필요없음.
# pipeline의 fit()과 predict() 만으로 한꺼번에 피처벡터화와 ML 학습/예측이 가능.
pipeline.fit(X_train, y_train)
pred = pipeline.predict(X_test)
accuracy_score(y_test,pred)
** GridSearchCV 클래스의 생성 파라미터로 Pipeline을 입력해 Pipeline 기반에서도 하이퍼파라미터 튜닝을 GridSearchCV 방식으로 진행할 수 있음.
→ 피처 벡터화를 위한 파라미터와 ML 알고리즘의 하이퍼 파라미터를 모두 한 번에 GridSearchCV를 이용해 최적화할 수 있음.
⇒ estimator(ex.lr_clf)가 아니라 pipeline 입력,
param_grid 입력값의 key 값은 언더바 2개를 연달아 붙여 하이퍼 파라미터명이 객체 변수명과 결합돼 제공됨. ex. tfidf_vect__ngram_range
from sklearn.pipeline import Pipeline
pipeline = Pipeline([
('tfidf_vect', TfidfVectorizer(stop_words='english')),
('lr_clf', LogisticRegression())
])
#Pipeline에 기술된 각각의 객체 변수에 언더바 2개를 연달아 붙여 GridSearchCV에 사용될 파라미터/하이퍼 파라미터 이름과 값을 설정.
params = { 'tfidf_vect__ngram_range' : [(1,1), (1,2), (1,3)]
'tfidf_vect__max_df' : [100, 300, 700],
'lr_clf__C' : [1,5,10]
}
#GridSearchCV의 생성자에 Estimator가 아닌 Pipeline 객체 입력
grid_cv_pipe = GridSearchCV(pipeline, param_grid=params, cv=3, scoring = 'accuracy', verbose =1)
grid_cv_pipe.fit(X_train, y_train)
print(grid_cv_pipe.best_params_, grid_cv_pipe.best_score_)
pred= grid_cv_pipe.predict(X_test)
print(accuracy_score(y_test, pred))
'Machine Learning > 텍스트 분석' 카테고리의 다른 글
[파이썬 머신러닝 가이드] 텍스트 분석 - 문서 군집화 (2) | 2023.12.26 |
---|---|
[파이썬 머신러닝 가이드] 텍스트 분석 - 토픽 모델링 (1) | 2023.12.26 |
[파이썬 머신러닝 가이드] 텍스트 분석 - 감성 분석 (2) | 2023.12.26 |
[파이썬 머신러닝 가이드] 텍스트 분석 - Bag of Words(BOW) (2) | 2023.12.26 |
[파이썬 머신러닝 가이드] 텍스트 분석 - 텍스트 전처리(정규화) (2) | 2023.12.26 |