๐Ÿ“’ [ TIL ] 2022.05.12_18์ผ์ฐจ # ๋จธ์‹ ๋Ÿฌ๋‹ ๊ฐ•์˜ํ•™์Šต(1)

๋ฌธ๋ช…์ฃผยท2022๋…„ 5์›” 12์ผ
0

[ 2022-05-12 (๋ชฉ) ์˜ค๋Š˜์˜ TIL ]

[ Today Learn ]

  • ๋จธ์‹ ๋Ÿฌ๋‹์˜ ๊ธฐ์ดˆ๊ฐœ๋…
  • ์„ ํ˜•ํšŒ๊ท€ ๋ฐ ๋‹ค์ค‘์„ ํ˜•ํšŒ๊ท€
  • Colab๊ณผ Kaggle์„ ์ด์šฉํ•œ ์‹ค์Šต

โœ๏ธ ๋‚ด๊ฐ€ ๋ฐฐ์šด๊ฒƒ, ์–ป์€๊ฒƒ

โ“ ๋จธ์‹ ๋Ÿฌ๋‹์ด๋ž€ ?

์ธ๊ณต์ง€๋Šฅ์˜ ํ•œ ๋ถ„์•ผ๋กœ ์ปดํ“จํ„ฐ๊ฐ€ ํ•™์Šตํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๊ธฐ์ˆ ์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ถ„์•ผ

๋จธ์‹ ๋Ÿฌ๋‹์€ ํฌ๊ฒŒ 3๊ฐ€์ง€๋กœ ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ง€๋„ํ•™์Šต
    ์ •๋‹ต์„ ์•Œ๋ ค์ฃผ๋ฉด์„œ ํ•™์Šต์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•
  • ๋น„์ง€๋„ํ•™์Šต
    ์ •๋‹ต์„ ์•Œ๋ ค์ฃผ์ง€ ์•Š๊ณ  ๊ตฐ์ง‘ํ™”(Clustering)ํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ๊ฐ•ํ™”ํ•™์Šต
    ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ์—†์ด ์‹คํ–‰๊ณผ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ํ•™์Šตํ•˜๋Š” ๋ฐฉ๋ฒ• (ex.์•ŒํŒŒ๊ณ )

๋จธ์‹ ๋Ÿฌ๋‹์—์„œ ๋ฌธ์ œ๋ฅผ ํ’€๋•Œ, ํ•ด๋‹ต์„ ๋‚ด๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

* ํšŒ๊ท€ (Regression)
์—ฌ๋Ÿฌ๊ฐœ์˜ ๋…๋ฆฝ๋ณ€์ˆ˜์™€ ํ•œ ๊ฐœ์˜ ์ข…์†๋ณ€์ˆ˜ ๊ฐ„์˜ ์ƒ๊ด€๊ด€๊ณ„๋ฅผ ๋ชจ๋ธ๋งํ•˜๋Š” ๊ธฐ๋ฒ•

๐Ÿงฉ ์ ์šฉ ์˜ˆ์‹œ

๐Ÿ”Ž ์‚ฌ๋žŒ์˜ ์–ผ๊ตด ์‚ฌ์ง„์„ ๋ณด๊ณ  ๋ช‡ ์‚ด์ธ์ง€ ์˜ˆ์ธกํ•˜๋Š” ๋ฌธ์ œ
   input๊ฐ’: ์–ผ๊ตด์‚ฌ์ง„ 
   output๊ฐ’: ์˜ˆ์ธกํ•œ ๋‚˜์ด 

์—ฌ๊ธฐ์„œ ๋‚˜์ด์˜ ๊ฐ’์€ ์—ฐ์†์ (1์„ธ~n์„ธ,,)์œผ๋กœ ์—ฐ์†์ ์ธ ์†Œ์ˆ˜์ ์œผ๋กœ ์˜ˆ์ธกํ•˜์—ฌ ํ’€์ˆ˜์žˆ๋‹ค.

