확장성(scalability) : 큰 행렬 계산은 여러모로 쉽지 않음
하지만 아이템 기반으로 가면 계산량이 줄어듬
Spark을 사용하면 큰 행렬 계산도 얼마든지 가능
부족한 데이터(sparse data)
많은 사용자들이 충분한 수의 리뷰를 남기지 않음
해결책 -> 모델기반 협업 필터링
머신러닝 기술을 사용해 평점을 예측. 입력은 사용자-아이템 평점 행렬
행렬분해(Matrix Factorization) 방식
딥러닝 방식
차원을 축소(Dimensionality Reduction)하되 원래 의미는 최대한 그대로 간직
예) 사용자의 선호도를 특징을 찾아 장르로 변환
모든 셀이 다 차 있을 때 변환 -> 비어있으면 동작하지 않음
너무 큰 행렬이 있을 때 PCA를 사용
어떤 이유로 줄었는지 알 수 없는게 단점
2개 혹은 3개의 작은 행렬의 곱으로 단순화(일종의 소인수 분해)
PCA와 같은 차원축소 알고리즘이지만 다른 방식
SVD vs SVD++
넷츨릭스 컨테스트때 고안된 추천 방식
SVD 나 PCA는 완전하게 채워져있는 행렬의 차원수를 줄이는 방식
SVD++ 는 spares 행렬이 주어졌을 때 비어있는 셀들을 채우는 방법을 배우는 알고리즘
채워진 셀들의 값을 최대한 비슷하게 채우는 방식으로 학습(에러률 최소화)
보통 RMSE의 값을 최소화하는 방식으로 학습하면서 SGD를 사용
RMSE : 값을 알고있는 것과 예측의 차이를 모두 제곱하여 합하고 값의 수를 나누고 루트를 씌우는 값
surprise 라이브러리를 사용하거나 scikit-learn의 TruncatedSVD 를 사용
surprise 라이브러리와 무비렌즈 데이터셋을 이용
평점을 예측하는 모델 개발
모델 성능 평가
test/train 방식
SVD 기반 실습
대표적인 비지도 학습을 위한 딥러닝 모델
데이터의 숨겨진 구조를 발견하면서 노드의 수를 줄이는 것이 목표
입력 데이터에서 불필요한 특징들을 제거한 압축된 특징을 학습하려는 것
오토인코더의 출력은 입력을 재구축한 것이다(입력이 다시 출력이 되는 것)
-> 최대한 비슷하게 나오도록 학습
-> 입력데이터와 예상 출력 데이터가 동일 (입력 == 레이블)
-> hidden layer의 차원 수는 입출력 layer의 수보다 작아야한다.
-> 데이터의 차원을 줄임
오토인코더의 구조
출력층의 노드 개수와 입력층의 노드 개수가 동일해야함
은닉층의 노드 개수가 출력층/입력층의 노드 개수보다 작아야함
이렇게 학습된 은닉층의 출력을 입력을 대신하는 데이터로 사용
데이터의 크기 축소 , A 대신 B를 사용
케라스를 사용하여 숫자 이미지를 인코딩 햇다가 디코딩하는 오토인코더 만들기
https://blog.keras.io/building-autoencoders-inkeras.html
파이썬으로 작성된 오픈소스 Deeplearning 라이브러리
다양한 프레임웍 위에서 동작하는 상위레벨 딥러닝 프레임웍
Tensorflow, MXNet, CNTK, Deeplearning4j , Theano 등 지원
Tensorflow 위에만 동작하는 라이브러리도 있음
from tensorflow import keras vs import keras
Tensorflow 2.0에서 케라스가 TF 상위레벨 라이브러리로 공식 확정
keras API 를 사용하는 세가지 방법
1. Sequential 모델 API
가장 간단하며 가장 많이 사용됨 (70+%)
하나의 입력 데이터, 하나의 출력데이터, 순차 레이어 스택을 지원
Functional API
레고블록 모델
다중 입력데이터, 다중출력데이터, 임의의 그래프 구조 지워(Tensorflow와 흡사)
Sequential 모델에 비해 복잡
Model Subclassing
가장 Flexible 하지만 가장 복잡
Surprise를 가지고 SVD 기반 평점 예측 모델 만들기
오토인코더 기반으로 딥러닝 모델을 만들기
무비렌즈 데이터셋의 평점 정보 예측하는 딥러닝 모델 생성
무비렌즈 데이터에서 영화수는 9066개
하지만 영화 id의 범위는 1부터 163949가 됨
무비렌즈 영화 id의 값을 순차적으로 변경가능 0부터 9065