KT AIVLE/데이터 분석, ML, DL

[KT AIVLE 스쿨 7기] 딥러닝

Dori1998 2025. 4. 16. 23:44

 

 

 


 

■ 핵심 용어

1. 인공 뉴런 : 입력값과 가중치, 편햐을 이용해 출력값을 내는 수학적 모델

2. 단층 인공 신경망 : 퍼셉트론을 하나만 사용하는 인공 신경망

3. 다층 인공 신경망 : 퍼셉트론을 여러 개 사용하는 인공 신경망

4. 입력층 : 입력값을 표현하는 것 / 출력층 : 신경망의 출력을 계산하는 것 / 은닉층 : 입력층 이후부터 출력층 전

5. 가충치 : 입력의 중요도

6. 편향 : 활성화의 경계가 원점으로부터 얼마나 이동할지를 결정

7. 활성화 함수 : 해당 뉴런의 출력을 다음 뉴런으로 넘길지 결정하는 것

8. 시그모이드 함수 : 뉴런의 출력값을 0과 1 사이로 고정하는 것

9. 손실 함수 : 정답과 신경망의 예측의 차이를 나타내는 함수이다.

10. 경사 하강법 : 손실을 가중치에 대해 미분한 다음, 기울기의 반대 방향으로 학습률만큼 이동시키는 알고리즘

11. 오차 역전파 : 올바른 가중치를 찾기 위해 오차를 출력층으로부터 입력층까지 전파하는 방식

 

퍼셉트론

① 입력값(x₁, x₂)에 대응하는 가중치(w₁, w₂)를 각각 곱한다.

② ∑ 는 편항 :  x₁ * w₁ + x₂ * w₂ + b 

③ F 활성화 함수

④ 시그모이드 함수는 실수 전체의 모든 입력에 대해 출력이 0과 1 사이의 실수만을 가지게 된다. 시그모이드 함수는 인공 신경망의 출력을 확률로써 다루고 싶어한다. 이에 확률 또한 값이 0과 1사이로 표현하기 때문에 시그모이드 함수를 사용한다.

 

TensorFlow 기본 구조

TensorFlow의 핵심 개념

텐서(Tensor) - TensorFlow의 기본 데이터 구조로, 다차원 배열
- 스칼라 (0차원 텐서) : 3
- 벡터 (1차원 텐서) : [1, 2, 3]
- 행렬 (2차원 텐서) : [ [1, 2], [3, 4] ]
연산 (Operation) - 텐서 간의 연산을 수행하는 노드
- 텐서는 연산을 거치면서 모델 학습에 필요한 변환을 수행
그래프 (Graph) & 세션 (Session) - 과거에는 연산을 수행하기 위해 계산 그래프를 먼저 정의하고, 세션에서 실행하는 방식

 

TensorFlow 기본 구조

라이브러리 로딩 텐서플로우 라이브러리를 로딩한다. # 데이터 처리 라이브러리 불러오기
import tensorflow as tf
import pandas as pd
import numpy as np

# 텐서플로우 API 불러오기
from tensorflow.keras import Sequential
from tensorflow.keras import Dense
데이터 로드 학습을 위한 준비한 데이터셋을 가져옴 x = [ -3, 31, -11, 4, 0, 22, -2, -5   ]
y = [ -2, 32, -10, 5, 1, 23, -1, -4  ]

# 신경망 모델의 입력은 (샘플 수, 특성 수) 형태의 2차원 배열이다.
# 만약 1차원 (10,) 형태라면 모델은 학습할 수 없으므로, 넘파이의 reshape()으로 2차원 배열로 변환한다.
# reshape(-1, 1)은 샘플 수는 자동으로 맞추고, 특성 수가 1개 라는 것을 명시한다.

X_train = np.array(x).reshape(-1, 1)
Y_train = np.array(y)
모델 구조 정의 tf.keras.Sequential을 사용하여 신경망 모델 구조 정의 Sequential은 층을 하나씩 순서대로 쌓는 구조로 완전 연결층 (모든 입력이 출력과 연결됨)인 Dense를 이용해 레이어를 쌓는다.

