AI/Machine Learning

[ML] ํ•ธ์ฆˆ์˜จ ๋จธ์‹ ๋Ÿฌ๋‹ - 10์žฅ(ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ ํŠœ๋‹)

์ดํƒœํ™ 2023. 1. 6. 16:30

๐Ÿค”ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ ํŠœ๋‹

์‹ ๊ฒฝ๋ง์€ ์œ ์—ฐํ•œ ๋งŒํผ ์กฐ์ •ํ•ด์•ผํ•  ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋งค์šฐ ๋งŽ์Šต๋‹ˆ๋‹ค.

 

๋ณต์žกํ•œ ๋„คํŠธ์›Œํฌ ๊ตฌ์กฐ์—์„œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ฐ„๋‹จํ•œ ๋‹ค์ธต ํผ์…‰ํŠธ๋ก ์—์„œ๋„ ์ธต์˜ ๊ฐœ์ˆ˜, ์ธต๋งˆ๋‹ค ์žˆ๋Š” ๋‰ด๋Ÿฐ์˜ ๊ฐœ์ˆ˜, ๊ฐ ์ธต์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํ™œ์„ฑํ™”ํ•จ์ˆ˜, ๊ฐ€์ค‘์น˜ ์ดˆ๊ธฐํ™” ์ „๋žต ๋“ฑ ๋งŽ์€ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์–ด๋–ค ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํ•ฉ์ด ๊ฐ€์žฅ ์ตœ์ ์ธ์ง€ ์•Œ์•„์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

๊ทธ์ค‘ ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ๋‹ค์–‘ํ•œ ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‹ค์ œ๋กœ ์กฐํ•ฉํ•˜์—ฌ ์‹œ๋„ํ•ด๋ณด๊ณ  Validation์—์„œ ์ข‹์€ ์ ์ˆ˜๋ฅผ ๋‚ด๋Š” ์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

 

์ด์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

 

 

 

 

 

 

๐Ÿ”Ž Validation ์ด์šฉํ•˜๊ธฐ

GridSearchCV ๋˜๋Š” RandomizedSearchCV๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ ๊ณต๊ฐ„์„ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด๋•Œ CV๋Š” Cross Validaition์˜ ์•ฝ์ž๋กœ ๊ต์ฐจ๊ฒ€์ฆ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

 

 

 

GridSearchCV

GridSearchCV๋ž€ ๊ต์ฐจ ๊ฒ€์ฆ ์ ์ˆ˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ์˜ ์ตœ์ ์˜ ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.

 

๋ง ๊ทธ๋Œ€๋กœ ๊ฒฉ์ž ํƒ์ƒ‰์ด๋ผ๋Š” ์˜๋ฏธ๋กœ ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ’๋“ค์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ž…๋ ฅํ•œ ๋’ค์— ๊ฐ€์žฅ ๋†’์€ ์„ฑ๋Šฅ์„ ๋ณด์ด๋Š” ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์„ ์ฐพ๋Š” ํƒ์ƒ‰ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐฉ์˜ ๋ฐฐ์น˜๋ฅผ ํ•  ๋•Œ ์ฑ…์€ ๋ช‡๊ถŒ์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š” ์ฑ…์žฅ์„ ๋‘์–ด์•ผ ํ•˜๋Š” ์ง€, ์˜์ž๋ฅผ ๋ช‡ ๊ฐœ๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•  ์ง€ ๋“ฑ๊ณผ ๊ฐ™์ด

์„ธ๋ถ€์ ์ธ ๊ทœ์œจ์„ ์„ธ์šฐ๋Š” ๊ฒƒ์ธ๋ฐ ๊ฐ€์žฅ ์ตœ์ ์˜ ํšจ์œจ์„ ๋‚ด๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ๋ฐฉ๋ฒ•๋“ค์„ ์ˆœ์ฐจ์ ์œผ๋ฃจ ์‹คํ–‰ํ•˜์—ฌ ๊ฐ€์žฅ ๋†’์€ ์„ฑ๋Šฅ์„ ๋ณด์ด๋Š” ๊ฒƒ์„ ์„ ํƒํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

 