* ๋ถ„๋ฅ˜ (Classification)
์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ํด๋ž˜์Šค ๋ณ„๋กœ ๊ตฌ๋ณ„ํ•ด ๋‹ค์–‘ํ•œ ๋ถ„๋ฅ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด์„œ ํ•™์Šต์‹œ์ผœ ๋ชจ๋ธ๋งํ•˜๋Š” ๊ธฐ๋ฒ•

๐Ÿงฉ ์ ์šฉ ์˜ˆ์‹œ ( ์ด์ง„๋ถ„๋ฅ˜ )

๐Ÿ”Ž ๋Œ€ํ•™๊ต ์‹œํ—˜ ์ „ ๋‚  ๊ณต๋ถ€ํ•œ ์‹œ๊ฐ„์„ ๊ฐ€์ง€๊ณ  ํ•ด๋‹น ๊ณผ๋ชฉ์˜ ์ด์ˆ˜ ์—ฌ๋ถ€(Pass or fail)๋ฅผ ์˜ˆ์ธกํ•˜๋Š” ๋ฌธ์ œ
   input๊ฐ’: ๊ณต๋ถ€ํ•œ ์‹œ๊ฐ„  
   output๊ฐ’: ์ด์ˆ˜์—ฌ๋ถ€(Pass or Fail)

์—ฌ๊ธฐ์„œ ์ด์ˆ˜์—ฌ๋ถ€๋ฅผ 0,1์ด๋ผ๋Š” ์ด์ง„ํด๋ž˜์Šค(Binary class)๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๊ณ , ์ด๋Ÿฐ ๊ฒฝ์šฐ๋ฅผ ์ด์ง„ ๋ถ„๋ฅ˜(Binary classification)๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

๐Ÿงฉ ์ ์šฉ ์˜ˆ์‹œ ( ๋‹ค์ค‘๋ถ„๋ฅ˜ )

๐Ÿ”Ž ๋Œ€ํ•™๊ต ์‹œํ—˜ ์ „ ๋‚  ๊ณต๋ถ€ํ•œ ์‹œ๊ฐ„์„ ๊ฐ€์ง€๊ณ  ํ•ด๋‹น ๊ณผ๋ชฉ์˜ ์„ฑ์ (A, B, C, D, F)์„ ์˜ˆ์ธกํ•˜๋Š” ๋ฌธ์ œ
   input๊ฐ’: ๊ณต๋ถ€ํ•œ ์‹œ๊ฐ„  
   output๊ฐ’: ๊ณผ๋ชฉ์˜ ์„ฑ์ (A,B,C,D,F)

์—ฌ๊ธฐ์„œ๋Š” 5๊ฐœ์˜ output๊ฐ’์ด๋ผ 5๊ฐœ์˜ ํด๋ž˜์Šค๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๊ธฐ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ๊ฒฝ์šฐ๋ฅผ ๋‹ค์ค‘ ๋ถ„๋ฅ˜(Multi-class classification)๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

โ“ ์„ ํ˜• ํšŒ๊ท€๋ž€ ?

๋ฐ์ดํ„ฐ๋ฅผ ๋†“๊ณ  ๊ฐ€์žฅ ์ž˜ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ์„ ์„ ์ฐพ์•„ ๋ณ€์ˆ˜ ์‚ฌ์ด์˜ ์„ ํ˜•์ ์ธ(=์ง์„ ์ ์ธ) ๊ด€๊ณ„๋ฅผ ๋ชจ๋ธ๋ง ํ•œ ๊ฒƒ

  • ์„ ํ˜•๋ชจ๋ธ์˜ ์ˆ˜์‹ (์ง์„  = 1์ฐจํ•จ์ˆ˜)

    H(x) = Wx + b

