ML_Validation, Grid Search

wnsdnlยท2025๋…„ 3์›” 8์ผ

ML ๋จธ์‹ ๋Ÿฌ๋‹

๋ชฉ๋ก ๋ณด๊ธฐ
7/11

๐Ÿ“Œ Validation (๊ฒ€์ฆ)

๊ฒ€์ฆ์€ ๋จธ์‹  ๋Ÿฌ๋‹ ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ์„ ํ‰๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๊ฒ€์ฆ์—๋Š” ํฌ๊ฒŒ Hold-out Validation, K-Fold Cross Validation, LOOCV (Leave-One-Out Cross Validation)์ด ์žˆ๋‹ค.

๐Ÿ“ Hold-out Validation

ํ™€๋“œ์•„์›ƒ ๊ฒ€์ฆ ๋ฐฉ์‹์€ ์ง€๊ธˆ๊นŒ์ง€ ํ•ด์™”๋˜ ๋ฐฉ์‹๊ณผ ๋น„์Šทํ•˜๋‹ค. ์ฆ‰, ์ „์ฒด ๋ฐ์ดํ„ฐ ์…‹์„ training set๊ณผ test set์œผ๋กœ ์ผ์ • ๋น„์œจ์„ ํ†ตํ•ด ๋‚˜๋ˆ„์–ด์„œ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ํ™€๋“œ์•„์›ƒ ๊ฒ€์ฆ ๋ฐฉ์‹์ด๋‹ค. (์ฐธ๊ณ ๋กœ ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ ํŠœ๋‹์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ, ํ˜น์€ ๋”ฅ๋Ÿฌ๋‹ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” Train set / Validation set / Test set ์œผ๋กœ ๋‚˜๋ˆ„์–ด ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.)
์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ™€๋“œ์•„์›ƒ ๊ฒ€์ฆ์„ ์จ์™”๋‹ค.

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

ํ™€๋“œ์•„์›ƒ ๊ฒ€์ฆ ๋ฐฉ์‹์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ๊ณ  ๋น ๋ฅด๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ชจ๋ธ ์„ฑ๋Šฅ์„ ํ‰๊ฐ€ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ํšจ๊ณผ์ ์ด๋‹ค.

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

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ต์ฐจ ๊ฒ€์ฆ (Cross Validation)์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๊ต์ฐจ ๊ฒ€์ฆ ์ค‘ k-๊ฒน ๊ต์ฐจ ๊ฒ€์ฆ์— ๋Œ€ํ•ด์„œ ๋จผ์ € ์•Œ์•„๋ณด์ž.

๐Ÿ“ K-Fold Cross Validation

k-๊ฒน ๊ต์ฐจ ๊ฒ€์ฆ์„ ํ•  ๋•Œ๋Š” ๋จผ์ € ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ k ๊ฐœ์˜ ๊ฐ™์€ ์‚ฌ์ด์ฆˆ๋กœ ๋‚˜๋ˆˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด k=5, ๋ฐ์ดํ„ฐ๊ฐ€ ์ด 1000๊ฐœ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ด ๋ฐ์ดํ„ฐ๋ฅผ 200๊ฐœ์”ฉ 5๊ฐœ์˜ ์…‹์œผ๋กœ ๋‚˜๋ˆ„๋ฉด ๋œ๋‹ค.

์ด ๋ฐ์ดํ„ฐ ์…‹๋“ค์„ ์ด์šฉํ•ด์„œ ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๊ฒ€์ฆํ•  ๊ฑด๋ฐ, ๋งจ ์ฒ˜์Œ์—๋Š” ๊ฐ€์žฅ ์œ„์—/์•ž์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์…‹์„ test test์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ , ๋‚˜๋จธ์ง€๋ฅผ training set์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ ‡๊ฒŒ ํ–ˆ์„ ๋•Œ์˜ ์„ฑ๋Šฅ์„ ์ฒดํฌํ•œ๋‹ค.

๊ทธ ๋‹ค์Œ์—๋Š” ๋‘ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ ์…‹์„ test set์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ , ๋‚˜๋จธ์ง€ 4๊ฐœ๋ฅผ training set์œผ๋กœ ์‚ฌ์šฉํ•ด์„œ ๋‹ค์‹œ ๋ชจ๋ธ์„ ํ•™์Šต์‹œํ‚จ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋˜๋‹ค์‹œ ์ด ๋•Œ์˜ ์„ฑ๋Šฅ์„ ํŒŒ์•…ํ•œ๋‹ค. ์˜ˆ์‹œ๋Š” ์œ„์™€ ๊ฐ™๋‹ค.

