본문 바로가기
딥러닝

[딥러닝] 딥러닝 모델링 (#2. 이진분류, 다중분류) _ 20241031

by 황오독 2024. 10. 31.

* 들어가기전

Hidden Layer에서는 무슨 일이 일어나는가?

- 기존 데이터를 받아들여, 위 예시처럼 정확히 알기는 어렵지만, 무언가 새로운 특징(New Feature)을 만들어냄.

- 해당 특징은 예측값과 실제값 사이 오차를 최소화 해주는 유익한 특징

=> Hidden Layer를 통해 기존 데이터가 새롭게 표현(Representation), Feature Engineering!!

 

1. 이진분류

- ex) Survived 처럼 1, 0 으로 분류하여 예측하기 위함.

- Node의 결과를 변환해주는 함수가 필요!!

(1) 활성함수

Layer Activation Function 기능
Hidden
Layer
ReLU 좀 더 깊이 있는 학습(Deep Leaning)
- Hidden Layer 여러 층
- 선형 -> 비선형
Output
Layer
회귀 X  
이진분류 sigmoid 결과를 0~1로 확률 값으로 변환
다중분류 softmax 각 범주에 대한 결과를 범주별 확률 값으로 변환

 

(2) Loss Function : binary_crossentropy

- 오차들의 평균 계산

  예측값 y => 1 예측값 y => 0
y = 1 err 작게 (=> 0) err 크게 (=> 무한)
y = 0 err 크게 (=> 무한) err 작게 (=> 0)

 

(3) 후속처리

 - 결과를 .5로 잘라서 1,0으로 변환

 - ex) 0.58은 1, 0.43은 0으로 분류

 

(4) 평가 : Confusion Matrix, classification report

 

(5) 코드 풀어보기

# 모델 설계
model = Sequential([Input(shape=(n,),
					Dense(3, activation='relu'), # 히든함수 생성 (안해도 됨)
                    Dense(1, activation='sigmoid')]) # 출력값을 확률로 반환
                    
# 컴파일
model.compile(optimizer=Adam(0.01), loss='binary_crossentropy' # learning_rate 생략 가능

# 학습
history = model.fit(x_train, y_train, epochs=50, validation_rate=.2).history

# 학습곡선 (미리 만든 함수로)
dl_history_plot(history)

# 예측 및 평가
pred = model.predict(x_val)
pred = np.where(pred>.5, 1, 0) # .5 기준으로 1과 0 분류

print(classification_report(y_val, pred))

 

 

2. 다중분류

 - 회귀, 이진분류와는 다르게 Output Layer의 node 값이 여러개 (=y의 범주수)

 

(1) 다중 분류 모델링을 위한 전처리

  방법1 방법2
Y 전처리 정수 인코딩(0부터 시작)
ex) setosa(0)
      versicolor(1)
      virginica(2)
One-hot Encoding (=get_dummies)
[[0, 0, 1]
 [0, 0, 1]
 [1, 0, 0]]
Loss
Function
sparse_categorical_crossentropy categorical_crossentropy)

=> 두 loss function은 수학적으로 동일함! 편한 거 쓰면 됨.

 

① 방법 1 (정수 인코딩)

from sklearn.preprocessing import LabelEncoder

# 선언
int_encoder = LabelEncoder()

# 인코딩
data['Species_encoded'] = int_encoder.fit_transform(data['Species])

# 인코딩 된 범주 조회
int_encoder.classes_

# loss => sparse_categorical_crossentropy 사용

 

② 방법 2 (One-Hot Encoding)

from sklearn.preprocessing import OneHotEncoding

# OneHotEncoding 선언
oh_encoder = OneHotEncoding()

# 데이터 원핫인코딩하여 변환 (input:2차원)
encoded_y1 = oh_encoder.fit_transform(data[['Species']])

# 변환된 데이터 확인
print(encoded_y1.toarray())


from keras.utils import to_categorical

# 이미 정수 인코딩된 y를 이용하여 적용
encoded_y2 = to_categorical(data['Species_encoded'], 3)
print(encoded_y2)

# loss => 'categorical_crossentropy'

 

(2) 예측결과에 대한 후속 처리 (np.argmax())

 : 각 클래스별 확률값 중 가장 큰 값의 인덱스로 변환

pred = model.predict(x_val)
pred[:5] # 확률값으로 나옴

pred = pred.argmax(axis=1) # 확률 중 가장 큰 값의 인덱스로 변환
pred # array([0, 1, 1, 2, ...])로 나옴