데이터분석 개발일지(스파르타코딩)

스파르타코딩 데이터분석 개발일지2

rainsky 2022. 8. 22. 18:34

2022.08.22

 

텍스트 마이닝

텍스트 마이닝에 대해 배웠다.

자연어 처리 쪽을 더욱 공부해보고 싶었는데 이번 기회에 자세히 알 수 있어서 좋았다.

 

워드 클라우드를 만들어주고 분류 예측까지 배웠다.

 

워드클라우드를 하기 전에 중복된 데이터들을 제거해주자.

df.drop_duplicates(subset=['중복 제거를 진행할 열'], inplace=True)
inplace=True를 넣어주면 df 데이터프레임의 원본 데이터 자체가 중복 값이 제거된 상태로 변한다.

 

 

토큰화

토큰화 방법은 다양하다. 명사, 띄어쓰기 등등

!pip install konlpy
from konlpy.tag import Okt
tokenizer = Okt()
tokenizer.nouns(kor_text) #nouns은 명사만 뽑아내겠다.

토큰화하여 명사를 뽑아냈다.  예전에 데이터 대회에 참여했을 때는 다양한 토큰화를 함께 다 넣어서 진행했었다.

토큰화를 다양하게 시도해보고 여러 가지를 함께 토큰 해보면 더 정확한 값이 도출될 듯하다.

 

 

apply

데이터 프레임에서 행 각각마다 토큰화를 진행해주기 위해서는 apply를 사용해준다.

apply를 사용해주면 각각마다 진행된다.

df['tokenized'] = df['열'].apply(tokenizer.nouns)

 

 

불용어 제거

특정 단어를 제거하는 방법:  리스트 컴프리헨션을 이용하여 제거해준다.

자신이 제거하고 싶은 단어를 stop_words에 리스트 형태로 넣어준다.

단어의 길이가 1보다 크고, stop_words에 포함되지 않는 것들만 추출해준다.

df['tokenized'] = df['tokenized'].apply(lambda x: [item for item in x if item not in stop_words and len(item) > 1])

lambda를 사용해 이행을 x라고 지칭해준다.

 

 

hstack

각각 나눠져 있는 리스트들을 하나의 리스트로 만들어준다.

np.hstack(df[df['열']=='특정 데이터']['tokenized'].values) # 카테고리 별로 묶어 hstack을 진행해줬다.

hstack은 생소하여 배울 때 더 재밌었다.

 

 

Counter

단어별 빈도수를 세준다.

카운트한 결과에 .most_common(특정 숫자)을 사용하면 순위로 인식해서 빈도수가 많은 순서대로 특정 숫자 등수까지 출력해준다.

from collections import Counter
Counter(리스트)

 

 

워드 클라우드

이제 이걸 가지고 워드 클라우드를 만들었다.

from wordcloud import WordCloud

 

여기서 주의할 점!

리스트로는 워트 클라우드를 만들기 어렵고, 하나의 문자열로 이루어져 있어야 워드 클라우드를 만들 수 있다.

이때 join을 사용해준다.

 

join

','.join(리스트)

따옴표 안에 무엇을 넣느냐에 따라 연결되는 부분이 달라진다.

 

 

워드 클라우드를 나타내기 위해 사용한 코드이다.

plt.figure(figsize = (15,15))

wc = WordCloud(max_words = 사용할 단어의 수 , width = 가로, height = 세로, font_path = fontpath).generate('입력 문자열')

plt.imshow(wc, interpolation = 'bilinear')

워드 클라우드는 어떻게 코드를 짜는지 궁금했는데 알게 돼서 좋다. 꼭 기억해야겠다.

 

 

분류 예측

분류 예측을 위해서는 벡터화를 해줘야 한다.

벡터화: 단어를 숫자로 치환한다고 생각하자!

