:carrot: โ€œ์ด๊ฑธ ๋‹ค ์–ธ์ œ ์ฝ”๋”ฉํ•˜์ง€?โ€์— ๋Œ€ํ•œ ํ•ด๋‹ต, PyCaret

์ด์ „ ์‹ค์Šต์—์„œ ์ผ์ผํžˆ ๋จธ์‹ ๋Ÿฌ๋‹ ์ฝ”๋“œ๋ฅผ ์จ๊ฐ€๋ฉฐ ๋ถ„๋ฅ˜ ๋ชจ๋ธ์„ ๋งŒ๋“ค์—ˆ๋˜ ๊ธฐ์–ต, ์•„์ง๋„ ์ƒ์ƒํ•˜๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด๋ฒˆ์—๋Š” AutoML(์ž๋™ํ™” ๋จธ์‹ ๋Ÿฌ๋‹) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ PyCaret์„ ์‚ฌ์šฉํ•ด๋ดค๋‹ค. ๋‹จ ๋ช‡ ์ค„์˜ ์ฝ”๋“œ๋กœ ์ „์ฒด ๋จธ์‹ ๋Ÿฌ๋‹ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ž๋™ํ™”ํ•˜๋Š” ๊ฒฝํ—˜์€ ์ •๋ง ์ถฉ๊ฒฉ ๊ทธ ์ž์ฒด์˜€๋‹ค. ๐Ÿคฏ

๐Ÿ’ก ๋กœ์šฐ์ฝ”๋“œ(Low-code) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํž˜!

PyCaret์€ Scikit-learn, XGBoost ๊ฐ™์€ ์—ฌ๋Ÿฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ๊ฐ์‹ธ์„œ, ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ๋ถ€ํ„ฐ ๋ชจ๋ธ ํ•™์Šต, ํŠœ๋‹, ๋ฐฐํฌ๊นŒ์ง€ ๋ชจ๋“  ๊ณผ์ •์„ ์ž๋™ํ™”ํ•ด์ค€๋‹ค. ๋•๋ถ„์— ๋‚˜๋Š” ๋ชจ๋ธ๋ง ์ž์ฒด์— ๋” ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.


๐Ÿš€ PyCaret ํ•ต์‹ฌ ์›Œํฌํ”Œ๋กœ์šฐ: ๋”ฑ 5๋‹จ๊ณ„๋งŒ ๊ธฐ์–ตํ•ด!

PyCaret์˜ ์ž‘์—…์€ ๋†€๋ผ์šธ ์ •๋„๋กœ ๊ฐ„๋‹จํ•œ 5๋‹จ๊ณ„๋กœ ์š”์•ฝ๋œ๋‹ค.

Setup โžก๏ธ Compare Models โžก๏ธ Analyze Model โžก๏ธ Prediction โžก๏ธ Save Model

์ด ํ๋ฆ„๋งŒ ๋”ฐ๋ผ๊ฐ€๋ฉด ๋ˆ„๊ตฌ๋‚˜ ์ „๋ฌธ๊ฐ€ ์ˆ˜์ค€์˜ ๋ชจ๋ธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒŒ ์ •๋ง ๋งค๋ ฅ์ ์ด์—ˆ๋‹ค.

1๏ธโƒฃ ์‹คํ—˜ ์ค€๋น„: setup()

๋ชจ๋“  ์ž‘์—…์˜ ์‹œ์ž‘. setup ํ•จ์ˆ˜ ํ•˜๋‚˜๋กœ ๋ชจ๋“  ๊ฒŒ ์ค€๋น„๋œ๋‹ค. ๋ฐ์ดํ„ฐ ๋ถ„์„, ๊ฒฐ์ธก์น˜ ์ฒ˜๋ฆฌ, ์ธ์ฝ”๋”ฉ, ๋ฐ์ดํ„ฐ ๋ถ„ํ• ๊นŒ์ง€ ์•Œ์•„์„œ ๋‹ค ํ•ด์ฃผ๋‹ˆ ์‹œ๊ฐ„์„ ์—„์ฒญ๋‚˜๊ฒŒ ์•„๋‚„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

from pycaret.classification import *
s = setup(data, target = 'species', session_id = 123)

2๏ธโƒฃ ๋ชจ๋ธ ๋น„๊ต: compare_models()

PyCaret์˜ ๊ฝƒ! ๐ŸŒธ ๋‹จ ํ•œ ์ค„์˜ ์ฝ”๋“œ๋กœ ์ˆ˜์‹ญ ๊ฐœ ๋ชจ๋ธ์„ ํ•œ ๋ฒˆ์— ํ•™์Šตํ•˜๊ณ , ๊ต์ฐจ ๊ฒ€์ฆ ์„ฑ๋Šฅ์„ ํ‘œ๋กœ ์ซ™ ๋ณด์—ฌ์ค€๋‹ค. ์–ด๋–ค ๋ชจ๋ธ์ด ๋‚ด ๋ฐ์ดํ„ฐ์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ์ง€ ์ˆœ์‹๊ฐ„์— ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

best = compare_models()

3๏ธโƒฃ ๋ชจ๋ธ ์ƒ์„ฑ ๋ฐ ํŠœ๋‹: create_model() & tune_model()

๊ฐ€์žฅ ์ข‹์€ ๋ชจ๋ธ์ด๋‚˜ ํŠน์ • ๋ชจ๋ธ์„ ๊ณจ๋ผ ๋” ๊นŠ๊ฒŒ ํŒŒ๊ณ ๋“ค ์ˆ˜ ์žˆ๋‹ค. tune_model()์€ RandomizedSearchCV๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ตœ์ ์˜ ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ฐพ์•„ ๋ชจ๋ธ ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•ด์ค€๋‹ค.

dt = create_model('dt')
tuned_dt = tune_model(dt)

4๏ธโƒฃ ๋ชจ๋ธ ๋ถ„์„ ๋ฐ ์˜ˆ์ธก: plot_model() & predict_model()

๋ชจ๋ธ์„ ๋งŒ๋“ค๊ณ  ๋์ด ์•„๋‹ˆ๋‹ค. ํ˜ผ๋™ ํ–‰๋ ฌ, ํ”ผ์ฒ˜ ์ค‘์š”๋„ ๋“ฑ 15๊ฐ€์ง€๊ฐ€ ๋„˜๋Š” ํ”Œ๋กฏ์„ ๊ทธ๋ ค ๋ชจ๋ธ์„ ๋‹ค๊ฐ๋„๋กœ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋‹ค. SHAP์„ ์ด์šฉํ•œ ๋ชจ๋ธ ํ•ด์„๊นŒ์ง€ ๊ฐ€๋Šฅํ•˜๋‹ค๋‹ˆ, ์ •๋ง ๊ฐ•๋ ฅํ–ˆ๋‹ค.

plot_model(best, plot = 'confusion_matrix')
interpret_model(lightgbm, plot = 'summary')

5๏ธโƒฃ ๋ชจ๋ธ ์ €์žฅ ๋ฐ ๋ฐฐํฌ: save_model() & create_api()

์ž˜ ๋งŒ๋“  ๋ชจ๋ธ์€ ์ „์ฒ˜๋ฆฌ ๊ณผ์ •๊นŒ์ง€ ํฌํ•จ๋œ ์ „์ฒด ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ์ €์žฅํ•˜๊ณ , FastAPI ์ฝ”๋“œ์™€ Dockerfile๊นŒ์ง€ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด์ค€๋‹ค. MLOps์˜ ์‹œ์ž‘์„ ์ด๋ ‡๊ฒŒ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค๋‹ˆ..! ๐Ÿณ

save_model(best, 'my_best_pipeline')
create_api(tuned_dt, api_name = 'my_iris_api')
create_docker('my_iris_api')

โœจ ์˜ค๋Š˜์˜ ํšŒ๊ณ 

PyCaret์„ ์‚ฌ์šฉํ•œ ๊ฒฝํ—˜์€ โ€˜ํ˜์‹ โ€™ ๊ทธ ์ž์ฒด์˜€๋‹ค. ์ด์ „ ์‹ค์Šต์—์„œ ์ˆ˜๋ฐฑ ์ค„์— ๊ฑธ์ณ ํ–ˆ๋˜ ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ, ๋ชจ๋ธ ๋น„๊ต, ํ‰๊ฐ€, ํŠœ๋‹ ๊ณผ์ •์„ ๋‹จ ๋ช‡ ์ค„์˜ ์ฝ”๋“œ๋กœ ์••์ถ•ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

ํŠนํžˆ compare_models()๋กœ ๋ชจ๋“  ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ์„ ํ•œ๋ˆˆ์— ๋น„๊ตํ•˜๊ณ  ์‹œ์ž‘ํ•˜๋Š” ์ ‘๊ทผ๋ฒ•์€ ์‹œ๊ฐ„์„ ๊ทน์ ์œผ๋กœ ๋‹จ์ถ•์‹œ์ผœ ์ฃผ์—ˆ๋‹ค. ๋ชจ๋ธ ์„ฑ๋Šฅ ๋ถ„์„๋ถ€ํ„ฐ API, Dockerfile ์ƒ์„ฑ๊นŒ์ง€ ์ง€์›ํ•˜๋Š” ๊ฒƒ์„ ๋ณด๋ฉฐ, PyCaret์ด ๋‹จ์ˆœํžˆ ๋น ๋ฅธ ์‹คํ—˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ๊นŒ์ง€ ๊ณ ๋ คํ•œ ๋งค์šฐ ์‹ค์šฉ์ ์ธ ๋„๊ตฌ๋ผ๋Š” ๊ฒƒ์„ ๋А๋‚„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์•ž์œผ๋กœ ๋จธ์‹ ๋Ÿฌ๋‹ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ, PyCaret์œผ๋กœ ๋น ๋ฅด๊ฒŒ ํ”„๋กœํ† ํƒ€์ž…์„ ๋งŒ๋“ค๊ณ  ๊ฐ€์žฅ ์œ ๋งํ•œ ๋ชจ๋ธ์„ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ์ด ๋‚˜์˜ ํ‘œ์ค€ ์›Œํฌํ”Œ๋กœ์šฐ๊ฐ€ ๋  ๊ฒƒ ๊ฐ™๋‹ค. ๐Ÿš€