-
Notifications
You must be signed in to change notification settings - Fork 7
JunHyuk Kwon edited this page Feb 12, 2023
·
31 revisions
- 오늘의집 사이트에서 유저들이 인테리어를 소개하는 글이 있음.
- 인테리어 소개글에 포함된 아이템들을, 해당 오늘의집 유저가 선호하는 아이템으로 간주 (user-item interaction으로 간주)
- 수집한 데이터를 통해 데이터셋을 구성 (ERD를 참고해주세요.)
- 크롤링 가능 여부를 robots.txt를 통해 확인
- 데이터 수집 소요시간을 단축하기 위해 데이터 수집 파이프라인 설계
- 유저가 작성한 인테리어 글을 모아 둔 링크에서 Interior 고유번호를 먼저 수집
- Interior 고유번호에 포함된, 연관된 이미지와 상품의 고유번호를 수집
- 이후 수집된 고유번호를 활용하여 데이터에 대한 세부 정보를 수집
- 새로 등록된 글은 [New] 라벨과 함께 상단에 노출
- 인테리어 모아보기 페이지의 최상단의 3개만 탐색하여 새로 등록된 글이 있는지 먼저 확인
- 새로 등록된 글이 있다면, 해당 글에서 새롭게 발견된 Item, Card에 대해서만 데이터 수집 진행
- 수집된 데이터의 경우 가능한 모든 상호 작용 중에서 관측치의 비율이 99.96%로 매우 spare한 데이터
- 위 이미지는 전체 아이템 중 10%에 해당하는 아이템들에 대해 99.96%의 sparsity를 시각화한 이미지
- 수집된 데이터는 0.41%의 소수 아이템들이 다른 아이템들과 비교해서 상대적으로 많은 interaction을 차지하고 있음.
- 아이템별로 interaction의 불균형이 존재하기 때문에, 모델 학습 시 소수의 인기 아이템에 편향되서 개인화 추천이 어려운 문제가 발생할 수 있음.
문자열 전처리 적용, Konlpy, keras의 text_to_word_sequence 적용해서 가공하기 쉬운 형태로 변환
- 상품명이 유사한데 색상, 크기, 형태만 다른 경우가 있음.
- 상품명 text의 평균 길이: 19
- 짧은 text가 많기 때문에 tf-idf, bag-of-words, word2vec과 같은 ML 기법으로 vectorize가 잘 안됨.
- 게슈탈트 패턴 매칭 알고리즘을 통해 text 간의 유사도를 character 단위로 계산해서 numerical value로 변환(vectorize)
- 게슈탈트 패턴 매칭 알고리즘으로 vectorize할 경우 모든 아이템과 비교하려면 O(n^2)의 시간복잡도가 요구됨. (15시간 소요)
- Sliding Window 알고리즘 적용: 상품명 기준으로 정렬 후 근방의 K개 상품명만 비교하면 O(n*k)의 시간복잡도가 요구됨. (10분 소요)
- 아이템별로 유사한 상품들끼리를 같은 클러스터로 묶일 수 있도록 BFS 알고리즘 사용
- 너무 먼 이웃의 노드는 클러스터에 포함되지 않도록 함. (트리의 depth 제한 적용)
- 양방향 그래프를 구성해서 노드들이 빠짐없이 클러스터링
-
수치
- 2개 이상의 그룹으로 묶인 총 아이템 개수: 6008개
- 2개 이상의 그룹으로 묶인 총 클러스터 개수: 2630
- 클러스터 그룹별 평균 아이템 개수: 2.284
-
예시 (5개로 클러스터링된 아이템들 중 일부)
-
사진
-
상품들의 category 특징:
- 대분류부터 소분류까지 있음
- 총 개수가 1003개
- 이들을 multi-hot으로 둠
- 클러스터 내에서, 다른 카테고리인데 이름이 유사해서 분류된 경우가 있음
- 이것들은 같은 카테고리의 상품들이 아님.
-
상품들의 seller 특징:
- 같은 클러스터 내의 상품들은 대체로 같은 seller가 판매함.
- 같은 클러스터 내의 상품들이어도 seller가 다른 경우가 존재하긴 함.
- 이들을 one-hot
- 총 12000개 있음
-
category와 seller를 feature로 활용해서 이와 같이 분류할 수 있음.
-
random forest regressor 사용
- 라벨에 가깝게 예측할 경우 정답 라벨로 간주
- label을 0과 1만 사용 (이진 분류 모델: 검증하고자하는 클러스터 vs 검증에 활용된 클러스터)
-
근데 feature가 12000개의 multi-hot으로 되어 있고 매우 sparse하기 때문에, 이것들을 autoencoder로 차원축소 (100차원으로 축소)
MSE Loss: 0.000100418 → 매우 잘 복원됨.
- 검증하고자하는 클러스터와 같은 개수의 아이템을 가지는 클러스터와 비교
- 검증하고자하는 클러스터의 아이템들과 대조군 클러스터 아이템들을 random forest로 train함.
- 그래서 검증하려는 클러스터들을 test set으로 지정
- 회귀 예측값이 0.5 미만인 예측이 포함될 경우 오답이 포함된 클러스터로 간주
-
수치
- 2개 이상의 그룹으로 묶인 총 클러스터 개수: 2630개
- 2개 이상의 그룹으로 묶인 총 아이템 개수: 6008개
- 2개 이상의 그룹으로 묶인 오답이 포함된 클러스터 개수: 81
- 2개 이상의 그룹으로 묶인 오답이 포함된 클러스터에 포함된 아이템 개수: 425
-
오답이 포함된 클러스터 비율: 3.080%
- 클러스터링이 잘됐다고 볼 수 있음.
-
오답이 포함된 클러스터 확인하기 예시1
- 실제 사진:
- 실제 사진:
-
오답이 포함된 클러스터 확인하기 예시2
- 실제 사진:
- 실제 사진:
-
해당 클러스터들을 제거해주면 됨