[네이버클라우드] AIaaS 개발자 과정/AI

[네이버클라우드캠프] 2023.5.9 AI(1) - 실습 1

_꼬마돌 2023. 5. 9. 14:25
반응형

실습 1

tf04_train_test_split01.py

train, test 데이터 비율 직접 나누기

import numpy as np
from keras.models import Sequential
from keras.layers import Dense

# 1. 데이터
x = np.array([1, 2, 3, 4, 5, 6, 7 ,8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20])
y = np.array([1, 2, 3, 4, 5, 6, 7 ,8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20])
# x = np.array([range(1, 21)])		
# y = np.array([range(1, 21)])		=> 일일히 입력하는 대신 range함수를 사용하면 편하다.

# print(x.shape)    # (20,)
# print(y.shape)    # (20,)			=> 1차원배열
# print(x)          # [ 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20]

# train과 test 비율 나누기
x_train = np.array([1, 2, 3, 4, 5, 6, 7 ,8, 9, 10, 11, 12, 13, 14])
y_train = np.array([1, 2, 3, 4, 5, 6, 7 ,8, 9, 10, 11, 12, 13, 14])

x_test = np.array([15, 16, 17, 18, 19, 20])
y_test = np.array([15, 16, 17, 18, 19, 20])

# train : test = 14 : 6 (7 : 3 의 비율로 나눴다)

# 2. 모델구성
model = Sequential()
model.add(Dense(14, input_dim=1))
model.add(Dense(50))
model.add(Dense(1))

# 3. 컴파일, 훈련
model.compile(loss='mse', optimizer='adam')
model.fit(x_train, y_train, epochs=100, batch_size=1)

# 4. 평가, 예측
loss = model.evaluate(x_test, y_test)
print('loss : ', loss)

result = model.predict([21])
print('21의 예측값 : ', result)

# 결과
# loss :  1.8189894035458565e-12
# 21의 예측값 :  [[20.999998]]

 

tf04_train_test_split02.py

범위 설정으로 데이터 비율 나누기

import numpy as np
from keras.models import Sequential
from keras.layers import Dense

# 1. 데이터
x = np.array([1, 2, 3, 4, 5, 6, 7 ,8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20])
y = np.array([1, 2, 3, 4, 5, 6, 7 ,8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20])
# x = np.array([range(1, 21)])
# y = np.array([range(1, 21)])

# print(x.shape)
# print(y.shape)
# print(x)

# x_train = np.array([1, 2, 3, 4, 5, 6, 7 ,8, 9, 10, 11, 12, 13, 14])
# y_train = np.array([1, 2, 3, 4, 5, 6, 7 ,8, 9, 10, 11, 12, 13, 14])

# x_test = np.array([15, 16, 17, 18, 19, 20])
# y_test = np.array([15, 16, 17, 18, 19, 20])

# [실습] x와 y 데이터를 파이썬 리스트 스플릿으로 분리하세요.

# 요렇게 스플릿으로도 표현 가능
x_train = np.array(x[:14])
y_train = np.array(y[:14])

x_test = np.array(x[14:])
y_test = np.array(y[14:])

print(x_test)
print(y_train)
print(x_test)
print(y_test)

# 2. 모델구성
model = Sequential()
model.add(Dense(14, input_dim=1))
model.add(Dense(50))
model.add(Dense(1))

# 3. 컴파일, 훈련
model.compile(loss='mse', optimizer='adam')
model.fit(x_train, y_train, epochs=100, batch_size=1)

# 4. 평가, 예측
loss = model.evaluate(x_test, y_test)
print('loss : ', loss)

result = model.predict([21])
print('21의 예측값 : ', result)

# 결과
# loss :  5.9776855778181925e-05
# 21의 예측값 :  [[20.989101]]​

 

tf04_train_test_split03.py

train_data_split 이용하여 데이터 비율 나누기.

import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from sklearn.model_selection import train_test_split

# 1. 데이터
x = np.array([1, 2, 3, 4, 5, 6, 7 ,8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20])
y = np.array([1, 2, 3, 4, 5, 6, 7 ,8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20])

x_train, x_test, y_train, y_test = train_test_split(
    x, y,               # x, y 데이터
    test_size=0.3,      # test의 사이즈. 보통 30%
    train_size=0.7,     # train의 사이즈. 보통 70%
    random_state=100,   # 데이터를 난수값에 의해 추출한다는 의미이며, 중요한 하이퍼파라미터임.
    shuffle=True        # 데이터를 섞어서 가지고 올 것인지를 정함. shuffle=True는 디폴트로 적용됨. 
)

# 2. 모델구성
model = Sequential()
model.add(Dense(14, input_dim=1))
model.add(Dense(50))
model.add(Dense(1))

# 3. 컴파일, 훈련
model.compile(loss='mse', optimizer='adam')
model.fit(x_train, y_train, epochs=100, batch_size=1)

# 4. 평가, 예측
loss = model.evaluate(x_test, y_test)
print('loss : ', loss)

result = model.predict([21])
print('21의 예측값 : ', result)

# 결과
# loss :  2.420316924656163e-08
# 21의 예측값 :  [[21.000084]]

 

tf05_scatter.py

산점도 그래프 출력하기