- units = 1 : 출력 뉴런 1개
- activation = 'linear' : 선형 함수 사용 (회귀 모델 적합)
- input_dim = 1 : 입력 데이터의 특성(열) 수가 1개

# Sequential API를 이용한 모델 구조 정의

model = Sequential()
model.add(Dense(units = 1, activation = 'linear', input_dim = 1))
컴파일 compile 함수로 모델의 손실 함수와 최적화 알고리즘, 평가 지표 등을 지정 생성형 모델의 학습을 위한 설정을 수행한다.

- optimizer = 'adam' : 학습 방법(가중치를 어떻게 조정할지)
- loss = 'mse' : 회귀 모델의 손실 함수 (예측값과 실제값의 차이 측정, 평균 제곱 오차)
- metrics = ['mae'] : 학습 성능 확인용 지표 (평균 절대 오차)

# 모델 컴파일하기
model.compile(optimizer = 'adam', loss = 'mse', metrics = ['mae'])
모델 학습 fit 함수를 활용해 모델에 데이터를 학습 실제 훈련용 데이터를 이용해 가중치를 조정하는 과정
- X_train : 훈련을 위한 데이터 셋 
- Y_train : 정답 데이터 셋
- epochs = 3000 : 데이터 셋을 3000번 반복해서 학습
- verbose = 0 : 학습 중 출력 생략 (0이면 조용하게, 1이면 자세하게)

# 모델 학습
model.fit (X_train, Y_train, epochs = 3000, verbose = 0)
# 모델 가중치 확인
model.weights
모델 평가 evalute 함수를 사용하여 모델의 성능 평가하는 과정 loss, mae = model.evaluate (X_train, y_train, verbose = 0)
print(loss)
print(mae)
예측 수행 학습 완료된 모델에 predict 함수를 통해 새로운 데이터 예측 실행 # 예측에 사용할 새 입력값 준비
# 예측할 입력값은 반드시 넘파이 배열 행태로 전달해야 모델이 NumPy 배열을 올바르게 인식하고 예측을 수행

