Classification을 공부해보자. Classification은 말 그대로 분류를 하는 model을 만드는 것이다. 이전 포스팅에서 설명한 logistic regression은 binary값을 분류하는데 사용되었다. 그래서 마지막에 logistic regression은 사람에 따라서 Classification으로 분류하는 사람도 있다고 말했다. 이번엔 진짜 Classification을 공부해보자


아래와 같이 data가 마구자비로 분산되어 있다고 가정해보자.


일부러 x, y축은 안 그렸다. 왜냐하면 x, y 축을 그려버리면 2차원으로 보일테니까. 위의 각 하나의 점은 n dimension이다. 즉, (1,2)와 같은 2 dimensional data도 될 수 있지만, (1,2,3,4,5)와 같은 5 dimensional data도 될 수 있다는 것을 나타내고 싶어서 x, y축을 그리지 않았다. 이번 data는 가령 5 dimensional data이고 4개의 attribute은 numeric data, 나머지 하나는 nominal data라고 가정해보자. 예를 들어 아래와 같은 data들이라고 가정해보자.


(1,4,3,6,'a')

(4,8,3,1,'b')

(6,8,11,3,'c')

(6,5,8,3,'a')

....

(마지막 attribute은 class attribute이라고 부르고 'a', 'b', 'c' 중 하나라고 하자.)


kNN classification은 k개의 가장 가까운 data를 기반으로 예측을 하는 것이다. 데이터가 몰려있으면 그 몰려있는 그룹끼리 비슷한 특징을 지닐 것이라고 가정했기 때문이다. 우선 k=3으로 가정하고 아래의 data를 다시 봐보자.


뭐지... 별로 쓰지도 않았는데, 왠지 포스팅 다 한 것 같은 이 기분은... 음 아무튼 위의 그림을 다시 한번 보자. 빨간 점과 가장 가까운 세 개의 data가 원으로 묶여있다. 그 세 개의 data는 각각 'a', 'a', 'b'인데, 이것을 바탕으로 빨간점의 class attribute은 'a'일 것이다. 라고 추측하는 것이다.


그런데 여기서 궁금한 점이 생길 것이다. 가장 가까운 점을 어떻게 구할까? 거리를 구하는 공식에는 여러가지가 있다.


Hammington distance

Manhattan distance

Euclidean distance


여기서는 Euclidean distance로 거리를 측증하려고 한다. Euclidean distance는 우리가 가장 잘 아는 거리 계산법이다. 예를 들어, (0,0)과 (3,4)의 거리는 아래와 같다.


우리의 data set은 지금 4개의 numeric data를 가지고 있고 1개의 nominal data를 가지고 있다고 했다. 그 1개의 nominal data는 class attribute이고, 나머지 4개의 numeric data를 가지고 거리를 계산하면 된다. 가령 아래와 같이 계산 한다.


결국 거리 계산은 같은 방법으로 된다는 것을 알 수 있다. 아무튼 이러한 방법을 통해 우리는 빨간점에서 모든 데이터들간의 거리를 구한 후, 그것을 sorting하여 가장 가까운 k개, 여기서는 3개를 구하면 된다.(k=3으로 가정했으므로)


위의 그림을 다시 보면, 이제 뭐가 좀 더 자세히 보일 것이다. 빨간점을 기준으로 다른 점들과의 Euclidean distance를 이용하여 거리를 구한 후, 그 거리들을 Sorting하여 가장 가까운 k개(3개)를 구한 것이다.


여기서 Classification의 전제를 하나 설명해보자. Classification을 돌릴 때는 기본적으로 training set과 test set으로 나눈 후 돌리게 되어있다. 무슨 말이냐하면... 기본적으로 training set을 통해서 배우고 test set로 검사를 한다는 것이다. 예를 들어 아래와 같다.


