728x90
반응형
분류명이 붙은 문자 메세지들로 선형 판별 분석 모형을 훈련
LDA는 LSA와 비슷 한 고차원 공간에서 차원들(BOW, TF-IDF)의 최고의 일차 결합을 찾아내려면 분류명이나 기타 점수들이 미리 부여된 훈련된 자료가 필요하다.
LSA - 새 벡터 공간에서 모든 벡터가 서로 최대한 떨어지게 부여
LDA - 분류들 사이의 거리 즉 한 분류에 속하는 벡터들의 무게 중심과 다른 부류에 속하는 벡터들의 무게중심 사이의 거리를 최대화
LDA를 수행하려면 LDA 알고리즘에 분류명이 붙은 견본들을 제공해서 우리가 모형화하고자하는 주제를 알려줘야한다. ( 스팸 1 / 비스팸 0 )
Data Load
# data load
import pandas as pd
from nlpia.data.loaders import get_data
sms = get_data("sms-spam")
sms.head()
index = ['sms{}{}'.format(i,'!'*j)
for (i,j) in zip(range(len(sms)), sms.spam)]
sms.index = index
sms -> TF-IDF Vectorize
# tf-idf docs
from sklearn.feature_extraction.text import TfidfVectorizer
from nltk.tokenize.casual import casual_tokenize
tfidf = TfidfVectorizer(tokenizer=casual_tokenize)
tfidf_docs = tfidf.fit_transform(raw_documents=sms.text).toarray()
tfidf_docs = pd.DataFrame(tfidf_docs)
LDA predict
LDA 오차 0% , predict를 tfidf_docs를 집어 넣었으므로 오차가 0인것에 대해 대단한 결과가 아니다.
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
lda = LDA(n_components=1)
lda = lda.fit(tfidf_docs,sms.spam)
sms['lda_spaminess'] = lda.predict(tfidf_docs)
((sms.spam - sms.lda_spaminess) ** 2 ).sum() ** .5 # 0.0 오차 0 정확히 분류
(sms.spam == sms.lda_spaminess).sum() # 4837
len(sms) # 4837
LDA cross val score
정확도 0.77로 좋은 모형이 아니다. cross_val_score의 이 수치가 맞는지 train : test = 2 : 1의 비율로 정확도 측정
from sklearn.model_selection import cross_val_score
lad = LDA(n_components=1)
scores = cross_val_score(lda,tfidf_docs,sms.spam,cv=5)
# 'Accuracy:0.77 (+/-0.02)'
정확도 측정
정확도에 대한 차이가 없고 더 낮았다.
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(tfidf_docs,sms.spam,test_size=0.33)
lda = LDA(n_components=1)
lda.fit(X_train,y_train)
lda.score(X_test,y_test).round(3) # 0.741
LSA+LDA
PCA 진행 후 LDA 결과 74 -> 95.7의 성능으로 높은 결과가 나왔다.
from sklearn.decomposition import PCA
pca = PCA(n_components=16)
pca.fit(tfidf_docs)
pca_topic_vectors = pca.transform(tfidf_docs)
columns = ['topic{}'.format(i) for i in range(pca.n_components)]
pca_topic_vectors = pd.DataFrame(pca_topic_vectors,columns=columns,index=index)
X_train, X_test, y_train, y_test = train_test_split(pca_topic_vectors.values,sms.spam,test_size=0.3)
lda = LDA(n_components=1)
lda.fit(X_train,y_train)
lda.score(X_test,y_test).round(3) # 0.962
lda = LDA(n_components=1)
scores = cross_val_score(lad,pca_topic_vectors,sms.spam,cv=10)
#'Accuracy:0.957 (+/-0.022)'
반응형
'Natural Language Processing' 카테고리의 다른 글
Word2Vec 활용 (0) | 2021.02.28 |
---|---|
의미 기반 검색(semantic search) (0) | 2021.02.23 |
LSA 거리와 유사도 (0) | 2021.02.21 |
[Transformer] Multi-Head Attention (1) (0) | 2021.02.20 |
잠재 디클레 할당 (LDiA, Latent Dirichlet Allocation) (0) | 2021.02.17 |