๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐˜ผ๐™„/๐™Ž๐™ฉ๐™ช๐™™๐™ฎ

๋จธ์‹ ๋Ÿฌ๋‹(CatBoost, LightGBM, XGBoost) ๊ณต๋ถ€ํ•˜๊ธฐ

by beomcoder 2023. 3. 14.
728x90
๋ฐ˜์‘ํ˜•

Kaggle์„ ๋น„๋กฏํ•œ ๋ฐ์ดํ„ฐ ๊ฒฝ์ง„๋Œ€ํšŒ ํ”Œ๋žซํผ์—์„œ ํ•ญ์ƒ ์ƒ์œ„๊ถŒ์„ ์ฐจ์ง€ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ XGBoost, LightGBM, CatBoost์— ๋Œ€ํ•ด ์ •๋ฆฌํ•˜๊ณ  ์ฐจ์ด์ ์„ ๋น„๊ตํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

 

๋‚ด๊ฐ€ ๋ถ€ํŠธ์บ ํ”„์—์„œ ์ธ๊ณต์ง€๋Šฅ์„ ๋ฐฐ์› ์„๋•Œ๋‚˜ ๋‹ค๋ฅธ ๊ต์œก์„ ๋“ค์—ˆ์„๋•Œ ํ•ญ์ƒ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ผ๋˜ ๋ชจ๋ธ์ด๋‹ˆ ๋ฐฉ๋ฒ•๋ก ๋ถ€ํ„ฐ ๋ฐฐ์šฐ๋‹ค ๋ณด๋‹ˆ๊นŒ ์ตœ๊ทผ์— ์“ฐ์ด๋Š” ๋ชจ๋ธ, ํ˜„์žฌ ์“ฐ๊ณ  ์žˆ๋Š” ๋ฌด์—‡์ธ๊ฐ€๋ฅผ ๋ฐฐ์šฑ๊ธฐ๋„ ์ „์— ๊ต์œก์ด ๋๋‚œ๋‹ค. ๋‚˜๋Š” ์˜ˆ์ „ ๊ฒƒ๋„ ๋ฐฐ์›Œ์„œ ์ฐจ๊ทผ์ฐจ๊ทผ ๋ฐฐ์šฐ๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•˜์ง€๋งŒ ์“ธ๋งŒํ•œ ๊ฒƒ๋“ค์„ ๋ฐฐ์šฐ๊ณ  ์‹ถ์—ˆ๋‹ค.

 

๋‚˜๋Š” decision tree, random forest ๊ฐ™์ด ์˜›๋‚ ์— ๋งŒ๋“ค์–ด์ ธ์„œ ์ง€๊ธˆ์€ ์“ฐ์—ฌ์ง€์ง€ ์•Š๋Š” ๋จธ์‹ ๋Ÿฌ๋‹๊ธฐ๋ฒ•๋งŒ ๋ฐฐ์šฐ๋‹ค๊ฐ€ ๊ต์œก๊ธฐ๊ฐ„์ด ๋๋‚ฌ๋‹ค. ์ค‘๊ฐ„์— ๋ถ€ํŠธ์บ ํ”„ ๋‚ด ๋Œ€ํšŒ๋ฅผ ๊ฐœ์ตœํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๋Œ€ํšŒ๋ฅผ ์ฐธ์—ฌํ• ๋•Œ๋„ ๋ถ€ํŠธ์บ ํ”„์—์„œ ๋ฐฐ์šด ๋จธ์‹ ๋Ÿฌ๋‹๋งŒ ์“ฐ๋‹ค๊ฐ€ ์ ์ˆ˜๋„ ๋‚ด์ง€ ๋ชปํ•˜๊ณ  ์ฐพ์•„๋ณด๊ณ  xgboost, light gbm, catboost ๋“ฑ์„ ์ฐพ์•„์„œ ์ผ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋•Œ๋Š” ๋ญ๊ฐ€ ๋จผ์ € ๋‚˜์™”๊ณ , ๋‚ด ์ƒํ™ฉ์—์„œ๋Š” ์–ด๋–ค ๋ชจ๋ธ์„ ์จ์•ผํ•˜๋Š”์ง€๋„ ๋ชฐ๋ž๋‹ค.

 

