20개 뉴스 그룹 data에 대한 이해¶
In [16]:
import pandas as pd
from sklearn.datasets import fetch_20newsgroups
# %matplotlib inline : ipython에서 함수 결과값을 inline 웹브라우저상 안에서 보여주는 code
import matplotlib.pyplot as plt
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.utils import to_categorical
news = fetch_20newsgroups(subset='train') # train을 기재하면 훈련데이터만 리턴
In [21]:
print(news.keys())
In [19]:
print('훈련용 샘플의 갯수 : {}'.format(len(news.target)))
print('총 주제의 개수 : {}'.format(len(news.target_names)))
print('총 주제의 list : {}'.format(news.target_names))
목적 : test_data에서 이메일 본문을 보고 20개의 주제 중 어떤 주제인지를 맞추는 것이다.
In [38]:
print('0번째의 주제 : ',news.target_names[0])
print('0번째의 주제의 index : ',news.target[0])
print('0번째의 내용 : \n\n',news.data[0])
In [40]:
# 새로운 dataframe 생성 후 재배열
data = pd.DataFrame(news.data, columns=['email'])
data['target'] = pd.Series(news.target)
data.head()
Out[40]:
In [43]:
# data.isnull() 은 dataframe에서 혹시 null값이 있는지 있다면 True를 return
# any() 는 어느 하나라도 True가 존재한다면 True를 내뱉는다.
print(data.isnull().any())
nunique() : 중복을 제외한다.
In [46]:
print('중복을 제외한 샘플의 수 : {}'.format(data['email'].nunique()))
print('중복을 제외한 주제의 수 : {}'.format(data['target'].nunique()))
In [57]:
print(type(data['target']))
data['target'].value_counts().plot(kind='bar')
Out[57]:
In [69]:
# groupby 는 index로 묶은 후 이를 list화 시킨다. ex) 1 : [1,2,3,4]
# size는 target으로 groupby 로 묶은 target에 해당하는 부분 list의 길이를 알려준다.
# reset_index는 index를 새로 설정해준 것이다.
print(data.groupby('target').size().reset_index(name='count'))
In [70]:
newsdata_test = fetch_20newsgroups(subset='test', shuffle=True) # 'test'를 기재하면 테스트 데이터만 리턴한다.
train_email = data['email'] # 훈련 데이터의 본문 저장
train_label = data['target'] # 훈련 데이터의 레이블 저장
test_email = newsdata_test.data # 테스트 데이터의 본문 저장
test_label = newsdata_test.target # 테스트 데이터의 레이블 저장
tokenizer로 전처리 실행¶
In [75]:
max_words = 10000 # 실습에 사용할 단어의 최대 갯수
num_classes = 20 # 레이블의 수
# mode는 count, binary, tfidf, freq 중 하나를 고르는 것이다.
# data 전처리에서 어떤 mode를 하느냐에 따라 달라짐.
def prepare_data(train_data, test_data, mode):
t=Tokenizer(num_words = max_words)
t.fit_on_texts(train_data) # train_data에 맞춰서 word_index 만들어두기
X_train = t.texts_to_matrix(train_data, mode=mode)
X_test = t.texts_to_matrix(test_data, mode=mode)
return X_train, X_test, t.index_word
In [80]:
X_train, X_test, index_to_word = prepare_data(train_email, test_email, 'binary')
y_train = to_categorical(train_label, num_classes)
y_test=to_categorical(test_label, num_classes)
# print(train_email)
In [81]:
print('훈련 샘플 본문의 크기 : {}'.format(X_train.shape))
print('훈련 샘플 레이블의 크기 : {}'.format(y_train.shape))
print('테스트 샘플 본문의 크기 : {}'.format(X_test.shape))
print('테스트 샘플 레이블의 크기 : {}'.format(y_test.shape))
In [82]:
print('빈도수 상위 1번 단어 : {}'.format(index_to_word[1]))
print('빈도수 상위 9999번 단어 : {}'.format(index_to_word[9999]))
MLP (Multilayer Perceptron) 사용하여 텍스트 분류하기¶
In [83]:
from tensorflow.keras.layers import Dense, Dropout
from tensorflow.keras.models import Sequential
def fit_and_evaluate(X_train, y_train, X_test, y_test):
model = Sequential()
model.add(Dense(256, input_shape=(max_words,), activation='relu')) # max_words는 x_train의 1행의 길이이다.
model.add(Dropout(0.5))
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))
# 다중클래스 분류
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X_train, y_train, batch_size=128, epochs=5, verbose=1, validation_split=0.1)
score = model.evaluate(X_test, y_test, batch_size=128, verbose=0)
return score[1]
In [84]:
modes = ['binary', 'count', 'tfidf', 'freq'] # 4개의 모드를 리스트에 저장.
for mode in modes: # 4개의 모드에 대해서 각각 아래의 작업을 반복한다.
X_train, X_test, _ = prepare_data(train_email, test_email, mode) # 모드에 따라서 데이터를 전처리
score = fit_and_evaluate(X_train, y_train, X_test, y_test) # 모델을 훈련하고 평가.
print(mode+' 모드의 테스트 정확도:', score)
'AI' 카테고리의 다른 글
DL : RNN : LSTM (Long-Short-Term Memory) (0) | 2020.03.10 |
---|---|
DL : RNN (Recurrent Neural Network) (0) | 2020.03.10 |
DL : Keras : Sequential vs Functional API (0) | 2020.03.10 |
DL : Keras texts_to_matrix 이해하기 (0) | 2020.03.10 |
DL : Keres 기초 (0) | 2020.03.10 |
댓글