딥러닝

신경망 구조설계

화이팅하자9 2024. 1. 10. 21:17
라이브러리 불러오기
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

데이터 불러오기
data = pd.read_csv('data/student-mat.csv', delimiter = ';')

테이블 정보확인
data.info()

train, test 분리
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=0)<--train:8, test:2

크기확인 :  train,test.shape

 

모델 불러오기
from sklearn.linear_model import LinearRegression # 선형회귀모델
from sklearn.metrics import mean_squared_error # 회귀모델의 평가지표(MSE)

모델생성
linear_model = LinearRegression()

.values.reshape(-1,1) <== 입력특성을 1차원(Series)에서 2차원(DataFrame)으로 바꾼다.

#2. 모델학습(학습용문제,학습용 정답)
linear_model.fit(X_train.values.reshape(-1,1),y_train)

#3. 모델예측(테스트 문제)
pre = linear_model.predict(X_test.values.reshape(-1,1))

#4. 모델평가(mse 출력),(실제값,예측값)
error = mean_squared_error(y_test,pre)
print('linear_model_mse : ',error)

 

 

신경망 구조설계

# tensorflow 도구 불러오기
from tensorflow.keras.models import Sequential # 뼈대

# 레고 시작할때 바닥의 큰판이라고 생각하기
from tensorflow.keras.layers import InputLayer, Dense,Activation

# 신경망 구성요소(조립)
# inputLayer : 입력층
# Dense : 중간층의 밀집도
# Activation : 활성화 함수(인간을 모방하기 위해서 사용하는 함수)

 

# 1.신경망 구조설계

# 뼈대생성
model = Sequential()

# 입력층 <-- add 기능을 사용해서 층을 하나씩 더해나가보자
model.add(InputLayer(input_shape = (1,))) # 입력특성의 개수 입력

# 중간층(은닉층) <-- 내부적으로 어떻게 연산되는지 알수가 없기 때문에
model.add(Dense(units = 10)) # 뉴런 10개 연결 -> 학습능력을 결정(많아질수록 능력이 좋아진다)

# Dense : 신경망의 핵심파트
model.add(Activation('sigmoid')) # 활성화 함수

# 출력층
model.add(Dense(units=1))

X의 개수에 따라서 입력층의 input_shape가 달라진다.

 

# 2. 신경망 학습방법 및 평가방법 설정
model.compile(loss='mean_squared_error', # 모델의 잘못된 정도를 측정하는 알고리즘
              optimizer='SGD', metrics=['mse'])
              
# loss : 모델이 얼마나 틀렸는지 정도를 알려준다.

# 회귀모델은 mse를 사용
# 분류모델은 crossentropy 사용

# optimizer : 최적화 방법 -> 경사하강법

# metrics : 최종평가 방법 (회귀 mse)

 

# 3. 모델학습
h1 = model.fit(X_train,y_train,validation_split=0.2, epochs=20)
# validation_split : 훈련데이터 내부에서 20%를 검증데이터로 사용하겠다
# epochs : 모델의 최적화 횟수(w,b 값의 업데이트 횟수)
# h1에 담아주는 이유 : 학습 history 출력을 위함

 

# 4. 모델 평가
model.evaluate(X_test,y_test)

# 5. 매 회차마다 오차(loss)값 시각화
h1.history['loss']

plt.figure(figsize=(10,5))
plt.plot(h1.history['loss'],label="train_loss")
plt.plot(h1.history['val_loss'], label="validation_loss")
plt.legend() #범례
plt.show()

# 학습 epoch가 늘어날수록 loss 값이 떨어지는것을 확인
# 과적합을 확인하기 위해서 검증데이터도 시각화
# train, validation 데이터 둘다 오차가 줄어드는 것을 확인 (일반화 가능성 있음)
# 일반화 확인