세보면 알겠지만, training set은 29개이고 test set은 15개이다. 비율이 대충 2:1이다. 그렇다. 일반적으로!! 하나의 data set을 66%의 training set과 34%의 test set으로 나눈다. training set과 test set을 나누는 또 다른 방법으로 k fold cross validation이라는 방법도 있는데 이 방법은 나중에 설명하도록 하자.(어려운건 아니다. 그냥 지금 설명하기 귀찮을 뿐)


위의 training set과 test set을 통해서 kNN classification을 돌린다는 말은 무엇이냐면..

test set의 data 하나를 골라서 training data들과의 거리를 구한다.(Euclidean distance) 그것들을 Sorting하여 가장 가까운 k개의 점을 구한 후, 그 k개가 가지고 있는 class attribute 숫자를 세서 많은 쪽의 attribute value로 test set data 하나를 예측하는 것이다. 이 과정을 15개의 test set에 대하여 반복하여 값을 비교한다. 예를 들어 아래와 같이 계산한다.


test1 data로부터 10개의 training data들까지의 거리

test2 data로부터 10개의 training data들까지의 거리

test3 data로부터 10개의 training data들까지의 거리

를 모두 구하고


test1에서 가장 적은 distance 3개 구하고 class attribute 비교한다. (a 1개, c2개)

test2에서 가장 적은 distance 3개 구하고 class attribute 비교한다. (a 1개, c2개)

test3에서 가장 적은 distance 3개 구하고 class attribute 비교한다. (a 2개, c1개)


따라서,

test1은 c로 추측하고

test2는 c로 추측하고

test3은 a로 추측한다.


실제 test1, test2, test3의 class attribute과 비교해보자.


위의 경우에는 kNN Classification을 적용했을 경우, test set 3개 중에서 하나 밖에 안 맞았다는 결론이 나온다. 위의 엑셀 데이터는 그냥 랜덤으로 아무 값이나 체워넣은 것이기 때문에 맞을 확률이 별로 없다는 것을 참고하길 바란다.(1/3맞았으니 확률 상 맞긴 하네)


지금까지 kNN classification을 설명했다. 이것을 실제 data에 적용해보자. data set은 iris data set으로 매우 매우 유명한 data set이다.(구글 검색으로 아주 쉽게 구할 수 있다.) 이 data set은 4개의 numeric data와 1개의 nominal data로 이루어져있고, nominal data는 Iris-setosa, Iris-virginica, Iris-versicolor 셋 중에 하나이다. 4개의 numeric data를 통해 nominal data를 예측해보자. training data set은 전체의 67%로 잡고 나머지는 test data set으로 잡자.


python을 통해 위의 코드를 구현하여 accuracy를 구하면 다음과 같이 매우 좋은 accuracy를 구할 수 있다.

코드 구현은 여기를 참고하자.

참고 : http://......


다음 포스팅에서는 classification을 측정할 때 어떤 식으로 측정을 하는지 무엇이 중요한지 알아보고자 한다.

Posted by 빛나유
,

Logistic Regression을 공부해보자. 참 이것 때문에 시간을 좀 많이 쓰긴 했따. 나는 하나하나 일일이 손으로도 할 수 있을 정도의 디테일을 원하는데 그 정도의 디테일을 설명해둔 곳이 별로 없어서... 찾고 공부하고 찾고 하느라 못 했다. 아무튼 지금 글을 쓰고 있다는 것은 알긴 알았다는 것!


여기서 설명하고 있는 Logistic Regression은 실제 Python이나 R 등에서 구현되어있는 Logistic Regression과는 약간 차이가 있다. 이유는 이 글 마지막에 설명하겠다. 그래도 기본 원리는 이와 같으니 기본 원리를 이해하고 싶은 사람들은 읽어보면 좋다.