์—ฌ๊ธฐ์„œ ์ •ํ™•ํ•œ ๊ฐ’์„ ์˜ˆ์ธกํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‚ด๊ฐ€ ๋งŒ๋“  ์ž„์˜์˜ ์ง์„ (๊ฐ€์„ค)๊ณผ ์ (์ •๋‹ต)์˜ ๊ฑฐ๋ฆฌ๊ฐ€ ์ตœ๋Œ€ํ•œ ๊ฐ€๊นŒ์›Œ์ ธ์•ผํ•œ๋‹ค. ์ฆ‰, cost(์†์‹คํ•จ์ˆ˜)๊ฐ€ ๋‚ฎ์•„์ ธ์•ผํ•œ๋‹ค. ๋˜ํ•œ ๋งŒ์•ฝ ์ž…๋ ฅ๊ฐ’์ด 2๊ฐœ ์ด์ƒ์ด ๋˜๋Š” ๋ฌธ์ œ๋ฅผ ์„ ํ˜•ํšŒ๊ท€๋กœ ํ’€๊ณ ์ž ํ•œ๋‹ค๋ฉด ๋‹ค์ค‘์„ ํ˜•ํšŒ๊ท€๋ฅผ ์ ์šฉํ•œ๋‹ค.

โ“ ๊ฒฝ์‚ฌ ํ•˜๊ฐ•๋ฒ•์ด๋ž€ ?

ํ•จ์ˆ˜์˜ ๊ธฐ์šธ๊ธฐ(๊ฒฝ์‚ฌ)๋ฅผ ๊ตฌํ•˜์—ฌ ๊ธฐ์šธ๊ธฐ๊ฐ€ ๋‚ฎ์€ ์ชฝ์œผ๋กœ ๊ณ„์† ์ด๋™์‹œ์ผœ ๊ทน๊ฐ’(์ตœ์ ๊ฐ’)์— ์ด๋ฅผ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜์—ฌ ํ•™์Šตํ•˜๋Š” ๋ฐฉ๋ฒ•

์—ฌ๊ธฐ์„œ ํ•œ์นธ์”ฉ ์ „์ง„ํ•˜๋Š” ๋‹จ์œ„๋ฅผ Learning rate๋ผ๊ณ  ๋ถ€๋ฅด๋Š”๋ฐ ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ์ด ํ•™์Šต์„ ์ž˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ ๋‹นํ•œ Learning rate๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. Learning rate๊ฐ€ ์ž‘์œผ๋ฉด ์ตœ์†Œ์ ์„ ์ฐพ๊ธฐ๊นŒ์ง€ ์‹œ๊ฐ„์ด ์˜ค๋ž˜๊ฑธ๋ฆฌ๊ณ  , ๊ทธ๋ ‡๋‹ค๊ณ  ๋ฐ˜๋Œ€๋กœ ๋„ˆ๋ฌด ํฌ๋‹ค๋ฉด ์ตœ์†Œ์ ์„ ์ง€๋‚˜ ์ง„๋™ํ•˜๋‹ค๊ฐ€ Overshooting ๋  ์ˆ˜๋„ ์žˆ๋‹ค.

โ“ ๋ฐ์ดํ„ฐ์…‹ ๋ถ„ํ• 

  • Training set (ํ•™์Šต ๋ฐ์ดํ„ฐ์…‹)
    ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ์„ ํ•™์Šต์‹œํ‚ค๋Š” ์šฉ๋„๋กœ ์ „์ฒด ๋ฐ์ดํ„ฐ์…‹์˜ ์•ฝ 80% ์ •๋„๋ฅผ ์ฐจ์ง€ํ•œ๋‹ค.

  • Validation set (๊ฒ€์ฆ ๋ฐ์ดํ„ฐ์…‹)
    ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ์„ ๊ฒ€์ฆํ•˜๊ณ  ํŠœ๋‹ํ•˜๋Š” ์ง€ํ‘œ์˜ ์šฉ๋„๋กœ ์ •๋‹ต ๋ผ๋ฒจ์ด ์žˆ๊ณ , ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€๋Š” ์•Š์œผ๋ฉฐ ์†์‹ค ํ•จ์ˆ˜, Optimizer ๋“ฑ์„ ๋ฐ”๊พธ๋ฉด์„œ ๋ชจ๋ธ์„ ๊ฒ€์ฆํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

  • Test set (ํ‰๊ฐ€ ๋ฐ์ดํ„ฐ์…‹)
    ์ •๋‹ต ๋ผ๋ฒจ์ด ์—†๋Š” ์‹ค์ œ ํ™˜๊ฒฝ์—์„œ์˜ ํ‰๊ฐ€ ๋ฐ์ดํ„ฐ์…‹

