import re
train_df = train_df.fillna(' ')
# \d+ - 1개 이상 숫자가 나오면 공백으로 변경
train_df['document'] = train_df['document'].apply(lambda x : re.sub(r"\d+", " ", x))
test_df = test_df.fillna(' ')
test_df['document'] = test_df['document'].apply(lambda x :re.sub(r"\d+", " ", x))
#칼럼 삭제
train_df.drop('id', axis=1, inplace =True)
test_df.drop('id', axis=1, inplace=True)
2. 형태소 분석(TfidfVectorizer)
Tfiidfvectorizer
매개변수
[In]
from sklearn.feature_extraction.text import TfidfVectorizer
#TfidfVectorizer() 매개변수
#ngram_range = (1,2) : go back, go home / ngram_range = (1,1) : go, back, home
#min_df=3 : 최소빈도값을 설정, df = 문서의 수
#max_df = 0.9, 90%이상 나타나는 단어는 무시하겠다(10개 문장에서 9번 이상 나오는 단어는 무시)
#Term Frequency(TF), Document Frequency(IDF score), TF-IDF score
tfidf_vect = TfidfVectorizer(tokenizer=tw_tokenizer, ngram_range=(1,2), min_df=3, max_df= 0.9)
#TfidfVectorizer.fit(text)를 통해 text가 가지고 있는 모든 단어를 BoW로 구성하고,
#이 단어들에 대해 Tf-idf 값을 계산한 뒤 각 단어의 인덱스 위치에 Tf-idf 값이 들어간 벡터가 만들어짐
tfidf_vect.fit(train_df['document'])
#fit_transform 메서드를 이용하면 문서 단어 행렬을 만들어줌
tfidf_vect_matrix_train = tfidf_vect.transform(train_df['document'])
print(tfidf_vect_matrix_train.shape)
Fitting 3 folds for each of 5 candidates, totalling 15 fits
{'C': 3.5} 0.8593
[In]
from sklearn.metrics import accuracy_score
# 학습 데이터를 적용한 TfidfVectorizer를 이용
# 테스트 데이터를 TF-IDF 값으로 Feature 변환
tfidf_matrix_test = tfidf_vect.transform(test_df['document'])
# 최적 파라미터로 학습된 classifier를 그대로 이용
best_estimator = grid_cv.best_estimator_
preds = best_estimator.predict(tfidf_matrix_test)
print('Logistic Regression 정확도: ', accuracy_score(test_df['label'], preds) )
[Out]
Logistic Regression 정확도: 0.86188
[In]
result = pd.DataFrame({
"document" : test_df['document'],
"test" : test_df['label'],
"pred" : preds
})
result
[out]
4. 새로운 데이터로 모델 성능 확인
[In]
text = '최고의 액션 영화입니다'
if best_estimator.predict(tfidf_vect.transform([text])) == 0:
print(f'"{text}" -> 부정일 가능성이{round(best_estimator.predict_proba(tfidf_vect.transform([text]))[0][0],2)*100}% 입니다.')
else:
print(f'"{text}" -> 긍정일 가능성이{round(best_estimator.predict_proba(tfidf_vect.transform([text]))[0][1],2)*100}% 입니다.')