우선 Logistic Regression은 특정 attribute들을 통해서 0 또는 1을(yes or no) 구분하기 위한 방법이다. 예를 들어, 사람들의 구매 패턴을 분석하여 어떤 사람이 지금 이 물건을 살까 말까(0 또는 1)를 추측하거나, 사람들의 건강 상태를 분석하여 그 사람이 앞으로 10년 이상 더 살까 말까(0 또는 1)를 추측하는 것이다. 기본적으로 binary attribute이 하나 있어야 된다는 뜻이다.


이것들을 정확하게 추측할 수는 없다. 여기서 우리는 확률의 개념을 사용한다. 그 확률은 조건부 확률이다. X가 어떤 값으로 주어졌을 때, y가 1일 확률을 구하여라. 예전 고등학교때 많이 봤었던 그 조건부 확률이다. P(Y=1|X=n)로 나타낸다. 확률을 계산하는 문제에서 기존의 linear regression은 문제가 발생한다. 당연히 확률은 0과 1 사이의 값을 가져야 하는데 linear regression로는 그 boundary를 정할 수가 없다. 여기서 우리는 확률 p를 조금 변형시킬 것이다. 우선은 p/(1-p)로 변형시키자. 이런 것을 odds라고 하는데 이렇게 변형시키면 아래와 같이 된다.


이게 무슨 의미일까. 아직은 별 의미를 못 찾겠다. 그런데 여기에 log를 씌우면 뭔가 새로운 의미가 부여된다.


log를 씌우니까 p=0일때는 -무한대, p=1일때는 +무한대를 갖게 된다. p가 0과 1일 때가 균형을 갖게 된다. log를 씌운 이 함수를 우리는 logit function이라고 부르고 이 값이 x와 linear regression을 이루게 된다. 따라서 아래와 같은 식을 세울 수 있게 된다.


여기서 중요한 점이 하나 있는데, x가 1 증가할 때마다 log(p/(1-p))는 a만큼 증가한다는 것이다. 당연한 말이다. 당연한 말인데 logistic regression에서는 아주 중요한 내용으로 꼭 언급되고 넘어가는 부분이다. 아마도 log(p/(1-p))가 x와 linear regression을 이룬다는 점을 강조하기 위함이 아닌가 싶다. 아무튼 이 식을 p에 대해서 나타내고 p와 x의 관계를 그래프로 나타내보자.

그림 출처 : http://artint.info/html/ArtInt_180.html



위의 그림에서 x가  ax+b라는 것을 감안하고 보자. 아무튼 그래프를 보니 이제 뭔가 좀 그럴듯하다. 확률이니까 0과 1사이의 값을 갖되 x는 모든 값이 가능하게 되는 그림이다. (그림에서는 x값이 -10에서 10사이인데, 사실은 +,- 무한대로 뻗어 나갈 수 있다)


실제로 어떤 식으로 적용되는지 확인해보자. 이 데이터는 사람의 나이에 따라서 어떤 값이 yes 또는 no로 주어지는 데이터이다. 다운로드 한 data를 보면 아래와 같다.(data 첨부)

logistic.data


data source : http://vassarstats.net/logreg1.html


나이를 x로 놓고 조건부 확률 및 필요한 값들을 구해보면 아래와 같다


여기서 ln(odds)와 x는 linear regression 관계를 이룬다. 우리가 이전 포스팅에서 공부했었던 linear regression 구하는 방법으로 x와 ln(odds)의 best-fit line을 구하면 된다. 이 때 고려해야할 것은 data의 개수 인데, 예를 들어, 28의 ln(odds)는 -0.6931인데 이것이 6개 있다. 마찬가지로 29의 ln(odds)는 -0.4055인데 이것이 5개 있다. 이런식으로 33까지 개수를 센 후 linear regression을 통해 best-fit line을 구하면 아래와 같은 결과를 갖게 된다.


자 여기서 python을 통해 실제 logistic regression을 구해보고 결과를 보도록 하자.


coefficient와 intercept를 비교해보면 값이 얼추 비슷하기는 하나 다른 것을 알 수 있다. 왜 그럴까? python에서는 maximum likelihood estimation이라는 방법을 통해 구현했기 때문이다. 솔직히 maximum likelihood estimation가 뭔지는 잘 모르겠다. 이 부분은 나중에 다시 한번 공부해보도록 하자.