๐Ÿงฉ Kaggle์„ ํ™œ์šฉํ•œ ์„ ํ˜•ํšŒ๊ท€ ์ ์šฉ์˜ˆ์‹œ

import os # ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ง€์ •ํ•˜๊ธฐ 
os.environ['KAGGLE_USERNAME'] = '[๋‚ด_์บ๊ธ€_username]' # username
os.environ['KAGGLE_KEY'] = '[๋‚ด_์บ๊ธ€_key]' # key

    ```bash # ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ์…‹์˜ API ์‹คํ–‰ํ•˜๊ธฐ๊ณ  ์••์ถ•ํ’€๊ธฐ
    !unzip /content/advertising-dataset.zip
    ```
    !unzip /content/advertising-dataset.zip
    
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import Adam, SGD
import numpy as np
import pandas as pd # csvํŒŒ์ผ์„ ์ฝ์„๋•Œ ์‚ฌ์šฉ
import matplotlib.pyplot as plt # ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ฆด๋•Œ ์‚ฌ์šฉ 
import seaborn as sns # ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ฆด๋•Œ ์‚ฌ์šฉ 
from sklearn.model_selection import train_test_split # sklearn(๋จธ์‹ ๋Ÿฌ๋‹์„ ๋„์™€์ฃผ๋Š” ํŒจํ‚ค์ง€) ์—ฌ๊ธฐ์„œ train_test_split(ํŠธ๋ ˆ์ด๋‹์…‹๊ณผ ํ…Œ์ŠคํŠธ์…‹์„ ๋ถ„๋ฅ˜)ํด๋ž˜์Šค๋ฅผ ์“ธ๊ฑฐ์ž„     

df = pd.read_csv('advertising.csv') # csvํŒŒ์ผ์„ ์ฝ์„๋•Œ ์‚ฌ์šฉ
df.head(5) # ๋งจ์•ž์—์„œ 5์ค„ ์ถœ๋ ฅํ•ด๋ผ df.tail(5)์€ ๋’ค์—์„œ 5์ค„์ถœ๋ ฅํ•˜๋ผ๋Š”๋œป

print(df.shape) # ๋ชจ์–‘ ์‚ดํ”ผ๊ธฐ (200์ค„์งœ๋ฆฌ ๋ฐ์ดํ„ฐ์…‹ ์—ด์€ 4๊ฐœ(ํ‹ฐ๋น„,๋ผ๋””์˜ค๋“ฑ๋“ฑ) )

sns.pairplot(df, x_vars=['TV', 'Newspaper', 'Radio'], y_vars=['Sales'], height=4) # ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„(df)๋ฅผ ํ†ต์œผ๋กœ ๋„ฃ๊ณ  ๋‚ด๊ฐ€ ๋ณด๊ณ ์‹ถ์€ variable๋งŒ ๋ฝ‘์•„์„œ ํ‹ฐ๋น„,์‹ ๋ฌธ,๋ผ๋””์˜ค์™€ sales ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋ณด์—ฌ์ค˜๋ผ๋Š” ๋œป ๋†’์ด๋Š”4