์ด ๊ณผ์ •์„ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์…‹์— ๋ฐ˜๋ณตํ•ด์ค€๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์œ„์™€ ๊ฐ™์ด 5๊ฐœ์˜ ํ…Œ์ŠคํŠธ ์…‹์— ๋Œ€ํ•œ ์„ฑ๋Šฅ์ด k๊ฐœ ์ฆ‰, 5๊ฐœ ์žˆ์„ ํ…๋ฐ, ์ด ์„ฑ๋Šฅ 5๊ฐœ์˜ ํ‰๊ท ์„ ๋ชจ๋ธ ์„ฑ๋Šฅ์œผ๋กœ ๋ณด๋Š” ๊ฒƒ์ด๋‹ค. ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋กœ ๊ฒ€์ฆ(๊ต์ฐจ ๊ฒ€์ฆ)ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ‰๊ฐ€์— ๋Œ€ํ•œ ์‹ ๋ขฐ๊ฐ€ ์˜ฌ๋ผ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

k-๊ฒน ๊ต์ฐจ ๊ฒ€์ฆ์„ ์ง์ ‘ ์‹ค์Šต ํ•ด๋ณด์ž.

from sklearn import datasets
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression

import numpy as np
import pandas as pd

import warnings
warnings.simplefilter(action='ignore', category=FutureWarning) # ๊ฒฝ๊ณ  ๋ฉ”์„ธ์ง€ ๋ฌด์‹œํ•˜๋Š” ์šฉ๋„

iris_data = datasets.load_iris()

X = pd.DataFrame(iris_data.data, columns=iris_data.feature_names)
y = pd.DataFrame(iris_data.target, columns=['Class'])

logistic_model = LogisticRegression(max_iter=2000)

cross_val_score(logistic_model, X, y.values.ravel(), cv=5) # k-๊ฒน ๊ต์ฐจ ๊ฒ€์ฆ์„ ํ•  ๋ชจ๋ธ, ์ž…๋ ฅ ๋ณ€์ˆ˜, ๋ชฉํ‘œ ๋ณ€์ˆ˜, k๋ฅผ ์ •ํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ

์ด๋ ‡๊ฒŒ 5๊ฒน ๊ต์ฐจ ๊ฒ€์ฆ์„ ์ง„ํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ 5๊ฐœ์˜ ์„ฑ๋Šฅ์ด ๋„˜ํŒŒ์ด ๋ฐฐ์—ด๋กœ ์ถœ๋ ฅ๋œ๋‹ค.

array([0.96666667, 1.        , 0.93333333, 0.96666667, 1.        ])

์ด ์„ฑ๋Šฅ๋“ค์„ ํ‰๊ท ์„ ๋‚ด๋ฉด ์ผ๋ฐ˜ํ™”๋œ ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ์„ ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

np.average(cross_val_score(logistic_model, X, y.values.ravel(), cv=5)) # 5๊ฐœ์˜ ์„ฑ๋Šฅ์˜ ํ‰๊ท ์„ ๋‚ธ๋‹ค
๊ฒฐ๊ณผ: 0.9733333333333334

๐Ÿ’ก Stratified K-Fold Cross Validation (๊ณ„์ธต์  K-๊ฒน ๊ต์ฐจ ๊ฒ€์ฆ)

k-๊ฒน ๊ต์ฐจ ๊ฒ€์ฆ์—๋„ ๋‹จ์ ์ด ์žˆ๋‹ค. ๋ฐ”๋กœ ๋ฐ์ดํ„ฐ ํŽธํ–ฅ์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ, ์ œ๋Œ€๋กœ ๋œ ๋ชจ๋ธ ํ•™์Šต๊ณผ ๊ฒ€์ฆ์ด ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ํด๋ž˜์Šค 0์ด 95%, ํด๋ž˜์Šค 1์ด 5%์ธ ๋ฐ์ดํ„ฐ์…‹์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ์ผ๋ฐ˜ K-Fold๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ผ๋ถ€ ํด๋“œ์—์„œ๋Š” ํด๋ž˜์Šค 1์ด ๊ฑฐ์˜ ํฌํ•จ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค. ์ •๋ง ๊ทน๋‹จ์ ์œผ๋กœ๋Š” ์ผ๋ถ€ ํด๋“œ์—๋Š” ํด๋ž˜์Šค 0๋งŒ ๊ฐ€๋“์ฐจ ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ณ„์ธต์  K-๊ฒน ๊ต์ฐจ ๊ฒ€์ฆ์„ ํ•œ๋‹ค.
๊ณ„์ธต์  K-๊ฒน ๊ต์ฐจ ๊ฒ€์ฆ์€ ๋ชจ๋“  ํด๋“œ์—์„œ ํด๋ž˜์Šค์˜ ๋น„์œจ๋“ค์„ ๋™์ผํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ํŽธํ–ฅ๋˜์–ด ์žˆ์„ ๊ฒฝ์šฐ k-๊ฒน ๊ต์ฐจ ๊ฒ€์ฆ์„ ํ–ˆ์„ ๋•Œ๋ณด๋‹ค ๋” ์•ˆ์ •์ ์ธ ๋ชจ๋ธ ํ‰๊ฐ€๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

