article thumbnail image
Published 2020. 11. 6. 16:02

 

 회귀 & 분류 

분류(Classification)와 회귀(Regression)는 지도학습(Supervised Learning)의 목적이라 할 수 있다.

 - 지도학습 : 입력과 출력 데이터(훈련 데이터)가 있고 이를 모델화하여 새로운 데이터에 대해 정확한 출력을 예측하는 것

 

분류와 회귀는 어떻게 다른가

분류 : 결과가 이산값

회귀 : 결과가 연속값


분류 (Classification)

분류는 class를 예측하는 것이다.

 

(세부적으로는 다중분류) 어떤 text를 입력했을 때, 그것이 어떤 class에 속하는지 예측하는 것이다.

이제는 hot하다고 말하기에는 너무 큰 흐름이 되어 버린 Deep Learning, 특히 CNN 에서 Tutorial 처럼 언급되는 개/고양이 이미지 예측 문제와 같은 것들이다.

즉, 예측해야할 대상(Class)이 정해져 있다.

이진 분류 (Binary classification)

예측해야 할 class가 두 가지인 경우이다.

내가 받은 메일이 스팸메일이냐 아니냐, 누군가가 나에게 보낸 메세지가 욕설이냐 아니냐와 같이 대답이 예/아니오로 구분될 수 있는 문제들을 주로 포함한다.

두 가지 class는 positive class, negative class로 나눌 수 있으며, 주로 학습하고자 하는 대상(즉, 예측하고자 하는 대상)을 positive class로 부르기도 하지만 주관적인 문제이다.

과거 회사 업무로 욕설 분류기를 개발했는데, 이때 욕설 class가 positive class가 된다. 아이러니하게도....

다중 분류 (Multi-class classification)

예측해야 할 class가 여러 가지인 경우이다.

위에서 언급한 언어 분류 모델 같은 경우, 입력 text가 영어 / 프랑스어 / 독일어 / 이탈리아어 / 스페인어 / 한국어 / 일본어 / 중국어 / 등등 어느 언어인지 분류한다.


회귀 (Regression)

회귀는 보통 연속적인 숫자, 즉 예측값이 float 형태인 문제들을 해결하는데 사용된다.

예를 들어, 지하철 역과의 거리, 일정 거리안의 관공서, 마트, 학군의 수 등등 여러 feature들로 어떤 지역의 땅값을 예측하는 문제와 같은 것들이다. 이 땅값은 평당 1천만원, 1.1천만원, 2천만원과 같이 특정 수로 결정되기는 하지만, 실제로는 특정 범위의 무한한 실수들 중에서 대푯값을 선택한 것이다.(평당 10,000,001원과 10,000,002원은 큰 차이가 나지않지만 분명 다르다. 이걸 10,000,000원의 대푯값으로 퉁 치는 셈이다.) - 대표값에 대해서는 추후 다시 다루도록 한다.

어쨌든 실제 1원단위 또는 소수점 단위의 금액이든 대푯값 역시 class가 아니다. 즉 출력에 연속성이 있다. 이 연속성 중에 어디에 점을 찍을 수 있는가를 예측하는 것이 회귀문제이다.


분류와 회귀 구분하기

분류와 회귀를 굳이 포스팅하는 이유는 여기에 있다. 과거의 나는 물론 주변에서 회귀에 대해 잘못 생각하는 경우를 종종 보았다.

분류와 회귀에 대해 명확히 구분하지 못하고 확률이나 통계를 다룰 수 있는 경우 조금 이상한 접근을 하는 경우가 있다.

위에 언급한 text가 욕설인지 아닌지 예측하는 문제를 다시 살펴보자.

"분류"를 이용하여 문제를 해결하고자 하는 경우, 입력에 대해 욕설 class일 확률과 욕설이 아닌 class일 확률을 예측하여 확률이 높은 class로 예측을 하는 것이 정상이다. 이렇게 학습하여 각각의 class에 대한 확률을 계산하려면 욕설 데이터를 수집하고, 욕설이 아닌 데이터를 수집해여 모델링하고 각각의 class에 대한 확률을 예측하는 것이 일반적이다. Deep learning에서 한번쯤 들어봤을 법한 softmax의 역할과 유사하다.(사실 각 class의 score 또는 확률들 중에서 무엇을 선택하는가의 문제이다.)

 

