본문 바로가기
[ Artificial Intelligence ]

[AI/ML] 선형 기계학습 알고리즘 - 지도학습 (KNN, 의사결정 트리, 랜덤포레스트, LDA, SVM)

by dev charlotte 2024. 11. 30.

선형 기계학습 지도학습 알고리즘

> 지도학습 알고리즘

>> k-최근접 이웃 알고리즘

>> 의사결정 트리 

>> 랜덤 포레스트

>> 선형 판별 분석 

>> 서포트 벡터 머신

 

k-최근접 이웃 = k-NN 알고리즘

- 가장 단순한 머신러닝 알고리즘

- 저장된 학습 데이터 셋에 대한 판별

- 분류하고자 하는 데이터와 가장 이웃한 데이터 클래스들을 기반으로 클래스를 판별한다

 

- 간단한 계산, 조정 필요 없음 = 개념 증명 실험을 위해 채택

- k=3 ~ k=5

 

그래프에 러닝 클래스 0과 러닝 클래스 1이 분포하고 있을 때

테스트 데이터의 위치에서 가장 가까운 러닝 데이터 k개의 클래스를 기준으로

다수결이 투표를 통해 테스트 데이터의 소속 클래스를 판단한다

 

결정 경계 decision boundary

구분된 클래스를 기준으로 결정 경계를 그리면 클래스 영역이 두 개로 구분된다

 

k값이 작을수록 

테스트 데이터의 클래스를 결정할 때 고려하는 훈련 데이터의 개수가 적다

그래서 로컬 패턴에 민감하다

노이즈와 아웃라이어(이상치)에 영향을 받는다

오버 피팅의 우려가 있다

 

k값이 클수록

테스트 데이터의 클래스를 결정할 때 고려하는 훈련 데이터의 개수가 많다

그래서 글로벌 패턴을 반영한다

적당하면 좋지만 과하면 언더 피팅의 우려가 있다

 

의사결정 트리 = decision tree

- 분류 회귀 문제 모두 사용 가능

- 예/아니오 이진형태로 답변 가능한 질문으로 학습

- 적은 질문으로 구분하는 것이 좋은 트리

- 루트 노드 ~ 리프 노드 경로에서 방문하는 노드는 모두 질문, 마지막 리프 노드가 의사결정 노드

 

의사결정 트리를 적용하여 데이터 셋을 분할하는 과정

- 첫 번째 분할에서 데이터를 가장 잘 나누는 기준에 따라 두 구간으로 분할

- 나눠진 구간을 다시 분할하여 세부적 분할을 진행

- 더 작게 나누어 복잡한 경계를 형성

>> 데이터를 계층적으로 분할하며 학습하는 방식을 시각화하는 것

 

트리가 너무 깊어지면 버 피팅 발생 가능성이 있다

훈련 데이터가 세부적인 노이즈까지 학습하기 때문에

unseen 데이터에 대한 제너럴라이즈하는 성능이 떨어질 수 있다

 

반대로

트리가 너무 얕으면 데이터 특성을 잘 반영하지 못해 언더 피팅 발생 가능성이 있다

 

두 문제를 방지하기 위해 

트리 깊이를 적절하게 제한하거나 

가지치기 (프루닝)으로 모델 복잡도를 조정해야한다

 

가지치기 작업에는 

사전과 사후 두 종류가 있다

사전 가지치기에서는 트리 생성 단계에서 깊이를 제한하고

사후 가지치기에서는 트리 생성 이후 각 리프 노드의 데이터 포인터 개수에 따라 삭제나 병합을 수행한다

 

사후 가지치기를 진행하는 각 리프노드에는 

더 이상 분할되지 않은 최종 노드이므로 

각 조건에 해당하는 데이터 포인트들이 모두 모여있다

최소 데이터 포인트 수 등 특정 기준에 적합한 리프 노드를 삭제, 병합하여

너무 적게 데이터를 가진 것을 제거해서 불필요하게 복잡해지는 상황을 방지한다

 

의사결정 트리에서는 관측하지 못한 새로운 분포 패턴의 데이터에 대해 전혀 예측하지 못하는 단점이 있다

(모든 트리 기반 모델의 한계)

 

랜덤 포레스트

- 의사결정 트리의 단점 = 러닝 데이터셋에 과하게 오버피팅 되는 경향 (=분산이 크다) + 가지치기할 양을 사전에 방지하기 어렵다

- 앙상블 기법으로 해결하고자 한 것이 랜덤 포레스트 (트리 여러 개니까 포레스트)

- 여러 의사결정 트리를 앙상블한 랜덤포레스트 모델이 비교적 부드러운 디시젼 바운더리로 데이터셋을 예측한다

 

(의사결정 트리는 데이터셋을 잘 분할하기 위해 조건을 계속 추가하게 되는데 트리가 깊어질수록 러닝 데이터에 대해 세부적인 패턴을 지나치게 학습하게 된다. 작은 데이터에도 민감한데 리프노드의 데이터 포인터 개수가 너무 적을 때는 노이즈나 아웃라이어를 반영한 결정이 되기 쉽고, 특정 데이터에만 옵티마이제이션된 디시젼 바운더리를 만들게 된다. 데이터의 작은 변화에도 민감하게 반응하는 분산이 큰 모델이라 러닝 데이터셋의 일부가 추가, 삭제되면 트리 구조가 크게 바뀌고 결과도 크게 달라진다. 이렇게 작은 차이를 증폭시켜서 학습하는 모델을 분산이 크다고 한다)

 

