Group Study (2023-2024)/Machine Learning 입문

[ML입문] week3 - 분류 알고리즘(2), 트리 알고리즘

이영세 2023. 11. 21. 13:47

확률적 경사 하강법

확률적 경사 하강법

 
 
 
  • 점진적 학습 알고리즘 중 대표적인 것은 확률적 경사 하강법(Stochastic Gradient Descent)
  • 전체 샘플을 사용하지 않고 train set에서 random하게 단 하나의 sample을 고르는 것이다.
  • epoch(에포크) : train시에 train set을 한 번 모두 사용하는 과정이다. 
    • train data에서 random하게 sample을 뽑아 사용한다.
    • 대상 데이터를 섞은 후 random하게, 일반적인 GD처럼 데이터를 한 개씩 추출하여 가중치를 업데이트한다.
    • 장점
      • 한 번 가중치를 업데이트하는 시간이 빠르다.
      • 메모리 소모가 적다.
      • local minima를 회피할 수 있다(항상 맞는 말은 아님)
    • 단점
      • 전체 데이터셋을 반영하는 데 오래 걸린다.
      • global minima를 찾지 못할 가능성이 있다.
      • 결과의 마지막 값을 확인하기 어렵다. ( 흔히 ‘튀는 현상’이라고 불리는데 비용함수의 값이 줄어들지 않고 계속 변화할 때 정확히 언제 루프loop가 종료되는지 알 수 없어 판단이 어렵다.)
    • local minima에 빠질 가능성 크지만 잘 빠져나온다. 튀는 현상으로 잘 이동하므로

미니 배치 경사 하강법 (minibatch gradient descent) 

  •  무작위로 몇 개의 샘플을 묶어(mini-batch) 학습을 수행한다.

배치 경사 하강법 (batch gradient descent)

  • 한 번의 epoch에 전체 sample을 사용한다.
  • 가장 안정적이나 그만큼 컴퓨팅 리소스를 많이 사용한다. 
    • 데이터의 랜덤한 부분만 입력해서 gradient 평균을 구해 가중치를 업데이트한다.
    • ex) 총 데이터가 400개 있고 batch size가 4 라면 100번의 loop를 돌면서 1epoch를 학습했다고 말한다.
    • epoch와 batch-size는 하이퍼파라미터 이므로 사람이 직접 선정한다 - 실험적으로 결정한다.

전체 배치 경사 하강법 GD (full-batch gradient descent)

  • 모든 데이터를 한 번에 입력하는 경사하강법
  • 각 data의 gradient를 모두 더해 하나의 값으로 weight(가중치)를 업데이트한다.
  • 장점
    • 가장 안정적이다.
  • 단점
    • 시작점에 따라 지역 최적화(local minima)에 빠질 수 있다.
    • 메모리 소모가 크다.

 

경사 하강 알고리즘

  • 비용함수 J(θ(0),θ(1))를 최소화 하는 θ를 구하는 알고리즘
  • gradient descent의 기본 아이디어 : loss function을 최소화 하기 위하여 반복해서 파라미터를 조정해가는 것. 파라미터인 vector $\theta$에 대해 loss functinon의 현재 gradient를 계산해서 gradient가 0이 될 때까지 진행하는 것이다.
  • 이 때 gradient가 0이 되는 시점은 local minima혹은 global minima이다. global minima에 도달하는 theta가 최적의 theta이다.
  • 비용 함수(cost function) : 내가 만든 모델이 실제 정답과 얼마나 다른지를 측정하는 수단. 실제 값(정답)과 모델이 예측한 값 간의 차이가 바로 error이다.

⇒ 비용함수의 값이 클수록 해당 모델의 정확도가 낮다.

 

Objective Function, Loss Function, Cost Function

Objective Function, Loss Function, Cost Function의 차이

  • Objective Function (목적함수) : 학습을 통해 최적화시키려는 함수
  • Loss Function (손실함수) : 하나의 input data에 대해서 오차를 계산하는 함수
  • Cost Function (비용함수) : 모든 input data에 대해서 오차를 계산하는 함수. 모든 data에 대한 loss를 평균내어 cost를 계산할 수 있다. 

 