x_data = np.array(df[['TV']], dtype=np.float32) # ์ž…๋ ฅ๊ฐ’ ํ‹ฐ๋น„๋งŒ ์ถ”์ถœ
y_data = np.array(df['Sales'], dtype=np.float32) # ์ถœ๋ ฅ๊ฐ’ ์„ธ์ผ์ฆˆ๋งŒ ์ถ”์ถœ

print(x_data.shape) # ๋ชจ์–‘์ถœ๋ ฅ
print(y_data.shape) 

x_data = x_data.reshape((-1, 1)) # reshape((-1, 1)์—ฌ๊ธฐ์„œ -1์€ ๋‚จ์€ ์ˆ˜๋งŒํผ ์•Œ์•„์„œ ๋ณ€ํ˜•ํ•ด๋ผ ๋’ค์—๋Š” ๋ฌด์กฐ๊ฑด1์ด๋˜์•ผํ•œ๋‹ค.
y_data = y_data.reshape((-1, 1))

print(x_data.shape)
print(y_data.shape)

x_train, x_val, y_train, y_val = train_test_split(x_data, y_data, test_size=0.2, random_state=2021) #20%๋Š” ํ…Œ์ŠคํŠธ๋ฐ์ดํ„ฐ์…‹์œผ๋กœ ์“ฐ๊ณ  80%๋Š” ํŠธ๋ ˆ์ธ์…‹์œผ๋กœ ๋‚˜๋ˆ ์ค˜๋ผ / random_state ๋žœ๋ค์œผ๋กœ ๋ณ€์ˆ˜ ์ง€์ •

print(x_train.shape, x_val.shape)     # ๋ฐ‘์—๋Š” ํŠธ๋ ˆ์ด๋‹๋ฐ์ดํ„ฐ๋Š” 160๊ฐœ๊ณ , ๋ฐธ๋ฆฌ๋ฐ์ด์…˜๋ฐ์ดํ„ฐ๋Š” 40๊ฐœ๋‹ค ์ฆ‰ 160๊ฐœ ๋ฐ์ดํ„ฐ๋กœ ํ•™์Šต์‹œํ‚ค๊ณ  40๊ฐœ๋กœ ๊ฒ€์ฆํ•˜๊ฒ ๋‹ค.
print(y_train.shape, y_val.shape)

model = Sequential([
  Dense(1)  # ์„ธ์ผ์ฆˆ ํ•˜๋‚˜๋งŒ ์˜ˆ์ธก
])

model.compile(loss='mean_squared_error', optimizer=Adam(lr=0.1))

model.fit(
    x_train,
    y_train,
    validation_data=(x_val, y_val), # ๊ฒ€์ฆ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ํ•œ epoch์ด ๋๋‚ ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ๊ฒ€์ฆ
    epochs=100 # epochs ๋ณต์ˆ˜ํ˜•์œผ๋กœ ์“ฐ๊ธฐ! / 100๋ฒˆ ๋ฐ˜๋ณต ํ•™์Šตํ•ด๋ผ 
)

y_pred = model.predict(x_val)

plt.scatter(x_val, y_val) # scatter ์ ์ฐ๋Š” ๊ทธ๋ž˜ํ”„ 
plt.scatter(x_val, y_pred, color='r') # ์ •๋‹ต๊ฐ’๊ณผ ์˜ˆ์ธก๊ฐ’์„ ๊ทธ๋ฆฌ๋Š”๋ฐ ์˜ˆ์ธก๊ฐ’์€ ๋นจ๊ฐ„์ƒ‰ 
plt.show()

๐ŸŒฑ ๋Š๋‚€ ์ 

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

๐ŸŽ ์ž์„ธํ•œ ์ฝ”๋“œ๋Š” colab ์— ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค

profile
ํ•˜๋ฃจ ํ•œ๊ฑธ์Œ์”ฉ ๊พธ์ค€ํžˆ ๋‚˜์•„๊ฐ€๋Š” ๊ฐœ๋ฐœ์ž๐Ÿ™†โ€โ™€๏ธ https://github.com/Moonmooj

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

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด