cluster_id
: ์์ดํ
์ ์ค๋ถ๋ฅ์ ์์์ด ๋ชจ๋ ๋์ผํ ๊ฒ์ ๋ฌถ์ด ํ๋์ ํด๋ฌ์คํฐ๋ก ์์ฑํฉ๋๋ค. ๊ทธ๋์ ๊ณ ์ ํ ํด๋ฌ์คํฐ์ ๋ฒํธ๊ฐ cluster_id ์
๋๋ค.
item_id
: ํฌ๋กค๋ง์ ์งํํ ์์ดํ
์ ๊ณ ์ ํ ๋ฒํธ์
๋๋ค.
์์ ์ค๋ช ์ ๋ฐํ์ผ๋ก cluster_id์ item_id๊ฐ์ ์ํธ์์ฉ ์ ๋ณด๋ฅผ ์ ๋ ฅ์ผ๋ก ํ์ฌ lightGCN ๋ชจ๋ธ์ ํตํด ํด๋ฌ์คํฐ์ ์์ดํ ๊ฐ์ ์ํธ์์ฉ ํ๋ฅ ์ ์์๋ผ ์ ์๋๋ก ํ์ตํ์ต๋๋ค.
์ด๋, cluster_id์ item_id๊ฐ์ ์ํธ์์ฉํ๋ ฌ์ sparsity๋ 99.4% ์ ๋๊ฐ ๋๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ์ ๋ณด๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด 0์ผ๋ก๋ง ์์ธก์ ํด๋ accuracy ์์น๊ฐ 99.4%๊ฐ ๋์๋ฒ๋ฆฌ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
๊ทธ๋ ๊ธฐ์ ํ์ต์ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ๋ ์ํธ์์ฉ ๊ฒฐ๊ณผ์ ๋น์จ์ด ๋น์ทํ๋๋ก ์ค์ ํด์ฃผ์์ต๋๋ค.
- ํด๋ฌ์คํฐID, ์์ดํ ID, ์ํธ์์ฉ = 1 : 4799๊ฐ์ ๋ฐ์ดํฐ ์กด์ฌ
- ํด๋ฌ์คํฐID, ์์ดํ ID, ์ํธ์์ฉ = 0 : 6723๊ฐ์ ๋ฐ์ดํฐ ์กด์ฌ (๊ธฐ์กด ์ฝ 68๋ง๊ฐ)
์ฌ๊ธฐ์ ๋ ์ฃผ์ํด์ผ ํ๋ ๊ฒ์, ์ํธ์์ฉ์ ํ์ง ์์๋ค๊ณ ํด์ ์ง์ง๋ก ๊ทธ ํด๋ฌ์คํฐ์ ์์ดํ
์ด ์ด์ธ๋ฆฌ์ง ์๋๋ค๋ ๊ฒ์ ์๋ฏธํ์ง ์์ต๋๋ค. ์ด์ธ๋ฆฌ๋๋ฐ ๊ทธ๋ฐ ์ฝ๋๊ฐ ์์ด์ ์ํธ์์ฉ ์ ๋ณด๊ฐ ์์ ์ ์๊ณ , ๋ฐ์ดํฐ ํฌ๋กค๋ง ๋ฒ์์ ๊ทธ๋ฐ ์ฝ๋๊ฐ ์์ด์ ์ํธ์์ฉ์ด 0์ด๋ผ๊ณ ํ์๋ ๊ฒ์ผ ์๋ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๋ฌธ์ ๋ฅผ LightGCN
์ด ํด๊ฒฐํด ์ค ์ ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
Jira Google Drive์ ์ฌ๋ผ๊ฐ dataset ์ฌ์ฉ (data.zip ์์ ์: killerwhale)
์์ ๋ฐ์ดํฐ์
์ ์ด์ฉํ์ฌ ์ ์ฒ๋ฆฌ ์งํ (preprocess branch / preprocess_item.py ์คํ)
์ดํ์, ํ์ฌ ํด๋ ๋ด์ ์๋ make_cluster_item_interaction.ipynb
๋ก ๋ชจ๋ ํด๋ฌ์คํฐ์ ์์ดํ
์ฌ์ด์ interaction ์ ๋ณด๋ฅผ ๋ฆฌ์คํธ๋ก ์ถ์ถํ์ฌ ์ ์ฅ
๋ชจ๋ธ ์คํ : python3 train.py
์ถ๋ก ์งํ : python3 inference.py
์ด๋ ์ถ๋ก ์ ๋ชจ๋ ํด๋ฌ์คํฐ์ ์์ดํ ์ฌ์ด์ interactionํ ํ๋ฅ ์ ์์ธกํ๋๋ก ์ค์ .
์ถ๋ก ๊ฒฐ๊ณผ, ์ค์ ๋ก interaction์ ํ ํด๋ฌ์คํฐ์ ์์ดํ ์ฌ์ด์ ํ๋ฅ ์ ๋๋ถ๋ถ 99%๋ก ์ ํํ๊ฒ ๋์๊ณ , ์ํธ์์ฉ์ ํ์ง ์์๋ ์์ดํ ๊ณผ ํด๋ฌ์คํฐ ์ฌ์ด์์๋ ๋์ ํ๋ฅ ๋ก ์ฐ๊ฒฐ๋ ์ ์๋ ์ ๋ณด๋ค์ด ๋์์ต๋๋ค.
Jira - Google Drive์ ์ฌ๋ผ๊ฐ cluster_item_prob.csv
ํ์ผ๋ง ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
csvํ์ผ ๋ด๋ถ๋ item_id
, cluster_id
, prob
3๊ฐ์ ์นผ๋ผ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ๊ฐ๊ฐ item_id๊ฐ cluster_id์ ์ํธ์์ฉํ ํ๋ฅ ์ ์์ธกํ ๊ฒฐ๊ณผ(prob)๋ฅผ ์๋ฏธํฉ๋๋ค.
streamlit์ผ๋ก ์๋นํ๋ ๋จ๊ณ์์๋ ์ด csv์ ๋ณด๋ง์ ์ฌ์ฉํด์ ํ๋ค๋ฉด, ๋ฏธ๋ฆฌ ๊ณ์ฐ๋ ์ ๋ณด์ด๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ๋น ๋ฅธ ์๊ฐ์์ inference๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
์ฌ์ฉ์๋ก ๋ถํฐ ์
๋ ฅ๋ฐ์ ์์ดํ
์ cluster_id
๋ฅผ ์ถ์ถํ๊ณ , ๊ทธ cluster_id์ ๊ฐ์ฅ ์ํธ์์ฉ ํ๋ฅ ์ด ๋์ ์์ดํ
๋ค์ ์ถ์ฒํด์ฃผ๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์์ง ๋ชจ๋ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด๋ณธ ๊ฒ์ ์๋๋ผ์ Rule-Based์ 50:50 ์ผ๋ก ์์ด์ ์ถ์ฒํ๋ ๊ฒ์ด ๋ ๋ง์กฑ์ค๋ฌ์ด ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ๊ฒ ๊ฐ์ต๋๋ค.
n_epoch = 10000
learning_rate = 0.005
embedding_dim = 250 # int
num_layers = 6 # int
Result : loss=0.537, acc=0.657, AUC=0.728