[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 16. ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ๋ฌถ๊ณ , ๊ต์ฐจ ๊ฒ€์ฆ์œผ๋กœ ๋ชจ๋ธ์„ ํ‰๊ฐ€ํ•˜์ž!

2020. 2. 26. 03:47ยท๐Ÿฌ ML & Data/๐ŸŽซ ๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹
728x90

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

A. ํŒŒ์ดํ”„๋ผ์ธ์„ ์‚ฌ์šฉํ•œ ํšจ์œจ์ ์ธ ์›Œํฌํ”Œ๋กœ ๋งŒ๋“ค๊ธฐ

1. ์œ„์Šค์ฝ˜์‹  ์œ ๋ฐฉ์•” ๋ฐ์ดํ„ฐ์…‹

์œ„์Šค์ฝ˜์‹  ๋ฐ์ดํ„ฐ์…‹์€ ์•…์„ฑ๊ณผ ์–‘์„ฑ์ธ ์ข…์–‘ ์ƒ˜ํ”Œ 569๊ฐœ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์•ž์—์„œ ๋‘ ์—ด์€ ์ƒ˜ํ”Œ์˜ ID์™€ ์ง„๋‹จ๊ฒฐ๊ณผ๊ฐ€ ๋“ค์–ด์žˆ๊ณ , 3~32๋ฒˆ์งธ๊นŒ์ง€์˜ ์—ด์—๋Š” ์„ธํฌ ํ•ต์˜ ์ด๋ฏธ์ง€์—์„œ ๊ณ„์‚ฐ๋œ 30๊ฐœ ์‹ค์ˆ˜ ๊ฐ’ ํŠน์„ฑ์ด ๋“ค์–ด์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋‹จ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๋„๋ก ํ• ๊นŒ์š”? ์ด ๋ฐ์ดํ„ฐ์…‹์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ๋งํฌ์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.(https://archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+%28Diagnostic%29)

๋จผ์ €, pandas ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์…‹์„ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค.

import pandas as pd

df = pd.read_csv('https://archive.ics.uci.edu/ml/'
                 'machine-learning-databases'
                 '/breast-cancer-wisconsin/wdbc.data', header=None)
df.head()

๊ทธ๋ฆฌ๊ณ  30๊ฐœ ํŠน์„ฑ์„ ๋„˜ํŒŒ์ด ๋ฐฐ์—ด X์— ํ• ๋‹นํ•ด์ค€ ๋‹ค์Œ LabelEncoder๋กœ ๊ฐ์ฒด์˜ ์ง„๋‹จ ๊ฒฐ๊ณผ(ํด๋ž˜์Šค ๋ ˆ์ด๋ธ”์ž…๋‹ˆ๋‹ค)๋ฅผ ๋ฌธ์ž์—ด์—์„œ ์ •์ˆ˜๋กœ ๋ฐ”๊พธ์–ด์ค๋‹ˆ๋‹ค. ์›๋ž˜๋Š” ์•…์„ฑ์„ ๋œปํ•˜๋Š” M๊ณผ ์–‘์„ฑ์„ ๋œปํ•˜๋Š” B๋ฅผ ์ •์ˆ˜ํ˜•์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค.

from sklearn.preprocessing import LabelEncoder

X = df.loc[:, 2:].values
y = df.loc[:, 1].values
le = LabelEncoder()
y = le.fit_transform(y)
le.classes_

ํด๋ž˜์Šค ๋ ˆ์ด๋ธ”์„ ๋ฐฐ์—ด y์— ์ธ์ฝ”๋”ฉ์„ ํ•ด์ฃผ๋ฉด ์•…์„ฑ ์ข…์–‘์€ 1๋กœ, ์–‘์„ฑ ์ข…์–‘์€ 0์œผ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค. LabelEncoder ๊ฐ์ฒด์˜ transfrom ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ๋งคํ•‘์ด ์ž˜ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

le.transform(['M', 'B'])
#array([1, 0])

๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ, ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์„ฑํ•˜๊ธฐ ์ „์— ๋ฐ์ดํ„ฐ์…‹์„ ํ›ˆ๋ จ๊ณผ ํ…Œ์ŠคํŠธ ์„ธํŠธ๋กœ ๋‚˜๋ˆ„์–ด์ค๋‹ˆ๋‹ค.

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = \
    train_test_split(X, y, 
                     test_size=0.20,
                     stratify=y,
                     random_state=1)

2. ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ๋ณ€ํ™˜๊ธฐ์™€ ์ถ”์ •๊ธฐ ์—ฐ๊ฒฐํ•˜๊ธฐ

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

ํ›ˆ๋ จ ์„ธํŠธ์™€ ํ…Œ์ŠคํŠธ ์„ธํŠธ๋ฅผ ๊ฐ๊ฐ ํ•™์Šต ๋ฐ ๋ณ€ํ™˜ํ•˜๋Š” ๋Œ€์‹  StandardScaler, PCA, LogisticRegression ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜์˜ ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ๋ฌถ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import make_pipeline

pipe_lr = make_pipeline(StandardScaler(),
                        PCA(n_components=2),
                        LogisticRegression(solver='liblinear', random_state=1))

pipe_lr.fit(X_train, y_train)
y_pred = pipe_lr.predict(X_test)
print('ํ…Œ์ŠคํŠธ ์ •ํ™•๋„: %.3f' % pipe_lr.score(X_test, y_test))
#ํ…Œ์ŠคํŠธ ์ •ํ™•๋„: 0.956

์œ„ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉ๋œ ํด๋ž˜์Šค์™€ ํ•จ์ˆ˜๋“ค, ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ดํŽด๋ณด๋„๋ก ํ• ๊นŒ์š”?

๋จผ์ € make_pipeline ํ•จ์ˆ˜๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ์‚ฌ์ดํ‚ท๋Ÿฐ ๋ณ€ํ™˜๊ธฐ์™€ ๊ทธ ๋’ค์˜ ์‚ฌ์ดํ‚ท๋Ÿฐ ์ถ”์ •๊ธฐ๋ฅผ ์—ฐ๊ฒฐ์‹œ์ผœ์ค๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์‚ฌ์ดํ‚ท๋Ÿฐ ๋ณ€ํ™˜๊ธฐ๋Š” ์ž…๋ ฅ์— ๋Œ€ํ•ด fit ๋ฉ”์„œ๋“œ์™€ transform ๋ฉ”์„œ๋“œ๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฐ์ฒด์ด๊ณ , ์‚ฌ์ดํ‚ท๋Ÿฐ ์ถ”์ •๊ธฐ๋Š” fit ๋ฉ”์„œ๋“œ์™€ predict ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ์œ„ ์ฝ”๋“œ์—์„œ๋Š” StandardScaler, PCA ๋‘ ๊ฐœ์˜ ๋ณ€ํ™˜๊ธฐ์™€ LogisticRegression ์ถ”์ •๊ธฐ๋ฅผ make_pipeline์˜ ์ž…๋ ฅ์œผ๋กœ ๋„ฃ์–ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์ด์ œ ์‚ฌ์ดํ‚ท๋Ÿฐ์˜ Pipeline ํด๋ž˜์Šค ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋ฐ˜ํ™˜ํ•ด์ค๋‹ˆ๋‹ค.

์ด Pipeline ํด๋ž˜์Šค๋ฅผ ๋ฉ”ํƒ€ ์ถ”์ •๊ธฐ(meta-estimator)๋‚˜ ๋ณ€ํ™˜๊ธฐ์™€ ์ถ”์ •๊ธฐ๋ฅผ ๊ฐ์‹ผ ์ผ์ข…์˜ ๋žฉ์ด๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Pipeline ๊ฐ์ฒด์˜ fit ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ๊ทธ ์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  ๋ณ€ํ™˜๊ธฐ์˜ fit๊ณผ transform ๋ฉ”์„œ๋“œ๋ฅผ ๊ฑฐ์ณ์„œ ์ถ”์ •๊ธฐ์— ๋„์ฐฉํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ํ•™์Šต์„ ํ•˜์ฃ .

์œ„ ์ฝ”๋“œ์˜ pipe_lr์˜ fit ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ StandardScaler์˜ fit๊ณผ transform๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ณ€ํ™˜๋œ ํ›ˆ๋ จ ์„ธํŠธ๊ฐ€ ๋‹ค์Œ PCA๊ฐ์ฒด๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์œ— ๋‹จ๊ณ„์™€ ๋น„์Šทํ•˜๊ฒŒ ์กฐ์ •๋œ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์— PCA์˜ fit๊ณผ transform ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ถ”์ •๊ธฐ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ „๋‹ฌ๋˜์ฃ .

์ด์ œ LogisticRegression์ด ์ด ๋ฐ์ดํ„ฐ๋กœ ํ•™์Šต์„ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํŒŒ์ดํ”„๋ผ์ธ์˜ ์ค‘๊ฐ„ ๋‹จ๊ณ„๋Š” ๊ฐœ์ˆ˜์— ์ƒ๊ด€์€ ์—†์ง€๋งŒ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋Š” ๋ฐ˜๋“œ์‹œ ์ถ”์ •๊ธฐ์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ดํ”„๋ผ์ธ์—์„œ๋Š” predict ๋ฉ”์„œ๋“œ๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ์˜ ๋ฐ์ดํ„ฐ๋Š” ์ค‘๊ฐ„ ๋‹จ๊ณ„์— ์žˆ์—ˆ๋˜ transform ๋ฉ”์„œ๋“œ๋ฅผ ํ†ต๊ณผํ•˜๊ณ , ๋ณ€ํ™˜๋œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์˜ˆ์ธก์€ ์ถ”์ •๊ธฐ๊ฐ€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์•„๋ž˜ ๊ทธ๋ฆผ์ด ์ดํ•ด์— ๋„์›€์ด ๋˜์‹ค ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

B. k-๊ฒน ๊ต์ฐจ ๊ฒ€์ฆ์„ ์ด์šฉํ•œ ๋ชจ๋ธ ์„ฑ๋Šฅ ํ‰๊ฐ€

๊ณผ์†Œ์ ํ•ฉ๊ณผ ๊ณผ๋Œ€์ ํ•ฉ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด์„œ ์šฐ๋ฆฌ๋Š” ๋ณดํŽธ์ ์ธ ๊ต์ฐจ ๊ฒ€์ฆ ๊ธฐ๋ฒ•์ธ ํ™€๋“œ์•„์›ƒ ๊ต์ฐจ ๊ฒ€์ฆ(holdout cross-validation)๊ณผ k-๊ฒน ๊ต์ฐจ ๊ฒ€์ฆ(k-fold cross-validation)์„ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

1. ํ™€๋“œ์•„์›ƒ ๋ฐฉ๋ฒ•

ํ™€๋“œ์•„์›ƒ ๊ต์ฐจ ๊ฒ€์ฆ์€ ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ํ…Œ์ŠคํŠธ์™€ ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ๋กœ ๋‚˜๋ˆ„์–ด์ค๋‹ˆ๋‹ค. ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ๋Š” ๋ชจ๋ธ ํ›ˆ๋ จ์—, ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋Š” ์ผ๋ฐ˜ํ™” ์„ฑ๋Šฅ์„ ์ถ”์ •ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต ์ฒ˜์Œ ๋ณด๋Š” ๋ฐ์ดํ„ฐ์ธ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ์—์„œ์˜ ์˜ˆ์ธก ์„ฑ๋Šฅ์„ ์˜พ์ด๊ธฐ ์œ„ํ•ด์„œ ํ•˜์ดํผ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํŠœ๋‹ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์„ ๋ชจ๋ธ ์„ ํƒ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

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

๋ชจ๋ธ ์„ ํƒ์— ํ™€๋“œ์•„์›ƒ ๋ฐฉ๋ฒ•์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ›ˆ๋ จ ์„ธํŠธ, ๊ฒ€์ฆ ์„ธํŠธ(๋ชจ๋ธ ์„ ํƒ), ํ…Œ์ŠคํŠธ ์„ธํŠธ์—์„œ ์„ฑ๋Šฅ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ฒŒ 3๊ฐœ๋กœ ๋‚˜๋ˆ„์–ด์ค๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ํ…Œ์ŠคํŠธ ์„ธํŠธ๊ฐ€ ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋กœ ๋ถ„๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ถ”์ •ํ•  ๋•Œ ๋œ ํŽธํ–ฅ๋œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ๊ทธ๋ฆผ์—์„œ ํ™€๋“œ์•„์›ƒ ๊ต์ฐจ ๊ฒ€์ฆ ๋ฐฉ๋ฒ•์„ ์š”์•ฝํ•ด์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค!

๊ฒ€์ฆ ์„ธํŠธ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์„ ๋ฐ”๊ฟ”๊ฐ€๋ฉด์„œ ๋ชจ๋ธ์„ ํ›ˆ๋ จํ•˜๊ณ  ํ‰๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์ด ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐ๋œ๋‹ค๋ฉด ์ด์ œ ํ…Œ์ŠคํŠธ ์„ธํŠธ์—์„œ ๋ชจ๋ธ์˜ ์ผ๋ฐ˜ํ™” ์„ฑ๋Šฅ์„ ์ถ”์ •ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ํ™€๋“œ์•„์›ƒ ๋ฐฉ๋ฒ•์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜๋ˆ„๋Š” ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ์„ฑ๋Šฅ์„ ํ‰๊ฐ€ํ•˜๋Š”๋ฐ ์˜ˆ๋ฏผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒ€์ฆ ์„ธํŠธ์— ์–ด๋–ค ์ƒ˜ํ”Œ์ด ๋“ค์–ด๊ฐ€๋А๋ƒ๊ฐ€ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์ฃ .

2. k-๊ฒน ๊ต์ฐจ ๊ฒ€์ฆ

k-๊ฒน ๊ต์ฐจ ๊ฒ€์ฆ์—์„œ๋Š” ์ค‘๋ณต์—†์ด ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ๋ฅผ k๊ฒน์œผ๋กœ ๋žœ๋คํ•˜๊ฒŒ ๋‚˜๋ˆ„์–ด์ค๋‹ˆ๋‹ค. k-1๊ฒน์œผ๋กœ ๋ชจ๋ธ์„ ํ›ˆ๋ จํ•˜๊ณ , ๋‚˜๋จธ์ง€ ํ•˜๋‚˜๋กœ ์„ฑ๋Šฅ์„ ํ‰๊ฐ€ํ•˜์ฃ . ์ด ๊ณผ์ •์„ k๋ฒˆ ๋ฐ˜๋ณตํ•ด k๊ฐœ ๋ชจ๋ธ์„ ์–ป์„ ์ˆ˜ ์žˆ๊ณ , ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ๋„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ฐ๊ฐ์˜ ํด๋“œ์—์„œ ์–ป์€ ์„ฑ๋Šฅ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ‰๊ท  ์„ฑ๋Šฅ์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” ํ™€๋“œ์•„์›ƒ ๋ฐฉ๋ฒ•๋ณด๋‹ค ๋ฐ์ดํ„ฐ ๋ถ„ํ• ์— ๋œ ์˜ˆ๋ฏผํ•œ ์„ฑ๋Šฅ ํ‰๊ฐ€๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ๋‹ค์Œ์— ํ›ˆ๋ จ ์„ธํŠธ๋กœ ๋‹ค์‹œ ํ›ˆ๋ จ์‹œํ‚ค๊ณ , ํ…Œ์ŠคํŠธ์„ธํŠธ๋กœ ์„ฑ๋Šฅ ํ‰๊ฐ€๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.

k-๊ฒน ๊ต์ฐจ ๊ฒ€์ •์€ ์ค‘๋ณต์„ ํ—ˆ๋ฝํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ์ƒ˜ํ”Œ์ด ๊ฒ€์ฆ์— ๋”ฑ ํ•œ ๋ฒˆ ์‚ฌ์šฉ๋˜๊ณ , ๋ชจ๋ธ ์„ฑ๋Šฅ ํ‰๊ฐ€์˜ ๋ถ„์‚ฐ์ด ๋‚ฎ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ๊ทธ๋ฆผ์—์„œ E๋Š” ํ‰๊ท  ์„ฑ๋Šฅ์ด๊ณ , En์€ ๊ฐ ํŽผ๋“œ์˜ ์ถ”์ •๋œ ์„ฑ๋Šฅ์ž…๋‹ˆ๋‹ค.

์ฑ…์˜ ์ €์ž๊ฐ€ ์ถ”์ฒœํ•˜๋Š” ์ข‹์€ k ๊ธฐ๋ณธ๊ฐ’์€ 10์ž…๋‹ˆ๋‹ค. ๋น„๊ต์  ์ž‘์€ ํ›ˆ๋ จ ์„ธํŠธ๊ฐ€ ์žˆ๋‹ค๋ฉด ํด๋“œ ๊ฐœ์ˆ˜๋ฅผ ๋Š˜๋ฆฌ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

k๊ฐ’์ด ํฌ๋ฉด ๋” ๋งŽ์€ ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ˜๋ณต๋งˆ๋‹ค ์‚ฌ์šฉ๋˜๊ณ  ์„ฑ๋Šฅ์„ ์ถ”์ •ํ•  ๋•Œ ํŽธํ–ฅ๋˜๋Š” ์ •๋„๊ฐ€ ์ž‘์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด k๊ฐ’์ด ์•„์ฃผ ํฌ๋ฉด ์‹คํ–‰ ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง€๊ณ  ๋ถ„์‚ฐ์ด ๋†’์€ ๊ฒฐ๊ณผ๋ฅผ ๋ƒ…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํฐ ๋ฐ์ดํ„ฐ์—์„œ๋Š” ์‹œ๊ฐ„์„ ์ƒ๊ฐํ•ด์„œ ์กฐ๊ธˆ ์ž‘์€ k๊ฐ’์„ ์„ ํƒํ•ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ k-๊ฒน ๊ต์ฐจ ๊ฒ€์ฆ๋ณด๋‹ค ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ณ„์ธต์  k-๊ฒน ๊ต์ฐจ๊ฒ€์ฆ(stratified k-fold cross validation)์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๊ฒน์˜ ํด๋ž˜์Šค ๋น„์œจ์ด ์ „์ฒด ํ›ˆ๋ จ ์„ธํŠธ์™€ ๋™์ผํ•œ ๋น„์œจ์„ ๊ฐ–๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค. ์ฝ”๋“œ๋กœ ๋ณผ๊นŒ์š”?

import numpy as np
from sklearn.model_selection import StratifiedKFold


kfold = StratifiedKFold(n_splits=10,
                        random_state=1).split(X_train, y_train)

scores = []
for k, (train, test) in enumerate(kfold):
    pipe_lr.fit(X_train[train], y_train[train])
    score = pipe_lr.score(X_train[test], y_train[test])
    scores.append(score)
    print('ํด๋“œ: %2d, ํด๋ž˜์Šค ๋ถ„ํฌ: %s, ์ •ํ™•๋„: %.3f' % (k+1,
          np.bincount(y_train[train]), score))

print('\nCV ์ •ํ™•๋„: %.3f +/- %.3f' % (np.mean(scores), np.std(scores)))

์‚ฌ์ดํ‚ท๋Ÿฐ์˜ StratifiedKFold ๋ฐ˜๋ณต์ž๋ฅผ ํ†ตํ•ด ์˜ˆ์‹œ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๋จผ์ € sklearn.model_selection ๋ชจ๋“ˆ์˜ StratifiedKFoldํด๋ž˜์Šค๋ฅผ y_train์— ์ „๋‹ฌํ•ด ์ดˆ๊ธฐํ™”ํ•ด์ฃผ๊ณ , n_splits ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด k์˜ ๊ฐ’์„ ์ง€์ •ํ•ด์ค๋‹ˆ๋‹ค.

pipe_lr ํŒŒ์ดํ”„ ๋ผ์ธ์„ ์‚ฌ์šฉํ•ด ์Šค์ผ€์ผ์„ ์กฐ์ • ์‹œ์ผœ์ฃผ๊ณ , ๋ชจ๋ธ์˜ ์ •ํ™•๋„ ์ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ๋ณด๋‹ค ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ, ์‚ฌ์ดํ‚ท๋Ÿฐ์ด ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ๋„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

from sklearn.model_selection import cross_val_score

scores = cross_val_score(estimator=pipe_lr,
                         X=X_train,
                         y=y_train,
                         cv=10,
                         n_jobs=1)
print('CV ์ •ํ™•๋„ ์ ์ˆ˜: %s' % scores)
print('CV ์ •ํ™•๋„: %.3f +/- %.3f' % (np.mean(scores), np.std(scores)))

cross_val_score ํ•จ์ˆ˜๋Š” ๊ฐ ํด๋“œ, ์ฆ‰ ๊ฒน์— ๋Œ€ํ•œ ํ‰๊ฐ€๋ฅผ ์ปดํ“จํ„ฐ์— ์žˆ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ CPU ์ฝ”์–ด๋กœ ๋ถ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ž์„  ์˜ˆ์—์„œ์ฒ˜๋Ÿผ n_jobs๋ฅผ 1๋กœ ์„ค์ •ํ•˜๋ฉด 1๊ฐœ์˜ CPU ์ฝ”์–ด๋งŒ ์„ฑ๋Šฅ ํ‰๊ฐ€์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. -1๋กœ ์„ค์ •ํ•˜๋ฉด ์ปดํ“จํ„ฐ์˜ ๋ชจ๋“  CPU ์ฝ”์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 


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

 

728x90
์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'๐Ÿฌ ML & Data > ๐ŸŽซ ๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 18. ROC ๊ณก์„ ๊ณผ ๋ถˆ๊ท ํ˜• ๋ฐ์ดํ„ฐ ๊ท ํ˜• ๋งž์ถ”๊ธฐ!  (0) 2020.02.29
[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 17. ํ•™์Šต๊ณผ ๊ฒ€์ฆ ๊ณก์„ , ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ฆฌ๋“œ ์„œ์น˜  (0) 2020.02.28
[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 15. ์ปค๋„ PCA๋ฅผ ์ด์šฉํ•œ ๋น„์„ ํ˜• ๋งคํ•‘  (0) 2020.02.24
[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 14. LDA๋ฅผ ํ†ตํ•œ ์ง€๋„ํ•™์Šต๋ฐฉ์‹ ๋ฐ์ดํ„ฐ ์••์ถ•  (0) 2020.02.21
[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 13. ๋น„์ง€๋„ ์ฐจ์›์ถ•์†Œ! PCA!  (0) 2020.02.18
'๐Ÿฌ ML & Data/๐ŸŽซ ๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 18. ROC ๊ณก์„ ๊ณผ ๋ถˆ๊ท ํ˜• ๋ฐ์ดํ„ฐ ๊ท ํ˜• ๋งž์ถ”๊ธฐ!
  • [๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 17. ํ•™์Šต๊ณผ ๊ฒ€์ฆ ๊ณก์„ , ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ฆฌ๋“œ ์„œ์น˜
  • [๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 15. ์ปค๋„ PCA๋ฅผ ์ด์šฉํ•œ ๋น„์„ ํ˜• ๋งคํ•‘
  • [๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 14. LDA๋ฅผ ํ†ตํ•œ ์ง€๋„ํ•™์Šต๋ฐฉ์‹ ๋ฐ์ดํ„ฐ ์••์ถ•
darly213
darly213
ํ˜ธ๋ฝํ˜ธ๋ฝํ•˜์ง€ ์•Š์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด๋ณด์ž
  • darly213
    ERROR DENY
    darly213
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (97)
      • ๐Ÿฌ ML & Data (50)
        • ๐ŸŒŠ Computer Vision (2)
        • ๐Ÿ“ฎ Reinforcement Learning (12)
        • ๐Ÿ“˜ ๋…ผ๋ฌธ & ๋ชจ๋ธ ๋ฆฌ๋ทฐ (8)
        • ๐Ÿฆ„ ๋ผ์ดํŠธ ๋”ฅ๋Ÿฌ๋‹ (3)
        • โ” Q & etc. (5)
        • ๐ŸŽซ ๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹ (20)
      • ๐Ÿฅ Web (21)
        • โšก Back-end | FastAPI (2)
        • โ›… Back-end | Spring (5)
        • โ” Back-end | etc. (9)
        • ๐ŸŽจ Front-end (4)
      • ๐ŸŽผ Project (8)
        • ๐ŸงŠ Monitoring System (8)
      • ๐Ÿˆ Algorithm (0)
      • ๐Ÿ”ฎ CS (2)
      • ๐Ÿณ Docker & Kubernetes (3)
      • ๐ŸŒˆ DEEEEEBUG (2)
      • ๐ŸŒ  etc. (8)
      • ๐Ÿ˜ผ ์‚ฌ๋‹ด (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ๋ฐฉ๋ช…๋ก
    • GitHub
    • Notion
    • LinkedIn
  • ๋งํฌ

    • Github
    • Notion
  • ๊ณต์ง€์‚ฌํ•ญ

    • Contact ME!
  • 250x250
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
darly213
[๋ผ์ดํŠธ ๋จธ์‹ ๋Ÿฌ๋‹] Session 16. ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ๋ฌถ๊ณ , ๊ต์ฐจ ๊ฒ€์ฆ์œผ๋กœ ๋ชจ๋ธ์„ ํ‰๊ฐ€ํ•˜์ž!
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”