"분류"가 지도학습 범주에 있는 이유는 학습 데이터가 분류려는 class에 맞도록 이미 labeling이 되어 있기 때문이다.

- 이런 개XXX XX하고 있네 - 욕설

- 댓글 좀 달아주세요 - 정상

 

그런데..가끔이 문제를 회귀아닌 회귀(?)로 풀려고 접근하는 경우가 있다.

예를 들어 욕설에 대한 데이터만을 수집하고, 입력이 욕설일 확률을 계산하는 문제로 접근하는 경우가 있다.

물론 이렇게도 풀 수 있다. 하지만 이것은 분류나, 회귀의 문제가 아니다.

"회귀아닌 회귀"라는 표현을 사용한 이유는 출력이 확률이므로, 즉 float, 연속성을 가지고 있으므로 이것을 회귀라고 착각하는 경우때문이다.

이것은 학습데이터에서 관측된 feature이들 입력 text에서 발견되면 score를 높여가는(실제로는 확률도 아니다) scoring 방법이다.

 

이 경우, 최종 score가 일정 범위 안으로 정규화 되기 힘들고

- 입력의 다양성에 의해 최종 score가 얼마인지 알수 없다 : 최대 최소 정규화(min-max normalization)을 할 수 없다.

- 즉, 0~1사이로 정규화 할 수 없다.

그런데 꾸역꾸역 여기에 sigmoid니, relu를 붙여 정규화를 했다치자.(relu, sigmoid의 역할이 아닌데도..)

결국 score가 얼마 이상일 때, 이것을 욕설로 예측한다라는 threshold를 결정해야하는 문제가 남는다. (relu나 sigmoid에게 맡기려해도 최대값을 모르므로 어느정도가 1을 넘는지 알수 없다)

그리고 임의로 0.7점 이상이라면 욕설로 볼 수 있다라는 지극히 주관적이고 정성적인 판단을 한다. 여기에 평가셋을 붙여 90%이상의 정확도라고 말한다. 이렇게 "분류"를 한다고 말한다...

그러다가 학습데이터가 갑자기 늘어났다. 이제 0.7이라는 threshold는 더 이상 사용할 수 없다.

어디서부터 잘못된 것인가. 어디서부터 바로 잡아야 하나..

 

회귀는 확률을 예측하는 것이 아니다.

회귀는 출력은 연속성이 있고, 그 연속성 중에 어디에 점을 찍을지 결정하는 문제이다.

확률은 사건들의 연속, 독립, 반복 등의 시행(trial) 따라 표본공간(sample space, 일어날 수 있는 모든 경우의 수) 속에서 사건(event)이 발생할 경우의 수를 구하는 문제이다. 

 

해결해야할 문제를 정확히 인지하고, 어떤 데이터들을 수집하여, 어떻게 정제하야하는지 판단하고, 어떤 방법론(알고리즘)을 사용할지 선택하는 것이 Machine Learning을 하는 사람의 능력이다. 어려운 용어, 수학식을 들먹이며 이것으로 하자, 저것이 나으려나 고민하는 것이 Machine Learning을 하는 사람이 아니다.


출처: https://nexablue.tistory.com/entry/ML-분류Classification와-회귀Regression [비오는 날]

 

 

이진 분류를 하게 하기 위해 family=binomial 옵션을 주었었다.

로지스틱 회귀 : 분류가 두 개인 이진 분류 문제를 풀 때 적합하다.

 

 

과잉적합에 해당할 수 있으므로 결정트리로 너무 분할하면 안된다. 오버피팅

오히려 성능을 망칠 수 있다. 

완벽하게 맞지 않다라고 해도 적당한 조건에서 멈추는 것이 중요하다.

 

 

 

결정 트리(Decision Tree, 의사결정트리, 의사결정나무라고도 함)는 분류(Classification)와 회귀(Regression) 모두 가능한 지도 학습 모델 중 하나입니다. 결정 트리는 스무고개 하듯이 예/아니오 질문을 이어가며 학습합니다. 매, 펭귄, 돌고래, 곰을 구분한다고 생각해봅시다. 매와 펭귄은 날개를 있고, 돌고래와 곰은 날개가 없습니다. '날개가 있나요?'라는 질문을 통해 매, 펭귄 / 돌고래, 곰을 나눌 수 있습니다. 매와 펭귄은 '날 수 있나요?'라는 질문으로 나눌 수 있고, 돌고래와 곰은 '지느러미가 있나요?'라는 질문으로 나눌 수 있습니다. 아래는 결정 트리를 도식화한 것입니다.

 