SGDClassifier

SGDClassifier : 사이킷 런에서 확률적 경사 하강법을 제공하는 대표적인 분류용 클래스. 

sc = SGDClassifier(loss='log_loss', max_iter=10, random_state=42)

log_loss : 로지스틱 손실함수

max_iter : 수행할 epoch 횟수. (전체 train set을 10회 반복한다.)

sc.partial_fit(train_scaled, train_target)

 

 

에포크와 과대/과소 적합

과대적합 : 머신러닝 모델을 학습할 때 학습 데이터셋에 지나치게 최적화하여 발생하는 문제. train set에서는 모델 성능이 높게 나타나지만 새로운 데이터가 주어졌을 때 높은 성능을 내지 못한다. 

과소적합 : 과대적합의 반대 개념. 머신러닝 모델이 충분히 복잡하지 않아(최적화가 제대로 수행되지 않아) 학습 구조/패턴을 정확히 반영하지 못하는 문제를 일으킨다. 

 

결정 트리

cf. info() : info 메서드는 데이터프레임의 각 열의 데이터타입과 누락된 데이터가 있는지 확인하는 데 유용하다. 
describe() : describe메서드는 열에 대한 간단한 통계를 출력해 준다. 최소, 최대, 평균값 등을 볼 수 있다. 

결정 트리 (Decision Tree, 의사결정나무) : 분류와 회귀 모두 가능한 지도 학습 모델 중 하나. 특정 기준(질문)에 따라 데이터를 구분하는 모델이다.

  • 설명하기 쉽다.
  • 데이터를 잘 나눌 수 있는 질문을 찾는다면 계속 질문을 추가해서 분류 정확도를 높일 수 있다.
  • 노드(node) : 결정 트리를 구성하는 핵심 요소. 훈련 데이터의 특성에 대한 테스트를 표현한다.
  • 가지(branch) : 테스트의 결과(true, false)를 나타내며 일반적으로 하나의 노드는 2개의 가지를 가진다. 
  • 맨 위의 노드를 루트 노드라고 부르고, 끝에 달린 노드를 리프 노드라고 한다. 

plot tree() 함수에서 다양한 매개변수를 쓸 수 있다.

  • max_depth = 1 : 루트 노드를 제외하고 하나의 노드를 더 확장해서 그린다.
  • filled : 클래스에 맞게 노드의 색을 칠할 수 있다.
  • feature names : feature의 이름을 전달할 수 있다. 이렇게 하면 노드가 어떤 특성으로 나뉘는지 좀 더 잘 이해할 수 있다.

<결정트리 읽는 방법>

  • 루트 노드 : 당도가 -0.239 이하인지 질문한다. Yes라면 왼쪽 가지로 가고 그렇지 않으면 오른쪽 가지로 이동함. (왼쪽이 yes, 오른쪽이 no)
  • samples = 5197 : 루트 노드의 총 샘플 수
  • 음성 클래스(레드와인) : 1258개, 양성 클래스(화이트와인) : 3939개
  • plot_tree() 함수에서 filled=True로 지정하면 클래스마다 색깔을 부여하고, 어떤 클래스의 비율이 높아지면 점점 진한 색으로 표시한다.

<결정트리에서 예측하는 방법>

  • 리프 노드에서 가장 많은 클래스가 예측 클래스가 된다.
  • 만약 이 결정 트리의 성장을 여기서 멈춘다면 왼쪽 노드에 도달한 샘플과 오른쪽 노드에 도달한 샘플은 모두 양성 클래스로 예측한다. 두 노드 모두 양성 클래스의 개수가 많기 때문.
  • 만약 결정 트리를 회귀 문제에 적용하면 리프 노드에 도달한 샘플의 타깃을 평균하여 예측값으로 사용한다. 
  • 사이킷런의 결정 트리 회귀 모델은 DecisionTreeRegressor이다.

 

불순도(지니 불순도) Gini impurity

DecisionTreeClassifier 클래스의 criterion 매개변수의 기본값이 gini이다.
앞의 트리에서 루트 노드가 지니 불순도를 사용하여 왼쪽과 오른쪽 노드로 나눈 것.


