2주차 강의 내용은 두 파트로 나뉨
(0. 크롤링 추가 내용)
1. 워드클라우드 만들기(크롤링 보충, 형태소 분석, 불용어 제거)
2. 머신러닝 기초
0. 크롤링 추가 내용
만약 soup.select( )를 진행하는데 선택자에 nth_child 코드가 있다면 nth_of_type으로 수정할 것
용도는 같으나 전자가 colab에서 오류가 뜨기 쉽기 때문
단, 두 코드 모두 뒤에 딸려오는 숫자가 있는데 선택자가 바뀌었기 때문에 우리가 원하는 정보가 리스트 안에 들어있는 위치가 바뀔 수도 있음
공식은 없고 실제로 숫자를 일일이 조정해가면서 원하는 데이터가 출력될 수 있도록 수정해야 함
1. 워드클라우드 만들기
0) Colab 한국어 패치
한글 세팅코드 입력->셀 실행->런 타임 다시 시작->셀 재실행
1) 데이터프레임 정리하기
df=pd.read_table('자료 이름', sep' , ')
*sep: seperator, 즉 어떤 문자를 기준으로 자료의 행, 열을 나눌 것인지를 의미
df.isnull( ) : 자료에 비어있는 행이 있는지 검사. true/false로 출력
print(df.isnull( ) .sum( )) : 비어있는 행의 숫자를 출력
df['열 이름'].unique( ) : 중복된 요소를 전부 제외하고 표시
df['열 이름'].nunique( ) : 중복되지 않은 요소를 개수로 표시
df.drop_duplicates(subset=[열 이름], inplace=True) : 데이터에서 중복된 요소 제거. inplace는 수정본을 원본에 덮어씌울 것인지 여부. True면 덮어씌운다, False면 원본을 유지한다
df['열 이름'].value_counts( ) : 열에 요소로 들어있는 항목들의 개수를 표현
*ex) '선호 음식' 열에서 한식 4명, 중식 4명, 일식 2명, 양식 5명
~.plot(kind='bar') : ~ 파일을 시각화. kind가 그래프 종류. bar 이므로 막대그래프로 표현하겠다는 의미
2) 토큰화: 형태소 분석
토큰화란?
어떤 글을 문장 미만의 단위로 쪼개는 것. 리스트 형태로 출력됨
형태소 분석: 형태소 단위 토큰화. konply 패키지 사용
stop words : 불용화 코드. 조사 등 필요 없는 단어 제거
df['열 이름'].apply(tokenizer.nouns) : 토큰화 진행
리스트 컴프리헨션: 말 그대로 리스트를 이해시키기. 리스트에서 어떤 요소를 선택할 것인지 설정하는 단계
item for item in test_list if len(item)>1 : 해당 형태소 리스트에서 글자수가 1보다 큰 것만을 아이템이라고 하겠다
item for item in test_list if item not in remove_word_list : 제거할 단어 목록에 있지 않은 것만을 아이템이라고 하겠다
불용어 제거: 분석 가치가 적어 제거하기로 결정한 단어 제거하기
lamdaX:X.작업코드 : 어떤 행을 X라고 하고 그 행에 작업코드에 해당하는 작업을 하겠다는 의미. extend, append, 등 여러가지가 들어갈 수 있음
3) 분야 별 빈도수 출력하기
df[df['열 이름']=='카테고리 이름'] : 카테고리 별로 묶기
df[df['열 이름']=='카테고리 이름']['tokenized'].values : 윗 단계에서 카테고리 별로 묶었지만 사실 행들로 나뉘어 있음. 이 행들을 해체해서 하나의 리스트로 합치는 것
import numpy as np
새로운 인스턴스 이름 = np.hstack(df[df['열 이름']=='카테고리 이름']['tokenized'].values) : 윗 단계를 진행한 결과 현재 리스트의 리스트 상태. 이거를 요소들의 리스트로 변환하는 과정
print(len(새로운 인스턴스 이름)) : 총 단어 개수 확인
from collections import counter
새로운인스턴스이름_count = counter(새로운 인스턴스 이름) : 단어 별 빈도수 출력
새로운인스턴스이름_count = counter(새로운 인스턴스 이름.most_common(n)) : 단어 별 빈도 수 가장 높은 것 n개만 출력
4) 워드클라우드 만들기
from wordcloud import WordCloud
temp_data = ' '.join(새로운 인스턴스 이름) : 리스트들끼리 연결. ' ' 부분은 무엇으로 리스트를 연결할 것인지를 의미. 띄어쓰기, 쉼표, 등 다 가능은 함
이후 워드클라우드 포맷 사용
2. 머신러닝 기초
1) 단어의 벡터화
벡터화란?
기계는 단어를 이해할 수 없음. 따라서 문장의 단어들을 특정 규칙에 따라 숫자를 부여하고 숫자에 따라 상대적 관계성을 부여해야 기계가 단어들을 해석할 수 있게 됨
train_data : 학습 자체에 사용되는 데이터
test_data : 학습에는 이용되지 않고 완성된 모델을 검증하는 데에만 이용되는 데이터
train_test_split : 만약 train_data와 test_data가 따로 준비되어 있지 않고 하나의 데이터만 있을 때 그거를 두 개로 나눠주는 코드
이후 train_data에 해당하는 Y변수와 X변수, test_data에 해당하는 Y변수와 X변수를 따로 나누어서 자료의 각 열을 배정해야 함. 장르 구분 머신러닝 모형 예시에서 Y변수는 항목이므로 숫자로만 치환에도 충분. X변수는 시놉시스이므로 벡터화를 진행해줘야 함
DTM: 벡터화 방법 중 하나. 각 단어 별로 해당 자료에서 등장하는 횟수를 바탕으로 숫자 부여. 단, 영어에서 이 방법으로 벡터화를 쓸 경우 a, the와 같은 여러 관사들의 빈도수가 높게 측정되어 상관도 없는 시놉시스들이 높은 유사도로 측정될 수 있음
TF-IDF: DTM에 연계하여 기존 문제를 해결한 벡터화 방법. 덜 등장하는 단어일수록 높은 가중치를 부여함.
.transform( ) : 벡터를 저장하지 않는 벡터화. 즉 출력된 값을 기억할 필요가 없고 그 값이 확인 용도에 불과할 때 사용. test_data가 보통 이에 해당
.fit_transform( ) : 벡터를 저장하는 벡터화. 출력된 값을 학습해야 하는 train_data의 벡터화에 사용
2) 학습 진행
나이브 베이즈 분류기 : 베이즈 정리 이용하여 가장 높은 확률에 해당하는 결과를 출력. 확률만 계산하면 되므로 다른 두 방법에 비해 시간 적게 소요
Logistic 회귀분석: 도출된 값들의 총합을 1로 유지하는 softmax 함수를 이용. 모형 도출값과 test_data의 실제값을 비교하여 그 오차가 줄을 때까지 연산을 반복하는 방식으로 진행하는 최적화 방식의 학습. 최고의 결과까지 얼마나 많은 반복이 필요할지 알 수 없으므로 반복 횟수를 직접 지정할 수 있음
Support Vector Machine : 벡터들을 평면에 흩뿌려놓고 그 위에 경계선 긁기. 최고로 정확도가 높은 경계선이 나올 때까지 반복하는 방식
3) 정확도 확인
accuracy_score : 테스트 결과와 일치하는 경우 정확도를 높이고 불일치하는 경우 정확도를 낮춤
+) 불용어 제거
벡터화를 시키기 전에 sk learn와 count vectorize를 이용하여 불용어를 제거하고 작업할 수도 있음. 그러나 불용화를 한다고 해서 무조건 정확도가 상승하는 것은 아니며, 자료에 따라, 학습 진행 방식에 따라 정확도 변동폭이 상이함
1주차 내용을 정리할 때는 최대한 배웠던 모든 내용을 정리하려고 했으나 SQL 강의와 달리 데이터 분석 강의의 경우 한번의 시청으로 학습을 끝내기에는 암기량이 많고 복습을 전제로 깔고 학습하는 수밖에 없겠다는 것을 느낌
그러나 현재 일상 업무가 벅차 학습을 병행하면서 복습까지 하기에는 시간제약이 있어 추후 한 번 더 강의를 본다는 것을 전제로 1회차 시청은 전반적인 흐름을 파악하는 것에 집중하기로 함
따라서 이번 정리부터는 정리 내용에 생략된 부분이 어느 정도 있을 예정