์ง€๊ธˆ ํšŒ์‚ฌ์—์„œ ํŒ์Šค์ค€๋น„๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—  ๋‹ค์–‘ํ•œ ๋ชจ๋ธ๋“ค์„ ๊ณต๋ถ€ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

๋‚˜๋Š” ์ง€๊ธˆ ํŒ์Šค์ค€๋น„๋กœ ๊ณต๋ถ€ํ•ด์•ผํ•  ๋ถ€๋ถ„์ด ์ง€๋„ํ•™์Šต์˜ ๋ถ„๋ฅ˜ํŒŒํŠธ์ด๋‹ค. ์ถ”ํ›„์— ๊ตฐ์ง‘ํ™”๋„ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”์ฒœ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•ด์•ผ ํ•˜์ง€๋งŒ ์šฐ์„ ์€ ์ง€๋„ํ•™์Šต์„ ๋จผ์ € ๊ณต๋ถ€ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

 

 

๊ฒฐ์ •ํŠธ๋ฆฌ์™€ ๋žœ๋คํฌ๋ ˆ์ŠคํŠธ๋Š” ๋งŽ์ด ์“ฐ์ด์ง€ ์•Š์•„ ๋น„๊ต์  ์ตœ์‹  ๋จธ์‹ ๋Ÿฌ๋‹ ๊ธฐ๋ฒ•์ธ xgboost, lightGBM, CatBoost์˜ ์ฐจ์ด๋ฅผ ๋น„๊ตํ•ด๋ณด๊ณ  ์–ด๋–ค ๋ชจ๋ธ์„ ์‚ฌ์šฉํ• ์ง€ ์ •ํ•ด๋ณด๋ ค ํ•œ๋‹ค.

XGBoost

XGBoost๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ GBM๊ณผ ๊ฐ™์ด decision Tree์˜ ์•™์ƒ๋ธ” ๋ชจํ˜•์ด๊ณ  ํ’€์–ด์„œ ๋งํ•˜๋ฉด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์•ฝํ•œ ์˜์‚ฌ๊ฒฐ์ •๋‚˜๋ฌด(Decision Tree)๋ฅผ ์กฐํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ์•™์ƒ๋ธ”(Ensemble) ๊ธฐ๋ฒ• ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ์ด๋ฆ„์˜ ๋œป์€ Extreme Gradient Boosting์˜ ์•ฝ์ž์ด๋‹ค. ํ•ด์„ํ•˜๋ฉด ๊ทนํ•œ ๋ณ€ํ™”๋„(๊ฒฝ์‚ฌ๋„) ๋ถ€์ŠคํŒ…์ด๋ผ๋Š” ๋œป์ด๋‹ค. Gradient Boost ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ณ‘๋ ฌ ํ•™์Šต์ด ์ง€์›๋˜๋„๋ก ๊ตฌํ˜„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ XGBoost ์ด๋‹ค.

 

Image๋‚˜ Text์™€ ๊ฐ™์€ ๋น„์ •ํ˜•๋ฐ์ดํ„ฐ์—์„œ๋Š” Nerual Network ๋ชจ๋ธ์ด ์••๋„์ ์ธ ์„ฑ๋Šฅ์„ ๋ณด์ด๊ณ  ์žˆ์ง€๋งŒ, ์ •ํ˜•๋ฐ์ดํ„ฐ์—์„œ๋Š” XGBoost์™€ ๊ฐ™์€ tree based ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์•„์ง๊นŒ์ง€๋„ ๋งŽ์ด ์“ฐ์ธ๋‹ค. Regression, Classification ๋ฌธ์ œ๋ฅผ ๋ชจ๋‘ ์ง€์›ํ•˜๋ฉฐ, ์„ฑ๋Šฅ๊ณผ ์ž์› ํšจ์œจ์ด ์ข‹์•„์„œ, ์ธ๊ธฐ ์žˆ๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด๋‹ค.

 

