ML – 머신러닝 기본 개념과 KNN

머신러닝으로 해결할 수 있는 대표적인 문제는 두 가지입니다.

바로 분류회귀입니다.

분류가능성있는 클래스 레이블 중 하나로 예측하는 것으로 Output이 나올 수 있는 경우가 한정돼있습니다.
Ex) 스팸 메일 분류, 붓꽃 분류

회귀는 연속된 실수를 예측하는 것입니다.
회귀는 분류와 달리 output이 나올 수 있는 경우가 무한개입니다.
Ex) 어떤 사람의 교육 수준,나이,주거지를 바탕으로 연간 소득을 예측
[ 입력: 교육 수준,나이,주거지 -> 출력: 연간소득 ]

이번 포스팅에서는 분류를 기준으로 머신러닝 기본 개념을 설명하겠습니다.

요트를 구매한 고객과 구매하지 않은 고객 데이터를 이용하여 (새로운 데이터가 왔을 때 요트를 구매할 것인지)예측할 것입니다.

결국 구매 할 확률이 높은 고객에게 홍보 메일을 보내는 것이 목표입니다.

일반적인 머신러닝 진행 과정 <지도학습>

1. (고객의 숫자, 집 소유했는지 정보, 아이들의 수, 결혼했는지 정보, 개가 있는지 정보)와 (요트를 구매했는가)를 학습 데이터로 사용합니다.

2. 분류 알고리즘을 이용해서 각각 보트를 살 것인지 아닌지 예측하는 학습을 하고 모델을 생성합니다.

3. 학습된 결과와 (요트를 구매했는가)열을 비교해서 학습 모델의 정확도를 측정할 수 있습니다.

4. 새로운 데이터를 모델에 적용해서 마찬가지로 예측을 할 수 있습니다.


모델 복잡성과 오버피팅 개념

위에서 8개의 데이터를 학습 데이터, 4개의 데이터를 테스트 데이터로 사용하겠습니다.

학습은 아래 가정에 의해 예측한다고 생각해봅시다.

가정1: 45세 이상 and (자녀가 셋 이하 or 이혼 하지 않은 고객)이 요트를 구매한다.

이 가정에 의하면 학습 데이터는 100%의 정확도를 보입니다.

근데 이것은 학습 데이터에 대해서만 정확율이 100%인 것은 아닐까요?

이제 4개의 데이터로 시험을 보겠습니다. 만약 테스트 데이터의 정확도도 높을 경우 홍보에 사용이 가능합니다!

하지만 구한 결과 test 데이터에서는 정확율이 75%가 나옵니다.

이러한 사실을 보고 우리는 아래와 같은 사실을 확인할 수 있습니다!

(학습 데이터를 보고 선택한) 가정이 복잡하다 -> 모델이 복잡하다 -> 학습 데이터에만 잘 맞을 확률이 높다(시험 데이터의 정확도가 낮다)

같은 Data Set을 이용해서 두 번째 가정을 해보겠습니다.

가정2: 50세 이상이 요트를 구매한다.

이 가정에 의하면 학습 데이터와 테스트 데이터는 모두 100%의 정확도를 보입니다.

이러한 사실을 보고 우리는 아래와 같은 사실을 확인할 수 있습니다!

(학습 데이터를 보고 선택한) 가정이 간단하다 -> 모델이 간단하다 -> (가정1)보다는 시험 데이터의 정확도가 좋다(더 좋은 모델이다)

위의 가정들과 관련된 개념을 아래에 소개합니다.
이는 머신러닝에서 많이 나오는 개념이니 숙지해두시는 편이 좋습니다!

일반화: 모델이 처음 보는 데이터에 대해 정확하게 예측할 수 있으면 이를 일반화라고 함
과대적합: 모델이 너무 복잡해서 학습 데이터의 성능만 좋은 것 – 가정1
과소적합: 모델이 너무 간단하여 데이터의 다양성을 잡아내지 못함, 학습 데이터도 정확율이 낮음

첫 번째 포스팅에도 작성했지만 머신러닝의 목표는 새로운 데이터가 왔을 때도 올바르게 예측하는 모델을 만드는 것입니다.
결국 Sweet spot에 해당하는 모델이 가장 우수한 모델이라고 말할 수 있습니다.

여기서 잠깐!

그렇다면 (가정2)로 학습 모델을 만들면 모두 해결이 될까요?

정답은 X입니다.