์ด๋ฅผ ์ฝ”๋“œ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ผ€๋ผ์Šค ๋ชจ๋ธ์„ ์‚ฌ์ดํ‚ท๋Ÿฐ ์ถ”์ •๊ธฐ์ฒ˜๋Ÿผ ๋ณด์ด๋„๋ก ๋ฐ”๊พธ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

def build_model(n_hidden=1, n_neurons=30, learning_rate=3e-3, input_shape=[8]):
	model = keras.models.Sequential()
	model.add(keras.layers.InputLayer(input_shape=input_shape))
	for layer in range(n_hidden):
		model.add(keras.layers.Dense(n_neurons, activation="relu"))
	model.add(keras.layers.Dense(1))
	optimizer = keras.optimizers.SGD(lr=learning_rate)
	model.compile(loss="mse", optimizer=optimizer)
	return model

 

ํ•ด๋‹น ํ•จ์ˆ˜๋Š” ์ฃผ์–ด์ง„ ์ž…๋ ฅ ํฌ๊ธฐ์™€ ์€๋‹‰์ธต ๊ฐœ์ˆ˜, ๋‰ด๋Ÿฐ ๊ฐœ์ˆ˜๋กœ ๋‹จ๋ณ€๋Ÿ‰ ํšŒ๊ท€๋ฅผ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ Sequential ๋ชจ๋ธ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

 

๋˜ํ•œ SGD optimizer๋ฅผ ์ด์šฉํ•˜์—ฌ ์ง€์ •๋œ ํ•™์Šต๋ฅ ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.(์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” ์ตœ์ ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์„ ๋งํ•ฉ๋‹ˆ๋‹ค)

 

์ดํ›„ build_model()ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ KerasRegressor ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋•Œ KerasRegressor ๊ฐ์ฒด๋Š” ๋ชจ๋ธ์„ ๊ฐ์‹ธ๋Š” ๊ฐ„๋‹จํ•œ wrapper์ž…๋‹ˆ๋‹ค.

 

์ผ๋ฐ˜์ ์ธ ๋ชจ๋ธ ํ›ˆ๋ จ์„ ํ•˜๋“ฏ fit()๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ํ‰๊ฐ€ํ•  ๋•Œ predict()๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

keras_reg = keras.wrapper.scikit_learn.KerasRegressor(build_model)
keras_reg.fit(X_train, y_train, epochs=100,
validation_data = (X_valid, y_valid), callbacks=[kears.callbacks.EarlyStopping(patience=10)])
mse_test = kears_reg.score(X_test, y_test)
y_pred = kera_reg.predict(X_new)

 

 

 

 

 

 

 

 

๐Ÿ”Ž RandomizedSearchCV

RandomizedSearchCV๋Š” k-fold cross validation์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋–„๋ฌธ์— X_valid์™€ y_valid๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

RandomizedSearchCV๋Š” ํ•˜๋“œ์›จ์–ด์™€ ๋ฐ์ดํ„ฐ์…‹์˜ ํฌ๊ธฐ, ๋ชจ๋ธ์˜ ๋ณต์žก๋„, n_iter, CV๋งค๊ฐœ๋ณ€์ˆ˜์— ๋”ฐ๋ผ ๋งŽ์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์‹คํ–‰์ด ๋๋‚˜๋ฉด ๋žœ๋ค ํƒ์ƒ‰์ด ์ฐพ์€ ์ตœ์ƒ์˜ ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ์™€ ํ›ˆ๋ จ๋œ ์ผ€๋ผ์Šค ๋ชจ๋ธ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

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

 

from scipy.stats import reciprocal
from sklearn.model_selection import RandomizedSearchCV

param_distribs = {
    "n_hidden": [0, 1, 2, 3],
    "n_neurons": np.arange(1, 100),
    "learning_rate": reciprocal(3e-4, 3e-2)
    }
    
rnd_search_cv = RandomizedSearchCV(keras_reg, param_distribs, n_iter=10, cv=3, verbose=2)
rnd_search_cv.fit(X_train, y_train, epochs=100, validation_data=(X_valid, y_valid),
                  callbacks=[keras.callbacks.EarlyStopping(patience=10)])