[2주차_데이터분석] 개발일지 (영화 줄거리로 장르 분류하기-2 데이터전처리 )

Coastby·2022년 7월 5일
0
post-custom-banner

[영화 줄거리로 장르 분류하기]
1. 머신러닝이란?
2. 👉데이터 전처리👈
3. 벡터화
4. 머신러닝
5. 모델 사용하기 및 불용어 제거

[목록]

  • 벡터화의 의미
  • IMDb 데이터 다운/탐색하기
  • 데이터 전처리

2. 데이터 전처리

○ 벡터화의 의미

벡터화를 시킨 줄거리를 토대로 기계한테 해달 줄거리는 어떤 특정한 장르에 속한다고 지속적으로 학습을 시키는 것이다. 그렇게 학습시킨 결과가 모델 (model)이다. 기계는 글자를 바로 이해하지 못하므로 입력 받기 위해서는 숫자로 치환하는 벡터화 (vectorization)이 필요하다.

Embedding Projector
https://projector.tensorflow.org/


3차원 공간에 표시되는 점들은 특정 단어에 해당한다. 특정 단어가 저 공간 중 어디에 위치하는 지 '벡터'로 표시한다. 기계는 공간 사이의 거리를 보고 가까울 수록 유사한 단어라고 생각하고, 멀 수록 유사하지 않은 단어라고 생각한다.
이를 토대로 기계도 숫자만으로 해당 단어의 의미(상대적 관계)를 이해할 수 있게 된다.

텍스트 분류 (Text Classification)

이번에 사용될 내용은 텍스트 분류이다. '스팸 메일 자동 분류', '사용자의 리뷰로부터 긍정, 부정 판단', '뉴스 카테고리 분류' 등이 있다.

  • 클래스가 2개인 경우를 Binary Classificaiton
  • 클래스가 3개 이상인 경우를 Multiclass Classification

이라고 한다. 줄거리로 장르 분류하기는 다중 클래스 분류 (Multiclass Classification)에 속한다.


○ IMDb 데이터 다운/탐색하기

사용할 데이터 설명

이전의 네이버 줄거리 데이터는 개수가 많지 않아서 훈련 데이터로 쓰면 예측 모델의 정확도가 떨어질 수 있다. 그래서 이미 데이터 수집이 되어있는 IMDb 줄거리 데이터 (10만건 이상)를 이용한다.

IMDb : 인터넷 영화 데이터베이스(Internet Movie Database)
영화, 배우, 텔레비전 드라마, 비디오 게임 등에 관한 정보를 제공하는 온라인 데이터베이스이다.

데이터 파일은 2가지가 있는데 이는 학습한 모델을 평가하기 위해서 구분된다.

  • 훈련 데이터는 기계에 일정한 내용을 학습시키기 위한 데이터
  • 테이스 데이터는 줄거리만 주고 장르를 예측해보라고 주기 위한 데이터. 해당 줄거리의 장르를 맞추면 정확도가 상승하고, 그렇지 않으면 정확도는 하락한다.
    즉, 훈련 데이터는 이미 답이 거쳐갔으니, 아예 답을 모르는 테스트 데이터를 이용해서 평가하기 위해 둘을 구분한다.

데이터 불러오기

  • 다운받은 csv 파일을 코랩에 업로드한다.
  • 파일을 데이터프레임로 불러온다.
import pandas as pd
# sep=":::" 을 이용해서, 열 구분을 ::: 로 해서 불러오라고 말해준다.
train = pd.read_table('train_data.txt', sep=":::", names=['Index', 'Title', 'Genre', 'Content'])
test = pd.read_table('test_data_solution.txt', sep=":::", names=['Index', 'Title', 'Genre', 'Content'])
  • 데이터프레임 정보를 확인한다.
train.info()
test.info()

#Result
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 54214 entries, 0 to 54213
Data columns (total 4 columns):
 #   Column   Non-Null Count  Dtype 