이렇게 특정 기준(질문)에 따라 데이터를 구분하는 모델결정 트리 모델이라고 합니다. 한번의 분기 때마다 변수 영역을 두 개로 구분합니다. 결정 트리에서 질문이나 정답을 담은 네모 상자를 노드(Node)라고 합니다. 맨 처음 분류 기준 (즉, 첫 질문)을 Root Node라고 하고, 맨 마지막 노드를 Terminal Node 혹은 Leaf Node라고 합니다.

 

전체적인 모양이 나무를 뒤짚어 높은 것과 같아서 이름이 Decision Tree입니다.


프로세스

결정 트리 알고리즘의 프로세스를 간단히 알아보겠습니다.

 

먼저 위와 같이 데이터를 가장 잘 구분할 수 있는 질문을 기준으로 나눕니다. 

 

나뉜 각 범주에서 또 다시 데이터를 가장 잘 구분할 수 있는 질문을 기준으로 나눕니다. 이를 지나치게 많이 하면 아래와 같이 오버피팅이 됩니다. 결정 트리에 아무 파라미터를 주지 않고 모델링하면 오버피팅이 됩니다. 


가지치기(Pruning)

오버피팅을 막기 위한 전략으로 가지치기(Pruning)라는 기법이 있습니다. 트리에 가지가 너무 많다면 오버피팅이라 볼 수 있습니다. 가지치기란 나무의 가지를 치는 작업을 말합니다. 즉, 최대 깊이나 터미널 노드의 최대 개수, 혹은 한 노드가 분할하기 위한 최소 데이터 수를 제한하는 것입니다.

 

min_sample_split 파라미터를 조정하여 한 노드에 들어있는 최소 데이터 수를 정해줄 수 있습니다. min_sample_split = 10이면 한 노드에 10개의 데이터가 있다면 그 노드는 더 이상 분기를 하지 않습니다.

 

또한, max_depth를 통해서 최대 깊이를 지정해줄 수도 있습니다. max_depth = 4이면, 깊이가 4보다 크게 가지를 치지 않습니다. 가지치기는 사전 가지치기와 사후 가지치기가 있지만 sklearn에서는 사전 가지치기만 지원합니다.

 

출처 : bkshin.tistory.com/entry/머신러닝-4-결정-트리Decision-Tree

 

최적의 결정 트리를 만들어내야 한다.

 

어떻게?

 

rpart 를 만들어 놓았다.

 

꽃받침 길이, 너비

꽃잎 길이, 너비

 

3가지의 반응 변수

 

rpart(반응변수~., data)

 

iris는 이미 법주형이기 때문에 method='class' 옵션을 사용하지 않아도 된다.

 

par() : 그래프의 모양을 다양하게 조절할 수 있는 그래픽 인수들을 설정하고 조회하는 함수

mfrow / mfcol : 한 화면에 여러 그래프를 비교해볼 때 사용. figure region을 나누어 plot region을 만들고 배치 순서를 정하는 인수

mfrow : 그래프를 행 우선 배치 # default = c(1,1)

mfrcol : 그래프를 열 우선 배치

 

과잉적합을 방지하기 위해 멈춘다.

 

 

사전 확률 : : 현재 가지고 있는 정보를 기초로하여 정한 초기 확률
확률 시행 전에 이미 가지고 있는 지식을 통해 부여한 확률
ex) 동전을 던져 앞면이 나올 확률 : 1/2

 

 

3개의 샘플을 가지고 예측해보자

 

 

결정트리를 나누는 기준이 얼마나 중요했는지 알 수 있다.

 

노드 넘버가 매기는 법

루트노드가 1번

 

 

 

결정 트리의 단점

: 성능이 낮다.

 

'📌 R' 카테고리의 다른 글

R (17) - Support Vector Machine (SVM)  (0) 2020.11.13
R (16) - 랜덤 포리스트  (0) 2020.11.13
R (14) - 일반화 선형 모델, 로지스틱 회귀  (0) 2020.11.06
R (13) - 모델링  (0) 2020.10.27
R (12) - 워드클라우드  (0) 2020.10.15
복사했습니다!