그리고 사실 이번 data는 사이즈가 너무 작아서 sigmoid function 그래프 모양이 잘 나오지 않았다. 그래서 조금 더 큰 data로 위와 똑같은 일을 하면 아래와 같은 그림이 나오게 된다.


자 이제 Logistic Regression을 마치는데 다음 포스팅 소개와 더불어 한 가지만 더 말해보자. Logistic Regression으로 우리는 binary attribute에 대한 확률을 구했다. 사실 이것은 (다음에 포스팅할) classification과 더욱 가까운 개념이다. 사실 그래서 Logistic Regression은 사람에 따라 classification model로 분류하는 사람들도 있다. 다음 포스팅부터는 classification을 자세히 공부해보자.


p.s. 아주 맘에 드는 포스팅은 아니지만, 공부하면서 가장 어렵다고 느낀 부분이었는데, 그래도 가장 기본이 되는 원리는 설명했으니 그나마 다행이다. 

Posted by 빛나유
,

이번 포스팅은 Multi linear regression이다. Multi linear regression이 뭐냐? 기본적으로 linear regression이기는 한데 linear regression에서는 x와 y축만 가지고 2 dimension linear line을 그린다. 3 dimension 이상이면 Multi linear regression이다. x1, x2, ..., xn의 값을 가지고 y의 값을 결정하는데 그것이 n dimension plane을 이룰 경우 Multi linear regression라고 한다. vector를 배우신 사람들이라면 알고 있겠지만, n dimension에서의 plane은 


ax1 + bx2 + ... + d = 0 (a,b, ..., d는 constant)


이런 식으로 나타낼 수 있다. 그래서 3 dimension 이상에 있는 data들에 대하여 linear regression을 적용시키고 싶을 경우에는 Multi linear regression를 적용시키면 된다. 3 dimension 이상에 있는 data? 쉽게 말해서 attribute이 3개 이상있는 data들을 의미한다. 그래서 어떻게 적용하면 될까?


기본적으로 적용하는 방법은 Multi linear regression과 똑같다. error에 대한 Least Square를 구하면 된다. 이전 포스팅에서 error가 뭔지 least square는 뭔지 설명해두었으니 참고하도록 하자. 참고로 아래에 나와있는 모든 수식은 직접 작성한 것이 아니고 다른 사람 것을 퍼온 것이다. 같은 출처지만 그림마다 출처를 남겨놨다. (작성하신 분께 감사를 표하며...)


우선 y와 X를 행렬로 나타내보자.

수식 출처 : http://www.uv.es/uriel/3%20Multiple%20linear%20regression%20estimation%20and%20properties.pdf


X에 첫번째 column에 1이 들어가는 이유는 아래의 수식을 보면 이해할 수 있다. y = bX + u와 같은 행렬 곱샘식으로 나타내면 아래의 식이 된다. 정리를 하고 넘어가야 할 것이, 여기서 X와 y는 실제 data들이다. 실제 data들은 100% linear 하게 표현이 되지 않기 때문에 약간의 error가 생기는데 그것을 u로 표현한 것이다.

수식 출처 : http://www.uv.es/uriel/3%20Multiple%20linear%20regression%20estimation%20and%20properties.pdf


그럼 위의 수식이 이해가 갈것이다. 이것을 이제 matrix로 표현하면 아래와 같다.

수식 출처 : http://www.uv.es/uriel/3%20Multiple%20linear%20regression%20estimation%20and%20properties.pdf


자 여기서 y는 실제 data값이라는 것을 다시 한번 집고 넘어가자. 아까도 말했듯이 우리는 y를 가장 비슷하게 표현하는 linear model을 원한다. X를 그 linear model에 집어넣었을 때 생기는 값은 당연히 y와는 차이가 난다. 그것을 우리는 y^으로 표현할거다. 그럼 아래와 같다.(b와 b^은 같은 거라고 생각하자.)

