












경사하강법 → optimizer의 방법 중 하나





Tensorflow
구글이 만든 딥러닝 라이브러리
Keras
-tensorflow 위에서 작동하는 라이브러리로 사용자 친화적 라이브러리
-tensorflow 기반 사용자 인터페이스 API


import tensorflow as tf
print(tf.__version__) # 언더바 두 개
# 설치 버전을 확인하는 이유는?
# 프로젝트 진행 시 이미 개발된 딥러닝 모델을 가져다 쓰는 경우
# 버전을 일치시켜줘야지 충동나지 않음

# 현재 파일의 위치 확인하기 (리눅스 명령어 사용 → 코랩은 리눅스 기반)
!pwd # print work directory

# %cd : change directory (% 의미 : 영구적 실행)
%cd "/content/drive/MyDrive/Colab Notebooks/DeepLearning"

!pwd


import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_csv('data/student-mat.csv', delimiter= ';')
data
# 정답으로 사용할 컬럼 : G3 (3학년 성적)
# 학생 성적을 예측하는 모델링
# 하나의 특성만을 사용해서 성적 예측

data.info()
# 결측치 유무


X = data['studytime']
y = data['G3']
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=2024)
print('훈련용 문제 : ', X_train.shape)
print('훈련용 정답 : ', y_train.shape)
print('테스트용 문제 : ', X_test.shape)
print('테스트용 정답 : ', y_test.shape)

from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error # 회귀모델의 평가지표(MSE)
# 머신러닝 모델은 입력특성을 2차원으로 받는다!!
# 1차원(Series) → 2차원(DataFrame)
X_train.values.reshape(-1, 1)
linear_model = LinearRegression()
linear_model.fit(X_train.values.reshape(-1, 1), y_train)

pre = linear_model.predict(X_test.values.reshape(-1, 1))
pre

error = mean_squared_error(y_test, pre)
print('linear_model_mse : ', error)


from tensorflow.keras.models import Sequential # 뼈대
# 레고 시작 할 때 바닥의 큰 판이라고 생각하기! 기준이 있어야함!
from tensorflow.keras.layers import InputLayer, Dense, Activation
# 신경망 구성요소(조립)
# InputLayer : 입력층
# Dense : 중간층의 밀집도
# Activation : 활성화 함수(인간을 모방하기 위해서 사용하는 함수)
# 뼈대 생성
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)) # 출력되는 데이터의 형태 설계

model.compile(loss = 'mean_squared_error', # 모델의 잘못된 정도를 측정하는 알고리즘
optimizer = 'SGD', metrics = ['mse'])
# loss : 모델이 얼마나 틀렸는지 정도를 알려준다.
# 회귀모델은 mse, 분류모델은 crossentropy 사용
# optimizer : 최적화방법 → 경사하강법
# metrics : 최종 평가 방법(회귀 : mse)
h1 = model.fit(X_train, y_train, validation_split=0.2, epochs=20)
# validation_split : 훈련데이터 내부에서 20%를 검증데이터로 사용하겠다.
# epochs : 모델의 최적화 횟수(w,b 값의 업데이트 횟수)
# h1에 담아주는 이유 : 학습 history 출력을 위함

model.evaluate(X_test, y_test)
# 머신러닝에서 score와 같은 기능

→ 머신러닝과 별로 차이가 안난다.
그러면 머신러닝을 사용하는게 더 낫다.
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 데이터 둘 다 오차가 줄어드는 것을 확인(일반화 가능성 있음)
# 일반화 확인


# 데이터를 살펴보기(숫자형태의 데이터, 결측치 없는지)
X = data[['age', 'traveltime', 'studytime', 'freetime']]
y = data['G3']
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=2024)
X_train.shape, X_test.shape, y_train.shape, y_test.shape

# 뼈대 생성
model = Sequential()
# 입력층
model.add(InputLayer(input_shape = (4,)))
# 중간층(은닉층)
model.add(Dense(units = 10))
model.add(Activation('sigmoid'))
# 출력층
model.add(Dense(units = 1))
# loss, optimizer, metrics
model.compile(loss = 'mean_squared_error',
optimizer = 'SGD', metrics = ['mse'])
h2 = model.fit(X_train, y_train, validation_split=0.2, epochs=20)

model.evaluate(X_test, y_test)
