[프로그래머스 인공지능 미니 데브코스] 수업 정리 -24- [Recommendation system: ML 기반 추천 엔진 - SVD & 딥러닝 추천 엔진]

3yeong·2022년 9월 14일
0

ML 기반 추천엔진: SVD & 딥러닝 추천 엔진

사용자/아이템 기반 협업 필터링의 문제점

  1. 확장성(scalability) : 큰 행렬 계산은 여러모로 쉽지 않음
    하지만 아이템 기반으로 가면 계산량이 줄어듬
    Spark을 사용하면 큰 행렬 계산도 얼마든지 가능

  2. 부족한 데이터(sparse data)
    많은 사용자들이 충분한 수의 리뷰를 남기지 않음

  3. 해결책 -> 모델기반 협업 필터링
    머신러닝 기술을 사용해 평점을 예측. 입력은 사용자-아이템 평점 행렬
    행렬분해(Matrix Factorization) 방식
    딥러닝 방식

행렬분해 방식

  1. 협업 필터링 문제를 사용자-아이템 평점 행렬을 채우는 문제로 재정의
    사용자 혹은 아이템을 적은 수의 차원으로 기술(차원수 축소)함으로써 문제를 간단화
  2. 가장많이 사용되는 행력 분해 방식(학습, 비용?)
    PCA(Principal Component Analysis)
    SVD(Singular Vector Decomposition) 혹은 SVD++

PCA(Principal Component Analysis)

차원을 축소(Dimensionality Reduction)하되 원래 의미는 최대한 그대로 간직
예) 사용자의 선호도를 특징을 찾아 장르로 변환
모든 셀이 다 차 있을 때 변환 -> 비어있으면 동작하지 않음
너무 큰 행렬이 있을 때 PCA를 사용
어떤 이유로 줄었는지 알 수 없는게 단점

SVD(Singular Vector Decomposition)

2개 혹은 3개의 작은 행렬의 곱으로 단순화(일종의 소인수 분해)
PCA와 같은 차원축소 알고리즘이지만 다른 방식
SVD vs SVD++

SVD++

넷츨릭스 컨테스트때 고안된 추천 방식
SVD 나 PCA는 완전하게 채워져있는 행렬의 차원수를 줄이는 방식
SVD++ 는 spares 행렬이 주어졌을 때 비어있는 셀들을 채우는 방법을 배우는 알고리즘
채워진 셀들의 값을 최대한 비슷하게 채우는 방식으로 학습(에러률 최소화)
보통 RMSE의 값을 최소화하는 방식으로 학습하면서 SGD를 사용
RMSE : 값을 알고있는 것과 예측의 차이를 모두 제곱하여 합하고 값의 수를 나누고 루트를 씌우는 값

surprise 라이브러리를 사용하거나 scikit-learn의 TruncatedSVD 를 사용

SVD 기반 실습

surprise 라이브러리와 무비렌즈 데이터셋을 이용
평점을 예측하는 모델 개발

모델 성능 평가
test/train 방식
SVD 기반 실습

오토인코더 소개

오토인코더란?

  1. 대표적인 비지도 학습을 위한 딥러닝 모델
    데이터의 숨겨진 구조를 발견하면서 노드의 수를 줄이는 것이 목표
    입력 데이터에서 불필요한 특징들을 제거한 압축된 특징을 학습하려는 것
    오토인코더의 출력은 입력을 재구축한 것이다(입력이 다시 출력이 되는 것)
    -> 최대한 비슷하게 나오도록 학습
    -> 입력데이터와 예상 출력 데이터가 동일 (입력 == 레이블)
    -> hidden layer의 차원 수는 입출력 layer의 수보다 작아야한다.
    -> 데이터의 차원을 줄임

  2. 오토인코더의 구조
    출력층의 노드 개수와 입력층의 노드 개수가 동일해야함
    은닉층의 노드 개수가 출력층/입력층의 노드 개수보다 작아야함
    이렇게 학습된 은닉층의 출력을 입력을 대신하는 데이터로 사용
    데이터의 크기 축소 , A 대신 B를 사용

실습

케라스를 사용하여 숫자 이미지를 인코딩 햇다가 디코딩하는 오토인코더 만들기
https://blog.keras.io/building-autoencoders-inkeras.html

구조

keras 소개

파이썬으로 작성된 오픈소스 Deeplearning 라이브러리
다양한 프레임웍 위에서 동작하는 상위레벨 딥러닝 프레임웍
Tensorflow, MXNet, CNTK, Deeplearning4j , Theano 등 지원

Tensorflow 위에만 동작하는 라이브러리도 있음
from tensorflow import keras vs import keras
Tensorflow 2.0에서 케라스가 TF 상위레벨 라이브러리로 공식 확정

keras API 를 사용하는 세가지 방법
1. Sequential 모델 API
가장 간단하며 가장 많이 사용됨 (70+%)
하나의 입력 데이터, 하나의 출력데이터, 순차 레이어 스택을 지원

  1. Functional API
    레고블록 모델
    다중 입력데이터, 다중출력데이터, 임의의 그래프 구조 지워(Tensorflow와 흡사)
    Sequential 모델에 비해 복잡

  2. Model Subclassing
    가장 Flexible 하지만 가장 복잡

Surprise를 가지고 SVD 기반 평점 예측 모델 만들기
오토인코더 기반으로 딥러닝 모델을 만들기

실습

무비렌즈 데이터셋의 평점 정보 예측하는 딥러닝 모델 생성
무비렌즈 데이터에서 영화수는 9066개
하지만 영화 id의 범위는 1부터 163949가 됨
무비렌즈 영화 id의 값을 순차적으로 변경가능 0부터 9065

profile
초보 컴공

0개의 댓글