* 들어가기전
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, ...])로 나옴
'딥러닝' 카테고리의 다른 글
[딥러닝] 언어모델 이해 (1) ChatGPT API로 연결하기 _ 20241105 (8) | 2024.11.05 |
---|---|
[딥러닝] CNN _ 20241104 (0) | 2024.11.04 |
[딥러닝] 딥러닝 모델 저장하기 _ 20241101 (2) | 2024.11.01 |
[딥러닝] 딥러닝 성능관리 _ 20241101 (2) | 2024.11.01 |
[딥러닝] 딥러닝 모델링 (#1. Regression) _ 20241031 (3) | 2024.10.31 |