수식 출처 : http://www.uv.es/uriel/3%20Multiple%20linear%20regression%20estimation%20and%20properties.pdf


y^ = Xb^은 다시 한번 설명하면, 우리가 가장 원하는 100% 이상적인 공식이다. 그런데 실제 data는 x와 y이므로 그 차이 u가 존재하는데, 그것을 우리는 error라고 하고 그것의 제곱(square)를 최소로 하는 값을 찾고 싶은 것이다. 그래서 least square이다. 같은 내용을 계속 계속 반복하고 있는데, 중요해서이다. 가장 핵심이라...

수식 출처 : http://www.uv.es/uriel/3%20Multiple%20linear%20regression%20estimation%20and%20properties.pdf


이전의 linear regression 포스팅에서 그랬던 것 처럼 각각의 coefficient로 편미분을 한다. (b1, b2, ..., bk 이것들을 coefficient라고 한다.) 

수식 출처 : http://www.uv.es/uriel/3%20Multiple%20linear%20regression%20estimation%20and%20properties.pdf


편미분한 각각의 식이 0일 때 최소이므로, 위와 같이 0으로 수렴한다고 놓고 그것을 matrix식으로 고치면 위와 같이 X'Xb^=X'y와 같은 식이 나온다.(X'는 X의 transpose matrix이다.) 이 식 어디선가 많이 봤다. 몇 달 전에 linear algebra 포스팅할 때, projection 설명할 때 나오던 식과 많이 비슷하다. 그렇다 결국 projection에서 나온 식인 것이다.

참고 : http://operatingsystems.tistory.com/entry/Linear-Algebra-Projection-onto-a-line-and-a-subspace


결국은 같은 식의 유도가 편미분을 통해서도 가능하고 이전에 설명했던 방식으로도 증명이 가능하다는 샘이 되었다. 이제 한번 맞는지 실제로 테스트를 해보도록 하자.

data 출처 : http://reliawiki.org/index.php/Multiple_Linear_Regression_Analysis


위의 data를 위의 python code로 실행을 하면, 아래와 같은 결과를 얻을 수 있다.


r_value(correlation coefficient) 구하는 공식은 아래와 같다. 증명은 모르므로... 공식만 살짝 익히고 넘어가자.

수식 참고 : https://www.google.co.uk/url?sa=t&rct=j&q=&esrc=s&source=web&cd=33&ved=0ahUKEwjg4aysiOjJAhWJ1RoKHeCkCHk4HhAWCCowAg&url=http%3A%2F%2Fwww.stat.ufl.edu%2F~winner%2Fsta6126%2Fchapter11.ppt&usg=AFQjCNGMOESgJt97JoLmRy8YXCXqHZ4fcw&sig2=UeSD-gwbw7iumInjG_WlrA&cad=rja


위의 공식에서 SSE는 Sum of Square of Error인데 correlation coefficient을 구할 때 직접적으로 사용되지는 않는다. correlation coefficient을 구할 때는 SSR/TSS의 root를 씌워주면 된다. (SSR/TSS이 R^2이기 때문이다.)


후 Multi linear regression 끝냈다. 다음에 포스팅할 내용은 확률이 조금 들어간다. logistic regression이다. 예전에 공부할 때 완벽하게 이해를 못 해서 조금 고생했던 기억이 있는 부분인데, 이번엔 잘 이해했으면 한다.

'Data Mining' 카테고리의 다른 글

[Data Mining] kNN Classification  (0) 2015.12.21
[Data Mining] Logistic Regression  (3) 2015.12.20
[Data Mining] Linear Regression  (0) 2015.12.18
[Data Mining] Basic of Statistical data  (0) 2015.12.18
[Data Mining] Basic of Data  (1) 2015.12.18
Posted by 빛나유
,