<지니 불순도 계산하는 방법>
지니 불순도 = 1 - (음성 클래스 비울^2 + 양성 클래스 비율^2)
노드에 하나의 클래스만 있다면 지니 불순도는 0이 되어 가장 작다. => 순수 노드

결정 트리 모델은 부모 노드와 자식 노드의 불순도 차이가 가능한 크도록 트리를 성장시킨다.
부모 노드와 자식 노드의 불순도 차이를 계산하는 방법 : 자식 노드의 불순도를 샘플 계수에 비례하여 모두 더한다. 그다음 부모 노드의 불순도에서 빼면 된다.
정보 이득(information gain) : 부모 노드와 자식 노드 사이의 불순도 차이

또다른 불순도 기준도 있다.
DecisionTreeClassifier 클래스에서 criterion='entropy'를 지정하여 엔트로피 불순도를 사용할 수 있다.
엔트로피 불순도도 노드의 클래스 비율을 사용하지만 지니 불순도처럼 제곱이 아니라 밑이 2인 로그를 사용하여 곱한다.
결론


결정 트리 알고리즘 : 불순도 기준을 사용해 정보 이득이 최대가 되도록 노드를 분할한다. 
노드를 순수하게 나눌수록 정보 이득이 커진다.
새로운 샘플에 대해 예측할 때에는 노드의 질문에 따라 트리를 이동한다.
그리고 마지막에 도달한 노드의 클래스 비율을 보고 예측을 만든다.

 

<가지치기>
결정 트리도 가지치기를 해야 과적합을 방지할 수 있다. 
cf. 특성값의 스케일은 결정 트리 알고리즘에 아무런 영향을 미치지 않기 때문에 표준화 전처리를 할 필요가 없다. 

 

교차 검증과 그리드 서치

train dataset : 학습을 위함
validation dataset : 학습 내용을 검토하고 성능을 체크하기 위함
test dataset : 개발-검증을 거친 모델의 최종 능력을 시험해보기 위함. 

validation dataset에 대한 accuracy가 중요한 이유
1. overfitting에 빠지지 않음
2. unseed data에 대해 좋은 성능을 보임 

교차 검증

3폴드 교차검증 : 훈련 세트를 세 부분으로 나눠서 교차 검증을 수행하는 것.
k-fold cross validation : 훈련 세트를 몇 부분으로 나누느냐에 따라 다르게 부른다.


보통은 5-폴드 교차검증이나 10-폴드 교차검증을 많이 사용한다. 이렇게 하면 데이터의 80%~90%까지 룬현에 사용 가능하다.
검증 세트가 줄어들지만 각 폴드에서 계산한 겸증 점수를 평균하기 때무에 안정된 점수로 생각할 수 있다.

 

하이퍼파라미터 튜닝

- 모델 파라미터 : 머신러닝 모델이 학습하는 파라미터
- 하이퍼파라미터 : 모델이 학습할 수 없어서 사용자가 지정해야만 하는 파라미터.
- 머신러닝 라이브러리를 사용할 때 이런 하이퍼파라미터는 모두 클래스나 메서드의 매개변수로 표현된다.

하이퍼파리미터의 조합이 많기 때문에 그리드 서치를 사용한다.
사이킷런의 GridSearchCV 클래스는 하이퍼파라미터 탐색과 교차 검증을 한 번에 수행한다. 

- 랜덤 서치 ( random search)
매개변수의 값이 수치일 때 값의 범위나 간격을 미리 정하기 어려울 수 있다.
또 너무 많은 매개변수 조건이 있어 그리드 서치 수행 시간이 오래 걸릴 수 있다. 이 대 랜덤 서치를 사용하면 좋다.

 

트리의 앙상블

정형 데이터와 비정형 데이터
- 정형 데이터 structured data : 어떤 구조로 되어 있다. CSV나 데이터베이스, 엑셀에 저장되기 쉽다.
- 비정형 데이터 unstructured data : 텍스트, 사진, 음악 등