predictions = model.predict (np.array( [[11], [12], [13]])
print(predictions.flatten())

 

딥러닝 프로세스

데이터 불러오기 CSV, 이미지, 텍스트 등 다양한 형태의 데이터를 로딩합니다.
EDA (탐색적 데이터 분석) 변수의 분포, 상관관계, 이상치 등을 시각화하고 이해하는 과정
데이터 전처리 결측치를 제거하고, 범주형 데이터를 숫자형으로 변환하고 수치형 데이터의 스케일링을 수행합니다.
데이터 셋 분리 학습용 (Train) 와 테스트용 (Test) 데이터로 분할합니다.
모델 구조 정의 입력층 → 은닉층(Dense, Dropout) → 출력층을 구성합니다.
모델 컴파일 손실함수, 옵티마이저, 평가지표 설정합니다.
모델 학습 .fit() 메서드로 모델을 학습한다.
Validation_split 또는 별도 검증셋 활용이 가능하다.
예측 및 검증 .predict() 로 예측합니다.
classfication_report, confusion_matrix 등으로 성능 평가

 

하이퍼파라미터 (Hyperparameter)

: 하이퍼파라미터는 모델이 학습하기 전에 사용자가 직접 설정해야 하는 값

: 신경망의 성능 최적화에 중요한 역할을 한다.

구분 항목
모델 구조 은닉층 개수
뉴런 개수
활성화 함수
최적화, 정규화 옵티마이저 (Optimizer)
드롭아웃 (Drop out)
학습 학습률 (Learning Rate, a)
배치크기 (Batch Size)
에포크 (Epoch)

 

회귀 예측 모델링

 

필요한 라이브러리 가져오기 # 데이터 파일 (csv)를 불러오기 위해 pandas
# 데이터를 학습용과 테스트용으로 분리하기 위한 train_test_split 함수
# 수치 데이터의 표준화를 위해 StandardScaler

- import pandas as pd
- from sklearn.model_selection import train_test_split
- from sklearn.preprocessing import StandardScaler

# 딥러닝 모델을 만들기 위한 Keras와 Sequential 과 Dense 클래스

- from tensorflow.keras.models import Sequential
- from tensorflow.keras.layers import Dense
데이터 로딩 # 학습에 사용할 데이터를 가져온다.

df = pd.read_csv
df.info()

x = df[ ['temp', 'atemp', 'hum', 'windspeed'] ].values
y = df['cnt'].values
데이터 전처리

- StandardScaler : 수치형 변수 값을 정규화합니다.
: 각 특성(feature)의 값을 평균 0, 표준편차 1로 변환하는 작업

- 신경망은 입력 값의 스케일에 민감함 (값이 크면 더 많이 반영될 수 있다.)
- 표준화를 통해 모든 특성이 동등한 중요도로 학습에 반영되도록 함
- StandardScaler (scikit - learn) 객체를 이용
# StandardScaler 객체를 생성한다.

scaler = StandardScaler()

# fit_transformed() 에 특성 데이터(x)를 넣어 표준화를 수행합니다.

x_scaled = scaler.fit_transform(x)
데이터셋 분리

- train_test_split() : 데이터를 모델이 학습하는 데이터와 학습하지 않은 데이터로 성능을 검증하기 위해 데이터셋을 나눕니다.
- 특정 값이 많은 불균형 데이터일 경우 stratify - y 옵션을 적용함

※ 셔플 여부, 클래스 불균형 시 Stratify 옵션 적용을 고려한다.
x_train, x_test, y_train, y_test = train_test_split(x_scaled, y, test_size = 0.2, random_state = 42)
모델 구조 정의
(하이퍼 파마리터)
은닉층 개수
- 딥러닝 모델의 은닉층 개수가 많을수록 복잡한 패턴을 학습 가능
model = tf.Keras.Sequential([
   tf.keras.layers.Dense(128, activation = 'relu'),
   tf.keras.layers.Dense(64, activation = 'relu'),
   tf.keras.layers.Dense(10, activation = "softmax")
])
뉴런개수
- 층당 뉴런 개수가 많으면 더 복잡한 패턴을 학습 가능하지만 과적합 가능성 증가
tf.keras.layers.Dense(256, activation = 'relu')
# 뉴런 개수 256개로 설정
활성화 함수
- 각 뉴런의 출력을 결정하는 비선형 함수
- relu (일반적으로 사용)
- sigmoid (이진 분류)
- softmax (다중 클래스 분류)
tf.keras.layers.Dense(128, activation = "relu")

tf.keras.layers.Dense(10, activation = "softmax")
모델 구조 정의

- Sequential, Dense를 이용해 신경망의 층을 구성한다.
- Sequentail 모델은 층 (Layer)를 순서대로 쌓아 구성하는 딥러닝

# input_shape : 입력 특성의 수 (x_train.shape[1] = 특성개수)

model = Sequential([

Dense(64, activation = 'relu', input_shape = (x_train.shape[1],)),
Dense(32, activation = 'relu'),
Dense(1)
])
모델 컴파일

- 문제 유형에 맞는 손실함수, 옵티마이저, 평가지표를 설정합니다.

※ 이진 분류는 binary_crossentropy, 회귀는 mse 등 손실함수를 정확히 선택한다.
optimizer = 'adam'  : 학습방법 (가중치를 어떻게 조정할지)
loss = 'mse' : 손실함수 (예측값과 실제값의 차이 측정, 평균 제곱 오차)
metrics = ['mae']  : 학습 성능 확인용 지표

model . compile(optimizer = 'adam', loss = 'mse', metrics = ['mae']
모델 학습

- 신경망이 중요한 특징을 학습하는 과정
- 모델에게 입력 데이터 x_train 과 정답 y_train 을 알려주고 지정한 횟수 epoch 만큼 반복해서 가중치를 조정하는 과정이다.
- 학습 과정에서 실제 정답과 비교해서 오차를 계산하고 오차가 작아지도록 가중치(w)를 조정합니다.
history = model.fit (X_train, Y_train, epochs = 100, batch_size = 16, vaildation_split = 0.2, verbose = 0)