가정1,2 둘 다 학습 데이터가 너무 적기 때문에, 가정1,2에서 나온 모델들 전부 좋은 모델이라고 말하기는 힘듭니다.

위의 12개의 데이터는 극히 일부의 데이터에 해당되므로 성급한 일반화의 오류가 발생할 수 있기 때문입니다.
ex) (가정2)로 모델을 만들었는데, 12개 이외의 데이터는 모두 (가정2)에 성립이 안 됨 -> 일반화 능력: 0%

이 문제는 학습 데이터를 무진장 늘려서 (가정1 or 2)를 만족하는지 확인하면 해결됩니다!

요트 판매에서 고객 데이터 10,000개를 모았을 때도 (가정1 or 2)의 일반화 성능이 좋다면 그제서야 좋은 가정(모델)이라고 말할 수 있는 것입니다!

일반적으로는 가정이 간단해야 시험 데이터의 성능이 더 좋습니다.
그러나 만 명의 고객에는 엄청 다양한 이들이 많을테니 오히려 (가정1)에 해당하는 사람들이 더 많을 수도 있습니다.
결국 데이터 포인트(샘플)가 많아야지 과대적합 없이 복잡한 모델을 생성할 수 있는 것입니다!


이제는 대표적인 분류 모델:KNN 에 대해서 소개하겠습니다.

    


KNN에서 중요 매개변수는 MetricOf neighbor입니다.
[ Metric (서로 떨어져있는 데이터들의 가까움 정도), Of neighbor (이웃의 수:K) ]

KNN은 새로운 데이터가 주어지면 [기존 데이터 중 가장 가까운 k개의 데이터와 비교해서] 새로운 데이터를 분류(예측)하는 알고리즘입니다.

왼쪽 그림을 살펴보면 별이 새로운 데이터이고 가장 가까운 파란색 동그라미, 빨간 색 세모에 의해서 해당 색으로 분류되는 모습입니다. 이 때 K(Of neighbor)는 1이 됩니다.

오른쪽 그림을 살펴보면 별이 새로운 데이터이고 이웃의 수에 의해서 해당 색으로 분류되는 모습입니다. 이 때 K(Of neighbor)는 3이 됩니다.

더 자세히 알아 보겠습니다!


먼저 왼쪽 데이터(x:[a,b],y:class)를 바탕으로 플로팅을 해보았습니다.

KNN은 대표적인 게으른 학습(lazy learning)입니다.
학습 데이터가 주어져도 위처럼 데이터셋이 저장하는 것이 전부입니다.
그리고 테스트 데이터(test data)가 올 때까지 기다렸다가 데이터가 input되면 그 때 모델을 생성합니다!

일반적인 학습은 학습 데이터가 주어지면 테스트 데이터가 input되기 전부터 바로 모델을 생성한다는 차이를 지닙니다.

위 수치 데이터를 모두 학습 데이터로 사용하고, 나머지 전체로 테스트해서 모델을 만들었습니다.
여기서 ‘나머지 전체’세모 데이터와 동그라미 데이터 주변에 무수히 많은 데이터가 있다고 가정하고 분류한 것입니다.

이렇게 학습 모델을 만들고 분할 평면을 그려보면 경계선(Decision boundary)이 확인됩니다!

경계선을 기준으로 위쪽 데이터는 모두 빨강으로 분류됩니다.
아래쪽은 모두 파랑으로 분류됩니다.

k가 작을수록 경계선이 구불구불합니다.이 때, 훈련 데이터의 정확도는 높습니다.
빨간 세모 데이터와 파란 동그라미 데이터가 각각 올바른 구간에 위치한 모습을 보입니다!

그러나 위처럼 너무 구불구불하면 새로운 데이터가 왔을 때 오분류 가능성이 높습니다.
과대적합이 될 가능성 높습니다.

를 들어보겠습니다!

k=1일 때, 새로운 데이터(검은색 동그라미)빨강 세모 한 개랑 가까우니 빨강 세모로 분류됩니다.
그러나 전체적으로 보면 파랑 동그라미로 분류되는 것이 더 자연스럽습니다.

K=3이면 이러한 문제점은 사라지게 됩니다.

K가 높음 -> 모델이 간단함(구불구불하지 않음) -> 오버피팅을 막을 수 있음 // 너무 높으면 언더피팅
K가 낮음 -> 모델이 복잡함(구불구불함) ->오버피팅 발생 가능성이 높음
(학습 데이터만 성능 좋음)