앙상블 학습 ensemble learning
- 정형 데이터를 다루는 데 가장 뛰어난 성과를 내는 알고리즘.
- 이 알고리즘 대부분은 결정 트리를 기반으로 만들어져 있다.

랜덤포레스트

- 결정 트리를 랜덤하게 만들어 결정 트리의 숲을 만든다.
- 그리고 각 결정 트리의 예측을 사용하여 최종 예측을 만든다.

- 각 트리를 훈련하기 위한 데이터를 랜덤하게 만든다. 입력한 train data에서 랜덤하게 샘플을 추출하여 훈련 데이터를 만든다. 중복 가능
- 이렇게 만들어진 샘플을 부트스트랩 샘플 bootstrap sample 이라고 부른다.
- 기본적으로 부트스트랩 샘플은 훈련 세트의 크기와 같게 만든다.

- 각 노드를 분할할 때 전체 특성 중에서 일부 특성을 무작위로 고른 후 이 중에서 최선의 분할을 찾는다.
- 분류 모델인 RandomForestClassifier : 기본적으로 전체 특성 개수의 제곱근만큼 특성 선택 + 각 트리의 클래스별 확률을 평균하여 가장 높은 확률을 가진 클래스를 예측으로 삼는다.
- 회귀 모델인 RandomForestRegressor는 전체 특성을 사용함 + 각 트리의 예측을 평균한다.

- 랜덤 포레스트는 랜덤하게 선택한 샘플과 특성을 사용하기 때문에 훈련 세트에 과대적합되는 것을 막아주고 검증 세트와 테스트 세트에서 안정적인 성능을 얻을 수 있다.

<OOB>
- 랜덤 포레스트 분류기에는 자체적으로 모델을 평가하는 점수를 얻을 수 있다.
- 부트스트랩 샘플에 포함되지 않고 남는 샘플이 있는데 이런 샘플을 OOB out of bag  샘플이라고 한다.
- OOB 점수를 사용하면 교차 검증을 대신할 수 있어서 결과적으로 훈련 세트에 더 많은 샘플을 사용할 수 있다.

 

엑스트라트리

- 기본적으로 100개의 결정 트리를 훈련함.
- 랜덤 포레스트와 동일하게 결정 트리가 제공하는 대부분의 매개변수를 지원함.
- 또한 전체 특성 중에 일부 특성을 랜덤하게 선택하여 노드를 분할하는 데 사용한다.

- 랜덤 포레스트와 엑스트라 트리의 차이점 : 부트스트랩 샘플을 사용하지 않는다. 즉각 결정 트리를 만들 때 전체 훈련 세트를 사용함. 대신 노드를 분할할 때 가장 좋은 분할을 찾는 것이 아니라 무작위로 분할한다.
- 랜덤으로 노드를 분할하기 때문에 빠른 계산 속도가 엑스트라 트리의 장점이다.

 

그래디언트 부스팅

- 깊이가 얕은 결정 트리를 사용하여 이전 트리의 오차를 보완하는 방식으로 앙상블 하는 방법.
- 깊이가 얕은 결정 트리를 사용하기 때문에 과대적합에 강하고 일반적으로 높은 일반화 성능을 기대할 수 있다.
- 경사 하강법을 사용해 트리를 앙상블에 추가한다.
- 분류에서는 로지스틱 손실 함수를 사용하고 회귀에서는 평균 제곱 오차 함수를 사용한다.

- 그래디언트 부스팅은 결정 트리를 계속 초가하면서 가장 낮은 곳을 찾아 이동한다.
- 또한 학습률 매개변수로 속도를 조절한다.

 

히스토그램 기반 부스팅

- 입력 특성을 256개의 구간으로 나눈다. 따라서 노드를 분할할 때 최적의 분할을 매우 빠르게 찾을 수 있다.
- 256개의 구간 중에서 하나를 떼어 놓고 누락된 값을 위해서 사용한다. 따라서 입력에 누락된 특성이 있더라고 이를 따로 전처리할 필요가 없다.

<히스토그램 기반 그래디언트 부스팅 라이브러리>
XGBoost, LightGBM