---  ------   --------------  ----- 
 0   Index    54214 non-null  int64 
 1   Title    54214 non-null  object
 2   Genre    54214 non-null  object
 3   Content  54214 non-null  object
dtypes: int64(1), object(3)
memory usage: 1.7+ MB
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 54200 entries, 0 to 54199
Data columns (total 4 columns):
 #   Column   Non-Null Count  Dtype 
---  ------   --------------  ----- 
 0   Index    54200 non-null  int64 
 1   Title    54200 non-null  object
 2   Genre    54200 non-null  object
 3   Content  54200 non-null  object
dtypes: int64(1), object(3)
memory usage: 1.7+ MB
  • 어떤 장르가 있는지 확인한다.
train['Genre'].unique()

#Result
array([' drama ', ' thriller ', ' adult ', ' documentary ', ' comedy ',
       ' crime ', ' reality-tv ', ' horror ', ' sport ', ' animation ',
       ' action ', ' fantasy ', ' short ', ' sci-fi ', ' music ',
       ' adventure ', ' talk-show ', ' western ', ' family ', ' mystery ',
       ' history ', ' news ', ' biography ', ' romance ', ' game-show ',
       ' musical ', ' war '], dtype=object)

○ 데이터 전처리

줄거리를 통해서 장르를 예측한다. 따라서 줄거리가 독립변수 (x)이고, 장르가 종속변수 (y)가 된다.

  • 줄거리와 장르를 분리해준다.
y_train = train['Genre'] # 훈련 데이터의 장르 부분을 y_train 이라는 이름으로 저장
x_train = train['Content'] # 훈련 데이터의 줄거리 부분을 x_train 이라는 이름으로 저장
y_test = test['Genre'] # 테스트 데이터의 장르 부분을 y_test 이라는 이름으로 저장
x_test = test['Content'] # 테스트 데이터의 장르 부분을 x_test 이라는 이름으로 저장

판다스에서 열 1개 추출하기

# series  형태로 추출
데이터프레임이름['열의이름']
# DataFrame 형태로 추출
데이터프레임이름[['A']]

https://digital-play.tistory.com/31 : Pandas series에 대한 설명

컴퓨터는 단어를 바로 이해하지 못하므로 줄거리와 장르를 모두 숫자나 벡터 형태로 변형시켜준다.
장르는 자체의 의미나 장르 간의 관계가 중요하지 않아서 고유 숫자로 대치시킨다.
줄거리는 후에 벡터화를 진행한다.

  • 장르별 고유 숫자 부여
mapping = {' drama ':1, ' thriller ':2, ' adult ':3, ' documentary ':4, ' comedy ':5,
       ' crime ':6, ' reality-tv ':7, ' horror ':8, ' sport ':9, ' animation ':10,
       ' action ':11, ' fantasy ':12, ' short ':13, ' sci-fi ':14, ' music ':15,
       ' adventure ':16, ' talk-show ':17, ' western ':18, ' family ':19, ' mystery ':20,
       ' history ':21, ' news ':22, ' biography ':23, ' romance ':24, ' game-show ':25,
       ' musical ':26, ' war ':27}
       
#장르는 동일하게 적용되어서 동일하게 숫자 부여
y_train = y_train.replace(mapping)
y_test = y_test.replace(mapping)

다시 y_train을 출력해보자.

y_train.head(3)

#Result
0    1
1    2
2    3
Name: 2, dtype: int64

그럼 장르는 숫자로 치환이 되었고, 줄거리를 벡터화를 해야한다.

✋ 혹시 y_test에서 치환이 되지 않은 것이 없는 지 알아보려고 두가지로 확인을 해보았다. 분류가 많지 않아서 아래 코드 두개로 확인은 되지만 y값이 많아진다면 어려울 것이다. 적절한 방법은 아직 찾지 못했다..

y_test.drop_duplicates()
y_test.sort_values()
profile
훈이야 화이팅
post-custom-banner

0개의 댓글