오늘은 힘든 수요일인데 힘든 딥러닝을 배웠습니다.
사실 배웠다고 한다면 머리속에 뭔가 있어야 하는데 그렇지 못하네요^^
autokeras 가 남아있습니다.ㅎㅎ 마지막에 배우기도 했고, 일단 쓴다면 이걸 쓸 수 있을 것 같습니다.
입력과 출력이 있다면 중간 함수는 당연히 하나씩 분석되고 알아야 하는게 속 편한데
머신러닝이나 딥러닝이나 그런게 사실상 불가능 하니 답답하기도 합니다.
본다고 알지도 못하겠지만 말이죠^^

코드를 직접 쳐보기 보다는 복사해서 실행하면서 전체적인 이해를 하는 형태로
강의가 진행됐습니다. 그래서 프로세스는 이해할 수 있었습니다.
코드에서 여러 옵션들이 있었는데 그런 것들의 의미를 이해하는 것도 괜찮지 않을까 생각도 들었습니다.
하지만 결국 데이터 분석한다는 건 미래를 예측하는게 중요한 것인데 결국 너무 모르는 상태로 쓸 수
있을까 라는 생각이 머리를 떠나지 않네요.
많은 공부가 필요한 영역이라는 생각이 듭니다.
정리해보겠습니다.

 

트리모델 - 결정트리

지도학습은 타겟이 있는 상태, 정답이 주어진 상태로 학습하는 머신러닝 방식입니다.
머신러닝에서 분류는 수많은 학습데이터와 타겟 간의 패턴을 찾아내서 미지의 데이터가 왔을때
어떤 분류일지를 예측하는 것을 의미합니다.

다양한 트리 모델이 있지만 그중에서 결정트리는 쉽고, 유연하게 적용할 수 있는 알고리즘입니다.
다만 학습성능을 과도하게 할 경우 너무 복잡해 지거나 과적합이 발생할 수 있습니다.

결정 트리는 쉽게 말해 if-else 같은 조건문이 무수하게 많이 있는 모델이라고 보면 쉽습니다.
분류기준은 두 개 또는 여러 개의 타겟을 나눌 것인가? 부터 시작되고, 그 기준을
정하는 방식에 따라 모델의 특성이 달라진다고 보면 됩니다.

결정트리는 구성은 다음과 같습니다.

- 규칙 노드 - 어떤 규칙의 조건 (if else의 조건과 비슷)
- 리프 노드 - 결정된 분류값 (조건문의 결과) - 데이터의 수, 특징이 반영
- 서브 트리 - 규칙노드가 2개 이상으로 이어질때 생성되는 트리

규칙 노드는 데이터 내의 컬럼의 값에 의거해서 결정됩니다.

 

지니불순도

여기서 중요한 지니불순도가 등장합니다.
한 데이터 집합의 불순도를 측정하는데 사용되며 결국 데이터가 잘 섞여 있는지 나쁘게 섞여 있는지
나타내는 지표입니다.

첫번째 한 데이터 집합 내에서 각 그룹이 차지하는 비율을 계산합니다.
두번째 각 그룹의 비율을 제곱하여 모두 더합니다.
세번째 1에서 이 값을 빼서 지니 불순도를 계산합니다.

예를 들어 어떤 데이터가 A와 B 클래스로 구성되어 있고, A클래스가 40%, B클래스가 60% 라고 가정한다면
이 경우 지니불순도는

