
DL에서 자주 사용하는 package는 tensorflow, pytorch
Keras (코드가 간결해 진다.)
Colab은 최신 버전으로 해주는데 코드가 잘 안 돌아가는 경우 keras, tensorflow의 버전을 낮추거나,
local에서 해당 코드의 keras, tensorflow 버전을 설치하여 시행한다.






1) 모델을 예측하여 오차를 구하기 -> LOSS FUNCTION (MSE)
2) Optimizer(최적화 하는 도구)를 이용하여 최적화 해주기
3) 오차가 많이 나면 가중치 많이 수정 필요, 오차가 적다면 가중치 조금만 수정 필요
4) 최적화된 Model 생성

사람의 의존도가 높음
사람이 발견한 규칙을 통해 결과를 출력. 데이터가 많아질수록 규칙을 찾기 어려움.
필요한 컬럼만 만들고 데이터 전처리 하는 것은 사람이 선택, 학습은 스스로하여 결과를 출력.
사람의 개입 최소화
feature engineering이 거의 필요없음.


목표
- 공부 시간에 따른 학생의 성적을 예측하는 모델 만들기
- sklearn을 이용한 모델링과 Keras를 이용한 모델링
!pip install google-colab-shell
from google_colab_shell import getshell
getshell()
- ls : list, 현재 디렉토리의 파일 목록
- pwd : printing working directory, 현재 내위치
%cd "/content/drive/MyDrive/Colab Notebooks/24.08.29 딥러닝"
# changedirectory 경로변경

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_csv("./data/student-mat.csv", delimiter=";")
data



X = data['studytime']
y = data['G3']

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
# 훈련, 평가 데이터 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=829)
# 데이터 크기 확인
print('훈련용 문제 : ', X_train.shape)
print('훈련용 답 : ', y_train.shape)
print('테스트용 문제 : ', X_test.shape)
print('테스트용 답 : ', y_test.shape)

# 모델생성 -> 모델학습 -> 모델예측 -> 모델 평가
lr_model = LinearRegression()
lr_model.fit(X_train.values.reshape(-1,1), y_train)
pre = lr_model.predict(X_test.values.reshape(-1,1))
score = mean_squared_error(y_test, pre)
# MSE(평균제곱오차)
print("MSE : ", score)

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import InputLayer, Dense
# 모델생성(모델설계)
# 뼈대 생성
deep_model = Sequential()
# 입력층
deep_model.add(InputLayer(shape=(1,)))
# 중간층(은닉층)
deep_model.add(Dense(units=8, activation='sigmoid'))
deep_model.add(Dense(units=8, activation='sigmoid'))
# 출력층
deep_model.add(Dense(units=1))
# 뉴런(unit개수)을 많이 생성할수록 시간이 오래 걸리고 정확해진다고 함

중간층에서는 많은 데이터를 주고 받는다.
입력층에서 받아온 1개의 데이터를 중간층1에서 각각의 뉴런이 값을 분해하고 만들고(8개) 다음 중간층 2의 각각의 뉴런에게 전달함.
중간층 2는 받은 값을 또 분해하여 값을 만듦
출력층은 중간층 2(마지막 중간층)에게서 총 8개를 받음
복잡한 데이터를 사고할 수 있고, 모델은 느슨한 사고력을 가질 수 있다.
# 모델학습
# 손실함수, 최적화함수 - 커스터마이징
deep_model.compile(loss="mse",
optimizer='adam')
deep_model.fit(X_train, y_train,
validation_split=0.2, # 훈련데이터에서 316개 20%를 검증용으로 활용
epochs=20) # 모델의 가중치를 업데이트 하는 황목 횟수 (epochs=>최적화를 결정하는 파라미터)
# 모델 예측 및 평가
deep_model.evaluate(X_test, y_test)