Study IT/Deep Learning

2. 분류 모델링

Socialmi 2024. 11. 5. 09:31

Feature Engineering

사전적 의미 : 도메인 지식을 이용해 원자료를 가공하여 특징을 추출하는 작업이다.
우리의 의미 : 기계학습을 실행하기 위해 데이터를 필요하다고 생각하는 정보로 만들어주 작업

앞선 글에서 설명하였듯이 딥러닝은 아래의 구조를 갖는다

입력층(Input Layer) > 은닉층(Hidden Layer) > 출력층(Output Layer)

 

여기서 은닉층의 각 노드는 어떤 의미를 가지고 있는지 모르지만, 어떤 의미를 가질 수 있도록 의도를 가지고 만들수는 있다. 

그렇다면 위 구조에서 '인간'의 개입으로 조정해주어야 하는것은 무엇인지 알아보자면(물론 이 또한 기계를 학습시켜 자동 적용 시킬 수 있다)

a : Fully connected, 모든 노드간 연결을 제어한 형태이다

b : Locally connected, 부분 노드간 연결을 제어한 형태이다

예를들어 자동차 관련분석을 수행할 때, 내부와 외부를 나눠 가중지를 조정할 수 있다.

사람들의 특징을 비교할 때, 남성과 여성을 나눠 가중치를 조정할 수 있다.

물론 위의 이야기는 모든 파라미터와 그에 대한 분석이 충분히 되었을 때 가능한 이야기 이다.

 

이러한 특징 추출은 딥러닝으로부터 특징 학습(Representation Learning)으로 발전하게 된다.

 


이진 분류

이진 분류란 말 그대로 0과 1 즉 두개로 나눠지는 상관변수를 선택하는 과정을 의미한다.

그러나 앞서 배운 여러개의 feature 즉 선형 모델에서 어떻게 이진 분류를 할 수 있을까?

방법은 의외로 간단하다

각 노드의 결과를 0과 1로 혹은 적절한 위치의 노드의 결과를 0과 1로 변경해 주면 된다

때문에 출력층 노드의 수는 2개이다

Layer Activation Function 기능
Hidden Layer
은닉층
ReLU 0 혹은 x값을 그대로 출력
좀 더 깊이 있는 학습을 하기 위함
Hidden Layer을 여러 층 쌓기 위함
선형 모델을 비선형 모델로 바꾸기 위함
Output Layer
출력층
회귀 X  
이진 sigmoid 결과를 0과 1로 반환하기 위함
다중 softmax 3개의 변수 이상을 계산 가능, 각 범주에 대한 결과를 범주별 확률 값으로 변환

# 이진분류 Sequential 모델 예시
model3 = Sequential([Input(shape = (n,)),
                     Dense( 4, activation = 'relu'),
                     Dense( 1, activation = 'sigmoid')])

 

이진 분류의 평가 지표는 crossentropy를 사용한다

# 이진분류 모델 컴파일 예시
m5.compile(optimizer = Adam(learning_rate=.01) , loss = 'binary_crossentropy')

 

가령 시그모이드 함수를 사용했다면 확률이 0.48, 0.60정도의 값이 나오는 것은 어떻게 분류를 해야할까?

 

여기서 후속처리가 필요한데, 분류 기준을 나누어(일반적으로 0.5) 이하의 값은 0으로 이상의 값은 1로 바꾸어주는 과정을 의미한다.

 

이는 다소 간단한 함수인 where함수로 매핑할 수 있다.

pred = np.where(pred >- 0.5, 1, 0)

# [[0.6543],
#  [0.2343]]

>>

# [[1],
#  [0]]

print(classification_report(y_val, pred))
# classification_report를 활용해 모델 성능을 평가한다

다중 분류

다중 분류는 위에서 언급했다시피 softmax함수를 사용하며, 이는 각 범주별 확률을 반환한다.

또한 0과 1이 아닌 a, b, c 등 여러 값으로 분류되기 때문에 출력층 노드의 수는 y의 범주수와 동일하다

 

# 다중분류 Sequential모델 예시
model = Sequential( [Input(shape = (nfeatures,)),
                     Dense( 3, activation = 'softmax')] )

 

다중 분류 모델을 위한 전처리 과정과 Loss fuction을 구하는 방법은 아래 두가지 방법이 있다

전처리 정수 인코딩
setosa(0)
versicolor(1)
virginica(2)
One-hot Encording
[[0,0,1],
 [1,0,0],
 [0,1,0]]
Loss Function sparse_categorical_crossentropy categorical_crossentropy

 

# 다중분류 모델 컴파일 예시
model.compile(optimizer=Adam(learning_rate=0.1), loss= 'sparse_categorical_crossentropy')

 

이진분류와 동일하게 해석을 위한 후속처리가 필요한데, 분류 기준별 집계가 필요하다. 가령 특징1은 0으로, 특징2는 1로 특징3은 2로 분류하여 표기해주는 등의 방법을 사용할 수 있다.

 

# 소프트맥스로 변환한 예측값
pred = model.predict(x_val)
pred[:5]


후속처리 중 가장 큰 값의 인덱스로 변환해주는 함수로 argmax()함수를 사용할 수 있다.

# 후속처리
pred_1 = pred.argmax(axis=1)
pred_1

 

728x90

'Study IT > Deep Learning' 카테고리의 다른 글

6. LangChain 과 RAG  (3) 2024.11.06
5. 딥러닝 언어모델 활용  (6) 2024.11.05
4. 합성곱 신경망(CNN, Convolutional Neural Network)  (0) 2024.11.05
3. 성능 관리  (0) 2024.11.05
1. 딥러닝 기초 개념과 회귀 모델링  (1) 2024.11.04