Programming & Machine Learning/Python X 머신러닝

Python으로 Custom Sparse Matrix 생성하기

Yamarae 2018. 12. 8. 17:28



파이썬은 sparse-matrix를 만들기 위한 훌륭한 라이브러리들을 가지고 있다. one-hot encoding 역시 코드 1~2줄이면 간단하게 사용이 가능하다. 하지만 추천 시스템과 같이 대용량의 sparse-matrix를 처리하거나, Factorization Machine 같은 알고리즘을 사용하는 경우, scikit-learn이나 pandas가 제공하는 dummy encoder 만으로는 부족한 경우가 많다. 모델의 Input 타입이 idx:value 와 같은 text file로 구성되어 있는 경우에 해당한다.


추천 시스템의 경우는 대부분 extreme-sparse matrix를 생성하기 때문에, 학습의 batch시에 hashing으로 idx:value를 지정해 주는 것이 일반적이다. 이렇게 구조를 만들어주면 hash함수만 관리해주면 인코딩의 사이즈가 얼마만큼 늘어나던지 큰 상관이 없다.


본 포스팅에서는 hash를 이용해 idx:value를 인코딩 해주는 것과 동일한 원리로, Python dictionary type을 이용하여 Custom Sparse Matrix를 생성하는 예제를 설명하도록 하겠다. hash encoding보다 다소 복잡하고 손이 가는 작업이지만, sparse matrix 혹은 FM에 사용되는 데이터셋을 직접 만들고 눈으로 확인하는 공부를 하기 위해 예제를 공부하길 추천한다. 이번 예제 역시 타이타닉 예제를 활용했다.



전체 코드 링크





1. 타이타닉 데이터셋 준비


우선 타이타닉 데이터셋에서 연습을 위한 몇 가지 column만 추출한다. 자잘한 과정들은 생략하였다.



이렇게 데이터셋을 준비하면, discretize된 pclass, age, sibsp, parch, fare 피처와 binary 피처인 is_female, 그리고 y 라벨만 남겨진다.





2. Categorical value 인코딩


다음으로 discretize하게 만들어놓은 피처들을 인코딩한다. 이렇게 인코딩하는 이유는, 10개의 categorical 피처의 경우 1~10 까지의 정수로 표현하기 위함이다. 0~9까지로 표현해도 상관 없지만, 뒤에 나올 indexer와 맞춰주기 위해 1부터 시작하는 인코딩을 해준다.



결과를 출력해보면, 1~n 사이의 값으로 잘 인코딩된 것을 확인할 수 있다.






3. Make Sparse Dataset


이제 y 부분을 제외한 나머지 부분만을 Sparse Dataframe으로 만들어보자. 우선 다음과 같이 데이터를 분리해주자.



그리고 이제 진짜 로직을 넣어줄 차례이다. 다소 수고스럽겠지만, 각 피처마다의 categorical한 숫자를 dictionary 형태로 입력해주자. 그리고 0부터 시작하는 cummulative dict를 병렬로 만들어준다. 이렇게 하는 이유는, 각 피처마다 할당되는 index를 점프시켜주기 위함이다. 이해가 되지 않는다면 직접 타이핑해서 출력해보자. 매우 쉽다.



그리고 나서 output sparse matrix와 동일한 사이즈의 빈 매트릭스를 만들어준다. 그리고 dict를 참조해가며 idx:value를 채워주면 끝이다.






4. 결과 확인


결과를 확인하기 위해 동일한 방식으로, column에도 one-hot encoding 처럼 이름을 붙여준다.



그리고 나서 최종 결과를 확인하자.






이를 FM과 같은 알고리즘에 실제로 활용하는 방법은, 이전 포스팅 [Recommender System] - Factorization Machine 리뷰 + code 혹은 github 링크를 참고하길 바란다.