์žฅ์ 

  • GBM ๋Œ€๋น„ ๋น ๋ฅธ ์ˆ˜ํ–‰์‹œ๊ฐ„
  • ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋กœ ํ•™์Šต, ๋ถ„๋ฅ˜ ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค.
  • ๊ณผ์ ํ•ฉ ๊ทœ์ œ(Regularization)
  • ํ‘œ์ค€ GBM ๊ฒฝ์šฐ ๊ณผ์ ํ•ฉ ๊ทœ์ œ๊ธฐ๋Šฅ์ด ์—†์œผ๋‚˜, XGBoost๋Š” ์ž์ฒด์— ๊ณผ์ ํ•ฉ ๊ทœ์ œ ๊ธฐ๋Šฅ์œผ๋กœ ๊ฐ•ํ•œ ๋‚ด๊ตฌ์„ฑ ์ง€๋‹Œ๋‹ค.
  • ๋ถ„๋ฅ˜์™€ ํšŒ๊ท€์˜์—ญ์—์„œ ๋›ฐ์–ด๋‚œ ์˜ˆ์ธก ์„ฑ๋Šฅ ๋ฐœํœ˜
  • ์ฆ‰, CART(Classification and regression tree) ์•™์ƒ๋ธ” ๋ชจ๋ธ์„ ์‚ฌ์šฉ
  • Early Stopping(์กฐ๊ธฐ ์ข…๋ฃŒ) ๊ธฐ๋Šฅ์ด ์žˆ์Œ
  • ๋‹ค์–‘ํ•œ ์˜ต์…˜์„ ์ œ๊ณตํ•˜๋ฉฐ Customizing์ด ์šฉ์ดํ•˜๋‹ค.
  • Missing Values : ๊ฒฐ์ธก์น˜๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค. ์‹ค์ œ๋กœ kaggle์— ์ ์šฉํ•ด๋ณด๋Š” ๊ณผ์ •์—์„œ ํŽธ๋ฆฌํ•จ

 

LightGBM

LightGBM์˜ ๋ฉ”์ธ ๊ธฐ์ˆ ์€ GOSS(Gradient-based One-Side Sampling)์ด๋‹ค. GOSS๋Š” Information gain์„ ๊ณ„์‚ฐํ•  ๋•Œ ๊ธฐ์šธ๊ธฐ๊ฐ€ ์ž‘์€(๊ฐ€์ค‘์น˜๊ฐ€ ์ž‘์€)๊ฐœ์ฒด์— ์Šน์ˆ˜ ์ƒ์ˆ˜๋ฅผ ์ ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฆํญ์‹œํ‚จ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ ๋ฐ์ดํ„ฐ ๋ถ„ํฌ๋ฅผ ๋งŽ์ด ๋ณ€๊ฒฝํ•˜์ง€ ์•ˆํ˜น๋„ ํ›ˆ๋ จ์ด ๋œ ๋œ ๊ฐœ์ฒด์— ์ดˆ์ ์„ ๋ณด๋‹ค ์ž˜ ๋งž์ถœ ์ˆ˜ ์žˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์œผ๋กœ LightGBM์ด XGBoost๋ณด๋‹ค ์†๋„์™€ ์„ฑ๋Šฅ๋ฉด์—์„œ ๋ชจ๋‘ ์ข‹์€ ํผํฌ๋จผ์Šค๋ฅผ ๊ฐ€์ง„๋‹ค.

 