import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from sklearn.model_selection import train_test_split

# 1. 데이터
x = np.array([1, 2, 3, 4, 5, 6, 7 ,8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20])
y = np.array([1, 2, 3, 4, 5, 6, 7 ,8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20])

x_train, x_test, y_train, y_test = train_test_split(
    x, y,               # x, y 데이터
    test_size=0.3,      # test의 사이즈. 보통 30%
    train_size=0.7,     # train의 사이즈. 보통 70%
    random_state=100,   # 데이터를 난수값에 의해 추출한다는 의미이며, 중요한 하이퍼파라미터임.
    shuffle=True        # 데이터를 섞어서 가지고 올 것인지를 정함. shuffle=True는 디폴트로 적용됨. 
)

# 2. 모델구성
model = Sequential()
model.add(Dense(14, input_dim=1))
model.add(Dense(50))
model.add(Dense(1))

# 3. 컴파일, 훈련
model.compile(loss='mse', optimizer='adam')
model.fit(x_train, y_train, epochs=100, batch_size=1)

# 4. 평가, 예측
loss = model.evaluate(x_test, y_test)
print('loss : ', loss)

result = model.predict([21])
print('21의 예측값 : ', result)

y_predict = model.predict(x)

#### scatter visualization
import matplotlib.pyplot as plt

plt.scatter(x, y)   # 산점도 그리기
plt.plot(x, y_predict, color='red')
plt.show()

# 결과
# loss :  6.721970748913009e-07
# 21의 예측값 :  [[20.998983]]

실행하면 산점도 그래프가 출력된다.

 

 

tf06_R2score.py

결정계수

import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from sklearn.model_selection import train_test_split

# 1. 데이터
x = np.array([1, 2, 3, 4, 5, 6, 7 ,8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20])
y = np.array([1, 2, 3, 4, 5, 6, 7 ,8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20])

x_train, x_test, y_train, y_test = train_test_split(
    x, y,               # x, y 데이터
    test_size=0.3,      # test의 사이즈. 보통 30%
    train_size=0.7,     # train의 사이즈. 보통 70%
    random_state=100,   # 데이터를 난수값에 의해 추출한다는 의미이며, 중요한 하이퍼파라미터임.
    shuffle=True        # 데이터를 섞어서 가지고 올 것인지를 정함. shuffle=True는 디폴트로 적용됨. 
)

# 2. 모델구성
model = Sequential()
model.add(Dense(14, input_dim=1))
model.add(Dense(50))
model.add(Dense(1))

# 3. 컴파일, 훈련
model.compile(loss='mse', optimizer='adam')
model.fit(x_train, y_train, epochs=100, batch_size=1)

# 4. 평가, 예측
loss = model.evaluate(x_test, y_test)
print('loss : ', loss)

result = model.predict([21])
print('21의 예측값 : ', result)

y_predict = model.predict(x)

#### R2score
from sklearn.metrics import r2_score, accuracy_score
r2 = r2_score(y, y_predict)
print('r2score : ', r2)

# result(1)
# loss: loss :  1.564977537782397e-05
# r2score :  0.9999995935707783
# 21의 예측값 :  [[20.993484]]

 

tf06_R2_bad.py

강제로 성능 저하시켜보기.

# [실습]
# 1. R2score를 음수가 아닌 0.5 이하로 만들어보세요.
# 2. 데이터는 건드리지 마세요. 
# 3. 레어어는 인풋, 아웃풋 포함 7개 (은닉층 5개 이상)이상으로 만들어주세요.
# 4. batch_size=1
# 5. 은닉층의 노드 개수는 (10개 이상) 100개 이하. 
# 6. train_size = 0.7
# 7. epochs=100 이상
# [실습 시작!]

import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from sklearn.model_selection import train_test_split

# 1. 데이터
x = np.array([1, 2, 3, 4, 5, 6, 7 ,8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20])
y = np.array([1, 2, 3, 4, 5, 6, 7 ,8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20])

x_train, x_test, y_train, y_test = train_test_split(
    x, y,               # x, y 데이터
    test_size=0.3,      # test의 사이즈. 보통 30%
    train_size=0.7,     # train의 사이즈. 보통 70%
    random_state=3,   # 데이터를 난수값에 의해 추출한다는 의미이며, 중요한 하이퍼파라미터임.
    shuffle=True      # 데이터를 섞어서 가지고 올 것인지를 정함. shuffle=True는 디폴트로 적용됨. 
)

# 2. 모델구성
model = Sequential()
model.add(Dense(20, input_dim=1))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(1))

# 3. 컴파일, 훈련
model.compile(loss='mse', optimizer='adam')
model.fit(x_train, y_train, epochs=100, batch_size=1)

# 4. 평가, 예측
loss = model.evaluate(x_test, y_test)
print('loss : ', loss)

result = model.predict([21])
print('21의 예측값 : ', result)

y_predict = model.predict(x)

#### R2score
from sklearn.metrics import r2_score, accuracy_score
r2 = r2_score(y, y_predict)
print('r2score : ', r2)

# result(1)
# loss: loss :  38.073455810546875
# r2score :  0.08040983957982561
# 21의 예측값 :  [[9.523099]] 

# 은닉층이 너무많으면 성능이 안 좋아짐

반응형