from sklearn.model_selection import StratifiedKFold, cross_val_score

# Stratified K-Fold ์„ค์ • (K=5)
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)

# ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€ ๋ชจ๋ธ ํ•™์Šต ๋ฐ ํ‰๊ฐ€
logistic_model = LogisticRegression(max_iter=200)

# ๊ต์ฐจ ๊ฒ€์ฆ ์ˆ˜ํ–‰
scores = cross_val_score(logistic_model, X, y, cv=skf)

๊ณ„์ธต์  k-๊ฒน ๊ต์ฐจ๊ฒ€์ฆ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ด๋ฏธ ๊ท ํ˜•๋˜์–ด ์žˆ๋‹ค๋ฉด ๊ทธ๋ƒฅ ์ผ๋ฐ˜ k-๊ฒน ๊ต์ฐจ ๊ฒ€์ฆ์„ ์‚ฌ์šฉํ•ด๋„ ์ข‹๋‹ค.
ํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ๊ฐ€ ๋„ˆ๋ฌด ์ ์–ด์„œ ํŠน์ • ํด๋ž˜์Šค๊ฐ€ ํŠน์ • ํด๋“œ์— ๊ฑฐ์˜ ํฌํ•จ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์‹ถ์„ ๋•Œ์— ๊ณ„์ธต์  k-๊ฒน ๊ต์ฐจ๊ฒ€์ฆ์„ ์‚ฌ์šฉํ•˜๋ฉด ํšจ๊ณผ์ ์ด๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๊ณ„์ธต์  k-๊ฒน ๊ต์ฐจ๊ฒ€์ฆ์€ ๋ถ„๋ฅ˜ ๋ฌธ์ œ์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํšŒ๊ท€์—์„œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

๐Ÿ“ LOOCV (Leave-One-Out Cross Validation)

LOOCV๋Š” K-Fold ๊ต์ฐจ ๊ฒ€์ฆ์˜ ๊ทน๋‹จ์ ์ธ ๊ฒฝ์šฐ๋กœ, k-๊ฒน ๊ต์ฐจ ๊ฒ€์ฆ์—์„œ๋Š” ์ƒ˜ํ”Œ๋ง๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ํด๋“œ(๊ตฐ์ง‘)์ด์ง€๋งŒ LOOCV์—์„œ๋Š” ๋‚ฑ๊ฐœ์ด๋‹ค.
๋‹ค์‹œ ๋งํ•ด LOOCV๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ฑ๊ฐœ๋กœ ๋ฝ‘์•„ K-Fold ๊ต์ฐจ ๊ฒ€์ฆ ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ๊ฐ€ N๊ฐœ ์žˆ์œผ๋ฉด, N-Fold ๊ต์ฐจ ๊ฒ€์ฆ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•˜๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

from sklearn.model_selection import LeaveOneOut, cross_val_score

# LOOCV ์„ค์ •
loo = LeaveOneOut()

# ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€ ๋ชจ๋ธ
logistic_model = LogisticRegression(max_iter=200)

# LOOCV ์ˆ˜ํ–‰
scores = cross_val_score(logistic_model, X, y, cv=loo)

LOOCV๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ฑ๊ฐœ๋กœ ์ƒ˜ํ”Œ๋ง ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฐ์‚ฐ ๋น„์šฉ์ด ๊ต‰์žฅํžˆ ํฌ๋‹ค. ๋”ฐ๋ผ์„œ LOOCV๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋งค์šฐ ์ ์ง€๋งŒ k-๊ฒน ๊ต์ฐจ ๊ฒ€์ฆ ๋ฐฉ์‹์€ ์ฑ„ํƒํ•˜๊ณ  ์‹ถ์„ ๋•Œ ํšจ๊ณผ์ ์ด๋‹ค.

๊ทธ๋ฆฌ๋“œ ์„œ์น˜๋Š” ํ•˜์ดํผ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํŠœ๋‹ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ด๋‹ค.
๋จผ์ € ํ•˜์ดํผ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

๐Ÿ’กํ•˜์ดํผ ํŒŒ๋ผ๋ฏธํ„ฐ(Hyperparameter)

Lasso ๋ชจ๋ธ์„ ์˜ˆ์‹œ๋กœ ๋ณด์ž.
scikit-learn์—์„œ Lasso ๋ชจ๋ธ์„ ๋งŒ๋“ค ๋•Œ alpha์™€ max_iter๋ผ๋Š” ์˜ต์…”๋„ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง€์ •ํ•ด์คฌ๋‹ค.

model = Lasso(alpha=0.001, max_iter=1000)

๋ณต์Šตํ•˜๋ฉด alpha ๋Š” ์ •๊ทœํ•ญ์— ๊ณฑํ•ด์ง€๋Š” ์ƒ์ˆ˜ ฮป\lambda์˜€๊ณ , max_iter ๋Š” ๊ฒฝ์‚ฌ ํ•˜๊ฐ•์„ ์ตœ๋Œ€ํ•œ ๋ช‡ ๋ฒˆ ํ• ์ง€๋ฅผ ์ •ํ•˜๋Š” ๊ฐ’์ด์—ˆ๋‹ค.

์ด ๋‘ ๊ฐ’์€ ๋ชจ๋ธ์ด ์ง์ ‘ ํ•™์Šตํ•ด์„œ ๋ฐฐ์šฐ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ๋ชจ๋ธ์„ ๋งŒ๋“œ๋Š” ์‚ฌ๋žŒ์ด ์ •ํ•ด์ค˜์•ผ ํ•œ๋‹ค.
์ด์ฒ˜๋Ÿผ ๋จธ์‹  ๋Ÿฌ๋‹ ๋ชจ๋ธ์„ ํ•™์Šต์‹œํ‚ค๊ธฐ ์ „์— ์‚ฌ๋žŒ์ด ๋ฏธ๋ฆฌ ์ •ํ•ด์ค˜์•ผ ๋˜๋Š” ๋ณ€์ˆ˜๋“ค์„ ํ•˜์ดํผ ํŒŒ๋ผ๋ฏธํ„ฐ๋ผ๊ณ  ํ•œ๋‹ค.

ํ•˜์ดํผ ํŒŒ๋ผ๋ฏธํ„ฐ์— ์–ด๋–ค ๊ฐ’์„ ๋„ฃ๋А๋ƒ์— ๋”ฐ๋ผ ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ์— ํฐ ์ฐจ์ด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ์„ ์ตœ๋Œ€ํ•œ ๋†’์—ฌ์ฃผ๋Š” ํ•˜์ดํผ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ณ ๋ฅด๋Š” ๊ฒŒ ๊ต‰์žฅํžˆ ์ค‘์š”ํ•˜๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์ด์ œ ์ข‹์€ ํ•˜์ดํผ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ณ ๋ฅด๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ธ ๊ทธ๋ฆฌ๋“œ ์„œ์น˜์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.

๐Ÿ“ Grid Search

๊ทธ๋ฆฌ๋“œ ์„œ์น˜๋Š” ์ •ํ•ด์ค˜์•ผ ํ•˜๋Š” ๊ฐ ํ•˜์ดํผ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋„ฃ์–ด๋ณด๊ณ  ์‹ถ์€ ํ›„๋ณด ๊ฐ’์„ ๋ช‡ ๊ฐœ์”ฉ ์ •ํ•œ ๋’ค, ๋ชจ๋“  ํ›„๋ณด ๊ฐ’์˜ ์กฐํ•ฉ์œผ๋กœ ๋ชจ๋ธ์„ ํ•™์Šต์‹œ์ผฐ์„ ๋•Œ ์„ฑ๋Šฅ์ด ๊ฐ€์žฅ ์ข‹์•˜๋˜ ํ•˜์ดํผ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํ•ฉ์„ ๊ณ ๋ฅด๋Š” ๋ฐฉ์‹์ด๋‹ค.

๊ทธ๋ฆผ์œผ๋กœ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๊ฐ ํ•˜์ดํผ ํŒŒ๋ผ๋ฏธํ„ฐ ํ›„๋ณด ๊ฐ’๋“ค์˜ ๋ชจ๋“  ์กฐํ•ฉ์œผ๋กœ ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ์„ ํ‰๊ฐ€ํ–ˆ์„ ๋•Œ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ํ‘œ๋Š” ์œ„์™€ ๊ฐ™๋‹ค. (์ด๋•Œ ์„ฑ๋Šฅ์€ k-๊ฒน ๊ต์ฐจ ๊ฒ€์ฆ์„ ์‚ฌ์šฉํ•ด์„œ ์กฐ๊ธˆ ๋” ์ •ํ™•ํ•˜๊ณ  ๊ณตํ‰ํ•˜๊ฒŒ ๊ณ„์‚ฐํ•œ๋‹ค.)

๊ทธ๋ฆฌ๊ณ  ๊ทธ ์„ฑ๋Šฅ๋“ค ์ค‘ ๊ฐ€์žฅ ์„ฑ๋Šฅ์ด ์ข‹์€(ํ‰๊ท  ์ œ๊ณฑ ์˜ค์ฐจ๊ทผ์ด ๋‚ฎ์„์ˆ˜๋ก ์„ฑ๋Šฅ์ด ์ข‹๋‹ค.) ํ•˜์ดํผ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํ•ฉ์„ ์„ ํƒํ•˜๋ฉด ๋œ๋‹ค.

์ด๋Ÿฐ ์‹์œผ๋กœ ํ‘œ๋กœ Grid(๊ฒฉ์ž ๋ชจ์–‘)๋ฅผ ๋งŒ๋“ค๊ณ , ์—ฌ๊ธฐ์„œ ์„ฑ๋Šฅ์ด ๊ฐ€์žฅ ์ข‹์€ ํ•˜์ดํผ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ์— Grid search๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

ํ•˜์ดํผ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ 2๊ฐœ ์ด์ƒ์ผ ๋•Œ๋„ ๋˜‘๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋ชจ๋“  ์กฐํ•ฉ์„ ํ™•์ธํ•œ ๋’ค ์„ฑ๋Šฅ์ด ๊ฐ€์žฅ ์ž˜ ๋‚˜์˜ค๋Š” ํ•˜์ดํผ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํ•ฉ์„ ์„ ํƒํ•˜๋ฉด ๋œ๋‹ค.

์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

from sklearn.linear_model import Lasso
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import PolynomialFeatures
from sklearn.model_selection import GridSearchCV
from math import sqrt

import numpy as np
import pandas as pd

admission_df = pd.read_csv('../data/admission_data.csv')

X = admission_df.drop('Chance of Admit ', axis=1)

polynomial_transformer = PolynomialFeatures(2) # 2์ฐจ์‹ ๋ณ€ํ˜•๊ธฐ ์ •์˜
polynomial_features = polynomial_transformer.fit_transform(X.values)
features = polynomial_transformer.get_feature_names_out(X.columns)

X = pd.DataFrame(polynomial_features, columns=features)
y = admission_df[['Chance of Admit ']]

hyper_parameter = { # ๊ฐ ํ•˜์ดํผ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ํ›„๋ณด๊ตฐ๋“ค์„ ๋‹ด์€ ๋”•์…”๋„ˆ๋ฆฌ
    'alpha': [0.01, 0.1, 1, 10],
    'max_iter': [100, 500, 1000, 1500, 2000]
}

lasso_model = Lasso()

hyper_parameter_tuner = GridSearchCV(lasso_model, hyper_parameter, cv=5) # ์‚ฌ์šฉํ•  ๋ชจ๋ธ, ์‹คํ—˜ํ•ด๋ณผ ํ•˜์ดํผ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’๋“ค, ๊ฐ ์„ฑ๋Šฅ ํŒ๋‹จ์‹œ ๋ช‡ ๊ฒน ๊ต์ฐจ ๊ฒ€์ฆ์„ ํ•  ๊ฑด์ง€
hyper_parameter_tuner.fit(X, y) # hyper_parameter_tuner์— X, y๋ฅผ ๋„ฃ์–ด์„œ ํ•˜์ดํผ ํŒŒ๋ผ๋ฏธํ„ฐ ํ›„๋ณด๋“ค ์ค‘ ์ด ๋ฐ์ดํ„ฐ์— ์•Œ๋งž๋Š” ์ตœ์ ์˜ ์กฐํ•ฉ์„ ์ฐพ๋Š”๋‹ค.(fit ํ•œ๋‹ค.)

hyper_parameter_tuner.best_params_ # ์ตœ์ ์˜ ํ•˜์ดํผ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํ•ฉ ํ™•์ธ
๊ฒฐ๊ณผ:
{'alpha': 1, 'max_iter': 100}

์ถœ์ฒ˜: ์ฝ”๋“œ์ž‡

0๊ฐœ์˜ ๋Œ“๊ธ€