1 - ((0.4)**2 + (0.6)**2)` 가 됩니다.  
1 - (0.16 + 0.36)` 이 되고,  
1 - 0.52` 즉 `0.48` 이 지니 불순도입니다.

지니불순도의 값은 0 과 1사이에서 변하며, 0에 가까울수록 데이터 분포가 균일하고, 0.5에 가까울수록
불균형에 가깝습니다. 0.5 이면 50% 이고, 가장 안 좋은 케이스 이며 0 에 가까울 수록 좋은 케이스입니다.
노드에서 분할이 진행될때 지니불순도가 많이 감소하는 방향으로 분할을 하게 되며 트리가 더 균일한
서브 그룹으로 분할하도록 합니다. 결정트리의 성능 향상에 중요한 역할을 합니다.

 

의사결정 나무

의사결정나무는 어렵지 않아서 해석에서 용이한 부분이 있습니다.
그래서 실무에서도 많이 사용하고, 고객의 패턴을 찾고자 할때 많이 사용하는 모델 중에 하나라고 합니다.
단점은 데이터셋의 편차가 크면 사용이 쉽지 않습니다. 가지가 많아지고 트리가 깊어지면 과적합 문제가
발생할 수 있습니다. 예측은 잘 되지만 모델의 일반화가 깨질 수 있습니다.
하지만 여러 옵션으로 다양하게 성능을 확인하고, 조절할 수 있기도 합니다.
가지치기, 한노드에 들어가는 최소 데이터수 제한, 최대깊이 제한 등을 간단하게 적용할 수 있습니다.

 

랜덤 포레스트

의사결정나무가 하나의 나무라면 그 나무들이 이루는 숲을 랜덤 포레스트 라고 할 수 있습니다.
랜덤포레스트는 각 트리를 훈련하기 위한 데이터를 랜덤하게 만듭니다.
우리가 입력한 훈련 데이터에서 랜덤하게 샘플을 추출해서 훈련 데이터를 만듭니다.
이렇게 하면 굉장히 다양한 경우의 수로 학습을 할 수 있습니다.
1000개의 데이터를 3번을 돌린다. -> 1번째 500개 데이터 -> 2번째 500개 데이터 -> 3번째 500개 데이터
는 같을 수도 다를 수도 있습니다. 같을 확률이 거의 없어서 다른 의사결정나무 3개가 생성되게 됩니다.

그리고 한 샘플이 중복되어 추출될 수도 있습니다.
1000개의 데이터중 100개의 샘플을 뽑는다고 할때 먼저 1개를 뽑고, 집어 넣은 다음 다시 1개를 뽑습니다.
이렇게 하면 적은 확률이지만 중복된 샘플을 뽑을 수 있고, 이를 붓스트랩 방법이라고 합니다.
붓스트랩을 적용한 샘플은 훈련세트 크기와 같게 만듭니다. 중복될 수 있으니까요.
그리고, 전체 특성 개수의 제곱근(루트) 만큼 특성(변수)를 정하게 됩니다.

1. 데이터도 랜덤하게
2. 변수도 랜덤하게

가 됩니다.
결국 랜덤포레스트는 기본적으로 100개의 트리를 만들게 되고, 붓스트랩 방식으로 무작위 변수로 학습니다.
그래서 각 트리의 클래스별 확률을 평균하여 가장 높은 확률을 가진 클래스로 예측모델을 만듭니다.

 

앙상블 학습의 유형

앙상블 학습의 유형으로는 보팅, 배깅, 부스팅 3가지로 나눌 수 있습니다. 스테킹이라는 방법을 사용하기도 합니다.

이것보다 보팅과 배깅을 잘 설명할 수 있는 이미지가 있을까 싶네요.
보팅은 여러 다른 게임을 제안하는 친구들이 있고, 가장 인기 있는 게임을 선택하는 것이고,
배깅은 같은 게임을 하는데 각 팀이 다른 전략으로 게임을 하고, 그 결과를 모아 최종 결정을 내리는 것 입니다.

부스팅은 여러 개의 분류기가 순차적으로 학습을 수행하되, 예측이 틀린 데이터에 대해서 올바르게 예측할 수
있도록 다음 분류기에서는 가중치를 부여합니다. 오답노트 만들어서 틀린문제 다시 풀어보듯이 분류기들이
서로의 실수에서 배우면서 점점 더 나은 결과를 얻게 됩니다.
가중치로 인해 모델이 부스팅되어 발전되기 때문에 부스팅 이라고 불립니다.

스테킹은 여러가지 다른 모델의 예측결과값을 다시 학습데이터로 만들어서 다른 모델로 재학습 시켜 결과를
예측하는 방법입니다. 여러 분류기가 각자 다른 방식으로 문제를 해결하고, 이 모든 분류기의 결과를
하나의 새로운 분류기가 분석해서 최종 결정을 내립니다.

 

딥러닝

딥러닝”Deep Learning”은 여러 층을 가진 인공신경망(Artificial Neural Network, ANN)을 사용하여 머신러닝 학습을
수행하는 것으로 심층학습이라고도 부릅니다. '딥'이란 표현을 쓰는 이유는 여러 신경망 레이어와 복잡하고 이질적이며
대량의 데이터를 포함하기 때문입니다.

딥러닝과 머신러닝의 차이는 머신러닝은 사람이 먼저 컴퓨터에 특징을 추출하고, 데이터를 정제해서 훈련할 수 있는
상태로 만들어 주어야 합니다. 반면 딥러닝은 사람이 하던 패턴 추출 작업이 생략됩니다.
컴퓨터 스스로 학습할 수 있도록 해서 경험을 통해 학습할 수 있게 됩니다.

 

딥러닝 인공 신경망(neural network)

딥러닝 과정은 사람이 직접 관여할 수 없어 숨겨져 있다고 흔하게 말합니다. 이를 블랙박스라고 말합니다.
그림과 같이 입, 출력만 나올 뿐 그 내부 작업은 명확하지 않은 것을 뜻합니다.
블랙박스 현상이 생기는 이유는 딥러닝에서의 히든레이어(Hidden layer)를 분석하는 것이 너무 어렵기 때문입니다.
히든 레이어 안에 수 많은 히든 노드들이 엉켜서 복잡하게 쌓여 있는데 이런 레이어가 수십개씩 존재한다고
하면 내부 수식 파악은 불가능 합니다.

 

딥러닝 프로세스

강의중 실습은 텐서플로로 진행했습니다. 딥러닝 프로세스를 정리해보겠습니다.

1. 환경 준비
    필요한 라이브러리들을 임포트 하고, 필요한 패키지 및 모듈을 준비


2. 데이터 준비
    데이터셋을 로드하고, 훈련세트와 검증 세트로 분할

 

3. 모델 구성
    간단한 신경망 모델을 구성합니다. 이 모델은 입력레이어, 은닉레이어, 출력레이어로 구성됩니다.
    Sequential 이란 딥러닝 모델을 만들겠다. 라는 선언을 하는 것이고, 그에 따라 여러 층으로
    되어있는 모델을 만들게 됩니다. 몇개의 층으로 만들것이냐? Dense라는 함수 안에 숫자와 설정은
    어떻게 해야하는가? 를 고려해야합니다.
    실습에서는 이미지처리를 했었는데 모델 구성에서 했던 순서를 정리해보면(샘플이라고 보면 됩니다.)

-   Sequential 모델을 생성합니다.  
    Sequential 모델은 레이어가 순차적으로 연결된 간단한 선형 스택으로 구성
-   Flatten 레이어는 입력 데이터를 1차원 배열로 평탄화합니다.  
    이 레이어는 데이터의 차원을 변경하기만 하므로 학습되는 가중치가 없습니다.
-   Dense 레이어 (은닉 레이어)  
    Dense 레이어는 완전 연결 레이어로, 이전 레이어의 모든 뉴런과 연결됩니다.  
    이 레이어에는 128개의 뉴런이 있으며, 활성화 함수로 ReLU (Rectified Linear Unit)를 사용  
    활성화 함수는 신경망에게 더 똑똑하게 동작하도록 도와주는 역할을 합니다.
-   Dense 레이어 (출력 레이어)
-   모델 컴파일  
    다양한 옵티마이저 함수를 사용할 수 있고, 손실함수를 설정할 수 있습니다.

4. 모델 실행
    모델을 훈련 데이터에 대해 훈련하고 검증 데이터로 검증합니다.
 
     Epoch(에포크) 는 전체 훈련 데이터셋에서 학습 알고리즘이 완료하는 전체 과정을 의미합니다.
     횟수를 지정할 수 있습니다. 너무 낮으면 충분히 학습되지 않을 수 있고, 너무 높으면
     과적합의 위험이 있습니다.

     Batch Size(배치크기) 은 모델을 한 번 업데이트 할때 사용하는 샘플의 수를 의미합니다.
     큰 배치 크기는 더 많은 메모리를 필요로 하며 작은 배치 크기는 업데이트가 자주 발생하여
     학습 시간이 오래 걸릴 수 있습니다.

     에포크는 전체 데이터셋을 얼마나 많이 사용하여 학습할지 결정하고, 배치 크기는 한 번에
     얼마나 많은 데이터를 사용하여 모델을 업데이트 할지 결정합니다.

     모델 실행 과정의 결과는 객체로 반환되는데 이 반환값(history)에는 학습중 발생한 여러가지
     사항을 담고 있고, 다양한 값들이 포함되어 있어서 시각화 할 수 있습니다.
     그 학습 과정의 상세 정보를 저장합니다.

 

5. 결과 확인
    훈련과 검증의 정확도와 손실을 확인합니다. accuracy를 사용하고 val_accuracy를 활용하여
    검증 데이터를 잘 예측하는지도 파악합니다.

 

코드를 사용하지 않고, 교안을 보면서 복습 겸 블로그 정리를 하려고 했습니다.
코드는 실행해 봤고, 정리해 두고, github에 올립니다. 5주차 3일에서 찾아보면 볼 수 있습니다.
제 github는

눌러서 확인할 수 있습니다.
핵심적인 내용도 많이 생략이 되었지만 진행되는 큰 그림은 알 수 있는 수업이었습니다.
autokeras는 생략합니다. auto잖아요.ㅎㅎ