이웃의 수를 기반으로 모델을 평가했을 때, k가 6일 경우 test accuracy가 가장 높습니다.
이처럼 일반화가 잘 됐을 때, 우리는 좋은 모델이라고 말합니다.
그리고 이런 경우, 모델은 적당히 구불구불한 형태가 됩니다.

k=1이라면 모델이 너무 복잡해서 학습 데이터의 성능만 높은 결과를 보입니다.
학습 데이터에 만족하는 경계선이 시험 데이터에서는 만족하지 않는다는 의미입니다!

k=10이라면 모델이 너무 간단해서 학습 및 테스트 모두 성능이 낮은 것을 확인 가능합니다.
데이터의 다양성을 못 잡을 정도로 잘못된 경계선이라는 의미입니다!


KNN 모델을 통한 회귀(Regression) 문제 풀기

KNN을 통해 회귀 문제도 접근할 수 있습니다.
회귀 문제에서는 데이터의 x값을 Input으로 주고 y값을 예측합니다.

먼저 학습 데이터를 사용해서 플로팅을 합니다.

이후 테스트 데이터(별의 x)이 오면 모델을 만들게 되는데, 이 때 (별)의 y값은 가장 가까운 이웃과 같은 y값을 따르는 것입니다.

그리고 이처럼 K가 3인 경우, 가장 가까운 세 개의 타깃 값의 평균으로 y값을 구하게 됩니다!

여기서 잠깐!

output이 실수인데 정확하게 예측했는지 어떻게 알까요?

Coefficient of Determination(결정계수), R^2(R square)

R^2공식을 이용해서 정확도를 측정합니다.
예측이 정확하면 분수가 0이 되서 1이 되고 , 정확하지 않으면 분수가 1이 되서 0이 됩니다.
결론은 1에 가까울수록 예측이 잘 된 것입니다.

가장 좋은 모델 찾기

-3에서 3까지 1000개의 데이터 포인트를 만들고 테스트 데이터로 이용해서 만든 모델들입니다.
너무 데이터가 많으므로 예측치는 선 형태로 만들어지게 됩니다.

3-neighbor일 때 test score가 높으므로 가장 좋은 모델이 됩니다.

K가 높음 -> 모델이 간단함(구불구불하지 않음) -> 오버피팅을 막을 수 있음 // 너무 높으면 언더피팅
K가 낮음 -> 모델이 복잡함(구불구불함) ->오버피팅 발생 가능성이 높음
(학습 데이터만 성능 좋음)

이 마찬가지로 적용되는 것을 볼 수 있습니다.


포스팅을 마치기 전 머신러닝의 기본 개념을 한 가지 더 소개합니다.
바로 바이어스분산입니다.

바이어스 데이터가 중심으로부터 벗어난 정도입니다.
분산 데이터가 퍼져있는 정도입니다.

중심정답이라고 생각하면 됩니다!

데이터가 중심으로부터 많이 벌어져 있으면 바이어스가 높다고 표현합니다.
데이터가 중심 근처에 있으면 바이어스가 낮습니다. -> 정답과 가까운 값이니 좋은 것

데이터가 많이 퍼져 있을수록 분산이 높다고 표현합니다.
데이터가 조밀하면 분산이 낮다고 표현합니다.

바이어스와 분산이 모두 작을 때, 대부분의 데이터가 정답과 가깝다는 의미이니 좋은 것이 됩니다!

그러나 바이어스와 분산은 트레이드 오프 관계입니다.
따라서 최대한으로 두 개를 낮추는 방법이 필요합니다.

아래 그림에서 정답들은 파란색 점으로 찍혀 있고
모델이 내놓은 예측값은 직선 혹은 구불구불한 곡선으로 표현되어 있습니다. 
분산을 확인할 때는 모델이 내놓은 예측값을 확인하면 됩니다.
(구불구불한 모델일수록 데이터(예측값) 간 거리가 멀기 때문에 분산이 높음)

< 바이어스와 분산이 모두 낮은 형태 >
-> 12차보다 훈련 집합의 성능이 좋지는 않지만, 테스트 집합의 성능이 좋기 때문에 좋은 모델!

< 바이어스는 낮고 분산이 높은 형태 >
-> 훈련 집합의 성능은 높으나 테스트 집합의 성능은 낮음 (오버피팅)

< 바이어스는 높고 분산이 낮은 형태 >
-> 훈련 집합과 테스트 집합의 성능이 모두 낮음 (언더피팅)

감사합니다.

Leave a Reply

Your email address will not be published. Required fields are marked *