from sklearn.feature_extraction.text import CountVectorizer
vector = CountVectorizer() # DTM 벡터화를 위한 객체 생성
x_train_dtm = vector.fit_transform(x_train) # 해당 단어들을 벡터화 진행
DTM을 통해 각 문서들의 유사도를 구할 수 있다.
 
 
여기서 그치지않고 단어별 중요도를 반영해줘야한다.(가중치)
from sklearn.feature_extraction.text import TfidfTransformer
tfidf_transformer = TfidfTransformer() # tfidf 벡터화를 위한 객체 생성
tfidfv = tfidf_transformer.fit_transform(x_train_dtm) # x_train_dtm에 대해서 벡터화 진행

 

주의할 점!

fit_transform()은 훈련 데이터에 쓰인다.

transform()은 테스트 데이터에 쓰인다.

테스트 데이터를 사용하여 학습을 진행해서는 안되기 때문이다.

 

모델

여러 모델들을 써보며 가장 최적화된 모델을 구하자. MultinomialNB 모델, LogisticRegression 모델, LinearSVC 모델 등등

lr = LogisticRegression(C=10000, penalty='l2')
lr.fit(tfidfv, y_train)

predicted = lr.predict(tfidfv_test)
print('정확도: ', accuracy_score(y_test, predicted))

정확도를 구해 좋은 모델인지 판단한다.

 

C와 penalty는 어떻게 설정해주는지 궁금했는데 4주 차에 알려주신다고 한다. 너무 궁금해서 빨리 알고 싶었는데.. 빨리 4주 차가 됐으면 좋겠다.

아 그리고 위에 두줄을 실행해보면 stop이라고 적혀있는 오류가 뜬다. 이는 더 오차를 줄일 수 있는데 학습량이 부족하다는 뜻이다. 이를 해결할 방법도 4주 차에 알려주신다고 한다.

 

 

훈련/ 테스트 데이터로 나눠주기에서의 이해과정

강사님이 자세히 가르쳐주셔서 이해하며 지금까지 잘 따라갈 수 있었다.

그런데 중간에 이해 안 되는 부분이 있었다. 바로, 훈련/ 테스트 데이터로 나눠주는 부분이 이해가 안 갔다.

from sklearn.model_selection import train_test_split
train_test_split(예측에 사용할 데이터, 예측할 데이터, test_size = 원하는 테스트 데이터 셋의 크기)

test_size를 0.3이라고 하면, 지금 있는 전체 데이터 중에 70% 는 훈련 데이터에 담기고, 30% 는 테스트 데이터에 담기게 된다.

여기까지는 이해가 갔지만 훈련/테스트 데이터로 나눠주었을 때 x_train, x_test, y_train, y_test에서 왜 test 셋이 아닌 train 셋의 y_test에 예측을 해주는 것인지 의문이 들었다. 또, y_test에는 이미 값이 존재하는데 그걸 어떻게 예측한다는 것인지 의문투성이였다.

 

그 부분을 계속 고민하고 학교에서 배운 것과 지금까지 질문했던 것들과 이번 수업에서 다룬 내용들을 자세히 찾아보니 이해할 수 있었다.

 

y_test에 예측을 한다기보다는 x_train, y_train을 통해 나온 학습과정을 토대로 x_test를 예측해 나온 값을 y_test와 비교하여 얼마나 예측을 잘하였는지 확률로써 나타낸 것이었다. train 셋에서 훈련과 테스트를 함께 한 것이다.

x는 feature, y는 target으로 생각해주면 될 것 같다.

그래서 만약 예측을 잘하였다면 그 모델을 가지고 최종적으로 test에 예측을 해주는 것이다.

예전에 학교에서 배운 교육과 이번 수업을 통해서 완전히 이해하게 됐다.

 

이번 주 수업도 다 이해를 하며 끝낼 수 있어서 다행이다. 

개발일지를 적다 보니 정리가 되는 거 같아서 기억하고 찾기가 쉬워졌다.

이번 2주 차도 많은 배움을 습득해서 좋다.