미식가의 개발 일기

[KT 에이블스쿨(6기, AI)] 6주차, 딥러닝(회귀 모델링, 분류 모델링) 본문

KT 에이블스쿨(6기, AI)

[KT 에이블스쿨(6기, AI)] 6주차, 딥러닝(회귀 모델링, 분류 모델링)

대체불가 핫걸 2024. 10. 12. 19:23

<6주차 후기>

  • 딥러링의 기본 구조작동하는 전체 프로세스에 대해 배웠어요!
  • 딥러닝과 머신러닝의 구조는 기본적으로 비슷하지만, 딥러닝에서는 신경망의 여러 층을 사용하여 더 복잡한 모델을 구축합니다.
  • 머신러닝은 사용자가 수동으로 특징을 추출하고 도메인 지식을 활용하여 분석해야 했지만 딥러닝은 신경망이 자동으로 특징 추출 후 학습하는 형태입니다. 
  • 회귀, 이진 분류, 다중 분류에 대해 스케일링, 활성화 함수, 손실 함수 설정을 달리 해줘야 했는데 이 부분이 가장 주의해야 하는 부분이라고 말씀해주셨어요! 
  • 다음주에는 성능 관리와 시계열 데이터 모델링에 대해 배우는데 이번 실습에서 과적합으로 학습 곡선이 이상하게 나왔던 부분을 개선할 수 있는 방법에 대해 배울 것 같습니다. 
  • 딥러닝이라는 이름만 들었을 때는 엄청 어려울 것 같고 진입 장벽이 있었는데 강사님께서 어려운 부분은 반복 설명 해주시고 그때그때 강의 피드백을 받아 진행해 주셔서 따라가는데 어려움은 없었던 거 같습니다! 이번 주말에 잘 복습해서 다음주에 딥러닝 과정 마무리하고 다시 후기 들고 오겠습니다. 😊

 

딥러닝이란?

인간의 뇌를 모방한 인공 신경망을 사용하여 데이터를 학습하고 패턴을 인식하는 기술


머신러닝 vs 딥러닝, 출처: turing.com

 

구조

  • 신경망(Neural Networks)
    • 입력(외부에서 받는 특징), 은닉(특징 추출, 패턴 학습), 출력(최종 예측값) 계층으로 구성
    • 인간의 뇌 신경 구조를 본떠 만든 모델
    • 각 계층은 여러 개의 뉴런(Neuron)으로 이루어짐
    • 각 뉴런은 가중치(Weights)를 가지고 있으며 이를 조정하여 학습

출처: skynettoday.com

 

 

스케일링

딥러닝은 스케일링 필수!!
종류 스케일링
회귀 정규화, 표준화
이진 분류
다중 분류 정수 인코딩, 원-핫 인코딩
  • 정수 인코딩: target class들을 0부터 시작해 순차 증가하는 정수로 인코딩
from sklearn.preprocessing import LabelEncoder

int_encoder = LabelEncoder()
y_l = int_encoder.fit_transform(data['target']

→ `int_encoder.classes_`: 인코딩 범주 조회

  • 원-핫 인코딩: 이진 벡터 변환(하나의 1과 나머지 0으로 이루어진 고유한 벡터)
from sklearn.preprocessing import OneHotEncoder

oh_encoder = OneHotEncoder()
y_oh = oh_encoder.fit_transform(data[['target']]) # input 2차원
from keras.utils import to_categorical
y_c = to_categorical(y.values, 3)

→ `data['target_encoded'].toarray()`: 변환된 데이터 확인

 

 

학습 절차

model.fit을 했을 때
  1. 가중치에 초기값 할당(초기값은 랜덤)
  2. 초기 모델로 예측
  3. 오차(실제값-예측값) 계산: `loss function` 
  4. 오차를 줄이는 방향으로 가중치 조정: `optimizer` 
  5. 반복(오차의 변동이 거의 없거나 `max_iteration`에 도달할 때까지)

 

모델링

모델 선언 

nfeatures = x_train.shape[1] # 컬럼의 개수

# 메모리 정리
clear_session()

# Sequential 타입
model = Sequential( [Input(shape =(nfeatures,)),
                    Dense(8, activation = 'relu'),
                    Dense(4, activation = 'relu'),
                    Dense(1)])

# 모델요약
model.summary()
  • Input(입력층): `Input(shape = ( , ))`
    • 1차원: (feature 수, )
    • 2차원: (rows, columns)
  • Hidden Layer(은닉층): `Dense(뉴런의 개수, activation = 'relu')` → 활성화 함수 필요  
    • `relu`: 일반적으로 사용하는 활성화 함수
  • Output(출력층): `Dense(target의 수)`
종류 Dense
회귀 `Dense(1)`
이진 분류 `Dense(1, activation='sigmoid')`
다중 분류 `Dense(class 개수, activation='softmax')`

 

모델 설정

model.compile(optimizer=Adam(learning_rate=0.1), loss='mse', metrics=[])
  • `Adam`: 가장 성능이 좋은 optimizer(오차를 줄이는 방향으로 가중치 업데이트)
  • `learing rate`: 기울기에 곱해지는 조정 비율, 보폭 조절
  • `loss`(loss function)
종류 loss
회귀 mse
이진 분류 binary_crossentropy
다중 분류 sparse_categorical_crossentropy(정수 인코딩)
categorical_crossentropy(원-핫 인코딩)

 

  • `metrics`: 성능 평가 기준 설정 → 회귀: mean_absolute_error , 분류: accuracy 등 

 

모델 학습

history: 가중치 업데이트시 오차를 기록
history = model.fit(x_train, y_train, epochs=20, validation_split=0.2).history
  • `batch_size`: 적절히 나눠서 반복(기본값: 32) 
  • `epoch`: 학습 횟수 설정
  • `validation_split`: train 데이터에서 20%를 검증셋으로 분리

 

학습 곡선: 학습 경향을 파악하는데 유용
plt.plot(history['loss'], label='train_err',)
plt.plot(history['val_loss'], label='val_err')

plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend()
plt.show()

바람직한 학습 곡선: 초기에 오차가 크게 줄고 점점 완만해짐

 

모델 평가

  • 머신러닝에서 배웠던 모델 평가 지표를 똑같이 사용 
 

[KT 에이블스쿨(6기, AI)] 4주차, 머신러닝(머신러닝 이해, 성능 평가)

미니프로젝트가 끝난 후 기대하던 머신러닝 수업이 시작됐어요! 😊다음 주까지 총 5일간 진행되는데 이번 주는 머신러닝의 개념과 분류에 대해 학습하고, 모델링을 한 후 성능 평가를 하는 법

irreplaceablehotgirl.tistory.com

 

※ 이진 분류 모델은 activation이 sigmoid로 0~1사이의 확률값을 가지므로 0.5를 기준으로 잘라서 0, 1로 변환 후 평가

pred = model.predict(x_val)
pred = np.where(pred >= .5, 1, 0)

 

※ 다중 분류 모델은 각 클래스별 확률값 중 가장 큰 값의 인덱스로 변환 

pred = model.predict(x_val)
pred = pred.argmax(axis=1)

 

 

반응형