๊ธฐ์กด์˜ ๋ฐฉ์‹๊ณผ ๋‹ฌ๋ฆฌ LightGBM์—์„œ ์ฑ„ํƒํ•œ leaf-wise(๋ฆฌํ”„ ์ค‘์‹ฌ ํŠธ๋ฆฌ ๋ถ„ํ• )์€ ํŠธ๋ฆฌ๊ฐ€ ๊นŠ์–ด์ง€๋ฉด์„œ ์†Œ์š”๋˜๋Š” ์‹œ๊ฐ„๊ณผ ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋‘๋ฅผ ์ ˆ์•ฝ ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด LightGBM์€ ์ ์€ ๋ฐ์ดํ„ฐ์…‹(์•ฝ 10000๊ฑด)์—์„œ๋Š” ๊ณผ์ ํ•ฉ์ด ์ผ์–ด๋‚œ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฐ์ดํ„ฐ์…‹์ด ๋งŽ์„๋•Œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ๋˜ ํ•˜๋‚˜์˜ ํŠน์ง•์œผ๋กœ๋Š” ์šฐ๋ฆฌ๋Š” ๋ชจ๋ธ์„ ํ•™์Šต์‹œํ‚ฌ ๋•Œ ๋ฒ”์ฃผํ˜• ๋ณ€์ˆ˜๋“ค์„(Object, Category) ์ˆซ์žํ˜• ๋ณ€์ˆ˜๋กœ ๋ฐ”๊พธ์–ด์„œ ํ•™์Šต์‹œํ‚จ๋‹ค. ๊ทธ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฐ€์žฅ ๋„๋ฆฌ ์“ฐ์ด๋Š” ๊ฒƒ์ด ์›ํ•ซ์ธ์ฝ”๋”ฉ์ธ๋ฐ, ํŠธ๋ฆฌ ๋ชจ๋ธ์—์„œ high cardinality categorical features(๋ฒ”์ฃผ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์€ ๋ณ€์ˆ˜)๋ฅผ ์›ํ•ซ์ธ์ฝ”๋”ฉํ•˜์—ฌ ๋„ฃ๊ฒŒ ๋˜๋ฉด ํŠธ๋ฆฌ๊ฐ€ ์–ธ๋ฐธ๋Ÿฐ์Šค ํ•ด์ง€๊ณ , ์ข‹์€ ์„ฑ๋Šฅ์„ ๋‚ด๊ธฐ ์œ„ํ•ด ๋” ๊นŠ์–ด์ง„๋‹ค๊ณ  ํ•œ๋‹ค. ์ฆ‰, ํ›ˆ๋ จ์‹œํ‚ค๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๋” ์†Œ์š”๋˜๊ณ  ๊ณผ์ ํ•ฉํ•  ์œ„ํ—˜์ด ๋†’๋‹ค. ์ด๊ฒƒ์„ ๋Œ€๋น„ํ•˜์—ฌ LGBM์—์„œ๋Š” Category type์˜ ๋ณ€์ˆ˜๋„ ๊ทธ๋Œ€๋กœ ํ•™์Šต์ด ๋œ๋‹ค. ์‹ค์ œ๋กœ๋„ ์›ํ•ซ์ธ์ฝ”๋”ฉ๋ณด๋‹ค ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚˜๋‹ค๊ณ  ํ•˜๋‹ˆ ์•Œ์•„๋‘๋ฉด ์ข‹์„ ๋“ฏํ•˜๋‹ค.

 

CatBoost

 