(사전 가지치기를 많이 하면 언더피팅, 적게 하면 오버피팅의 우려가 있고 사후 가지치기를 많이 하면 중요 정보를 잃을 수 있고 적게 하면 오버피팅 문제가 해결되지 않을 수 있다)

 

- 의사결정 트리는 오버피팅 되지만 인풋 데이터에 대해 예측 성능이 좋으니까 이 트리를 랜덤으로 많이 만들어서 분산을 줄이는 방식

 

- 랜덤하게 트리를 만드는 방법은 두 가지

트리 생성 데이터를 랜덤하게 선택

데이터셋 분할 질문에서 특성을 랜덤하게 선택

 

> 부트스트래핑 (데이터셋 랜덤 선택)

- 데이터셋에서 중복 선택, 미선택 등이 발생할 수 있지만 같은 크기로 새 데이터셋을 생성한다

- 여러 데이터셋을 생성하고 각각의 의사결정 트리로 학습할 때 쓰일 질문도 랜덤하게 일부분만 선택한다

- 그럼 결론적으로 생성된 여러 개의 의사결정 트리는 각기 다른 데이터셋과 다른 학습 방식으로 얻어진 것이 된다

- 평가 데이터가 들어오면 각 의사결정 트리가 예측한 후 투표로 결정한다 (이때 예측 확률값을 평균 내서 투표하는 약한 투표 전략을 적용)

 

- 여러 개의 의사결정 트리를 앙상블한 랜덤포레스트 모델이 비교적 부드럽게 데이터셋을 예측하는 것을 확인할 수 있다

선형 판별 분석 LDA

- 분류문제, 차원 축소 문제 등

- 머신러닝 알고리즘

- 데이터 클래스 간의 분류 정보를 최대한 유지시키면서 차원을 축소할 수 있는 공간을 새롭게 찾는 알고리즘

 

- 선형 판별 분석이 계산하는 벡터의 성질

* 클래스 간  합 ( 투영들의 평균 사이 거리의 합 )이 최대가 되게 하는 벡터

* 클래스 내 투영들의 분산이 최소가 되게 하는 벡터 

 

- 특정 공간 상에서 클래스 분리를 최대화하는 축을 찾기 위해 클래스 사이의 분산과 클래스 내의 분산의 비율을 최대화하는 방식으로 차원을 축소한다

 

 

파란색과 빨간색 점들이 각각 서로 다른 클래스를 가진 데이터 포인트를 각각 x축과 y축에 투영한다고 해도 그 투영값들이 서로 겹치는 부분이 많아진다. x축과 y축은 클래스 분리를 최대화하는 축이 아니다. 

왼쪽 그림에서 새로 추기한 연두색 축은 클래스 간의 분리를 어느 정도 늘려주고 있고 두 번째 그림에서는 클래스 간의 분리를 최대화했다.

= 데이터의 분포를 더 명확하게 했다.

= 데이터 클래스 간 분리도를 최대화했다.

= 클래스 간 평균 거리가 최대화되었다.

= 각 클래스 내부 데이터의 분산이 최소화되었다. 

= 히스토그램 상에서 두 데이터 클래스의 분포가 거의 겹치지 않도록 정렬되었다. 

 

 

선형 판별 분석이 결정 경계를 계산하는 과정에서 데이터 셋의 분포 특성상 선형으로는 구분이 어려워지는 경우가 있다. 이런 문제를 해결하기 위해 판별 분석을 선형으로 제한하지 않고 이차 함수 형태로 변형하는 이차 판별 분석 알고리즘이 존재한다. 이차 판별 분석 알고리즘은 데이터셋의 클래스별 공분산이 다르다고 가정하고 결정 경계를 계산하고, 선형 판별 분석에 비해 좀 더 유연한 결정 경계를 얻을 수 있지만 계산량이 늘어난다. 

 

서포트 벡터 머신 SVM

- 분류, 회귀문제

- 비교적 간단하게 계산 가능하며 뛰어난 성능을 보여 딥러닝 전에 주목 받았던 ML 알고리즘

 

두 클래스를 나누는 문제에서 데이터들이 잘 분류되어 있다면 데이터를 분리할 수 있는 방법은 무수하게 많다. 아래 그림에서 모두 다 클래스를 잘 분리하지만 b1이 조금 더 좋은 분류기라 할 수 있다.  두 클래스를 조금 더 여유있게 분리하고 있기 때문이다. 

 

경계선으로부터 두 클래스의 첫 데이터까지 닿는 거리를 마진이라고 하는데 마진 값이 더 클수록 더 여유있는 결정 경계를 얻을 수 있다. 마진이 최대가 되게 하는 두 경계를 서포트 벡터라고 한다. >> 교안에는 이렇게 되어 있지만 정확한 구분이 필요하다. 두 경계라면 마진 경계일 것이고, 마진이 최대가 되게 하는 하나의 결정 경계인지, 두 마진 경계인지, 결정 경계와 마진 경계인지, 마진 경계 위에 있는 결정 경계와 가장 가까운 데이터 포인트인지 확인이 필요하다.

 

하지만 데이터 분포에 따라 필연적으로 마진값이 충분하게 확보되지 않는 서포트 벡터가 계산될 수 있다. 이 문제를 해결하기 이해서는 여유 변수를 설정해서 어느 정도 마진 내의 오차는 허용하는 방식을 채택하기도 한다. 

 

이 그림에서 델타 크기만큼의 여유 변수를 허용하지 않았다면 (=델타 크기만큼의 여유를 허용하지 않았다면) 서포트 벡터가 이상한 형태였을 것이다.