CatBoost๋Š” ๊ธฐ๊ณ„ ํ•™์Šต ๋ถ„์•ผ์—์„œ ์‚ฌ์šฉ๋˜๋Š” gradient boosting ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. CatBoost๋Š” ์นดํ…Œ๊ณ ๋ฆฌํ˜• ๋ณ€์ˆ˜๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐ ์žˆ์–ด์„œ ๋งค์šฐ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ, ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์—์„œ ๋†’์€ ์ •ํ™•๋„๋ฅผ ๋ณด์ด๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ๋‹ค. CatBoost์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋Š” ์ž๋™์œผ๋กœ ์นดํ…Œ๊ณ ๋ฆฌํ˜• ๋ณ€์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ธฐ์กด์˜ gradient boosting ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์€ ์นดํ…Œ๊ณ ๋ฆฌํ˜• ๋ณ€์ˆ˜๋ฅผ ์ˆ˜์น˜ํ˜• ๋ณ€์ˆ˜๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ CatBoost๋Š” ์นดํ…Œ๊ณ ๋ฆฌํ˜• ๋ณ€์ˆ˜๋ฅผ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋ชจ๋ธ ํ•™์Šต์„ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ค€๋‹ค. ๋˜ํ•œ CatBoost๋Š” overfitting์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ธฐ๋Šฅ๋„ ์ œ๊ณตํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด CatBoost๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌด์ž‘์œ„๋กœ ์„ž์–ด์„œ ํ•™์Šตํ•˜๊ณ , ์ž๋™์œผ๋กœ regularization์„ ์ ์šฉํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ณผ์ ํ•ฉ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ๋ชจ๋ธ์˜ ์ผ๋ฐ˜ํ™” ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค. CatBoost๋Š” ๋‹ค์–‘ํ•œ ๋ถ„์•ผ์—์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŠนํžˆ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์—์„œ ๋†’์€ ์„ฑ๋Šฅ์„ ๋ณด์ด๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ๋‹ค. CatBoost๋Š” Python, R, C++ ๋“ฑ ๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

XGBoost ์™€ ๋”๋ถˆ์–ด Catboost ๋Š” Level-wise ๋กœ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด๋‚˜๊ฐ„๋‹ค. Level-wise ์™€ Leaf-wise ์˜ ์ฐจ์ด๋Š”, ๊ทธ๋ƒฅ ์ง๊ด€์ ์œผ๋กœ ๋งํ•˜๋ฉด Level-wise ๋Š” BFS ๊ฐ™์ด ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด๋‚˜๊ฐ€๋Š” ํ˜•ํƒœ๊ณ , Leaf-wise ๋Š” DFS ๊ฐ™์ด ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด๋‚˜๊ฐ€๋Š” ํ˜•ํƒœ๋‹ค. ๋ฌผ๋ก  max_depth = -1 ์ด๋ฉด ๋‘˜์€ ๊ฐ™์€ ํ˜•ํƒœ์ง€๋งŒ, ๋Œ€๋ถ€๋ถ„์˜ ๋ถ€์ŠคํŒ… ๋ชจ๋ธ์—์„œ์˜ ํŠธ๋ฆฌ๋Š” max_depth != -1 ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋‘˜์„ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 

3๊ฐœ์˜ ๋จธ์‹ ๋Ÿฌ๋‹์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜๋Š”๋ฐ, ๋‚˜๋Š” ์šฐ๋ฆฌ ์–ดํ”Œ์ด ๋ฐ์ดํ„ฐ๋„ ๋งŽ๊ณ  ๋ฒ”์ฃผํ˜•๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ๊ธฐ๋•Œ๋ฌธ์— Light GBM์„ ์„ ํƒํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. ์ด์ œ ๋ฐ์ดํ„ฐ์…‹์„ ์ „์ฒ˜๋ฆฌํ•˜๊ณ  ๋ชจ๋ธ์„ ํ…Œ์ŠคํŠธํ•ด๋ณด๊ณ  ์žˆ๋‹ค. ๋‚ด๊ฐ€ ์˜ˆ์ƒํ•˜๊ธฐ๋กœ Light GBM์ด ์ž˜ ๋งž์„ ๊ฒƒ ๊ฐ™์ง€๋งŒ ํ˜น์‹œ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋จธ์‹ ๋Ÿฌ๋‹์„ ๊ฐ๊ฐ ํ•™์Šต์‹œ์ผœ ๊ฐ€์žฅ ์ข‹์€ ์ •ํ™•๋„๋ฅผ ๊ฐ€์ง„ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•  ์˜ˆ์ •์ด๋‹ค.

 

 

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€