Data science (105)

반응형

 


범주형 자료에서 RR, OR을 구할 때, 혼란 변수를 보정하는 한 가지 방법 - 코크란 멘텔 헨젤 방법


앞서 혼란변수가 변수간의 관계를 추론할 때 어떠한 문제를 일으키는 지 알아보았습니다. (http://3months.tistory.com/228) 이러한 혼란 변수는 다양한 방법으로 보정할 수 있습니다. 이번 포스팅에서는 2x2 테이블에서 Relative Risk와 Odds Ratio를 구할 때, 혼란 변수를 보정하여 구하는 방법인 코크란 멘텔 헨젤 방법에 대해 알아보겠습니다.


 

 CVD

No CVD

Total

 Obese

 46

254

300

 Not Obese

60

640

 700

 Total

 106

894

1000


OR = Odds(Obes)/Odds(Not Obese) = (46/254) / (60/640) = 1.93


나이가 혼란변수로 의심되 나이에 따라 Stratification 합니다.

 

Age < 50


 

 CVD

No CVD

Total

 Obese

10

90

100

 Not Obese

35

465

 500

 Total

45

555

600

 

Age >= 50

 

 CVD

No CVD

Total

 Obese

36

164

200

 Not Obese

25

175

200

 Total

61

339

400


Age < 50 : OR = (10/90) / (35/465) = 1.476

Age >= 50 : OR = (36/164) / (25/175) = 1.53

 

Stratification 후에 각각 계산된 OR 값을 통해 혼란 변수로 인해 OR 값이 과추정 되었음을 알 수 있습니다. 이를 감안하여 두 OR 값을 합치기 위한 방법이 바로 코크란-멘텔-헨젤 방법을 통해 공통 OR을 구하는 것입니다.

 

 

 


RR과 OR에 대한 코크란-멘텔-헨젤 추정량은 위와 같습니다. 위 공식에 넣어 공통 OR을 계산하면 1.52를 얻을 수 있습니다.

 

 

 

위에서는 나이 50살을 기준으로해서 단지 2개의 그룹으로 나누었습니다. 하지만 이 기준은 모호하고, 그룹을 세분화하지 않았기 때문에 아직 confounding effect가 남아있을 수 있습니다. 이를 더욱 제거하기위해 아래와 같이 더 세분화하여 그룹을 나눌 수도 있습니다. 이 경우에도 마찬가지로 코크란-멘텔-헨젤 방법의 공식을 통해 공통 OR, RR을 구할 수 있습니다.

 

 

 

 

 

또한 혼란 변수가 보정 된 코크란 멘텔 헨젤 추정량을 얻기 전 OR 또는 RR에 대한 동질성 검정(homogeneity test)을 실행하는 것도 좋습니다. 위 경우에는 두 그룹의 OR 값이 비슷했기에 이를 합쳐 공통 OR을 구하는 것이 합리적인 방법이였지만, 만약 두 그룹의 OR의 차이가 많이 난다면, 따로따로 관계를 해석하는 것이 바람직할 것입니다. 이를 테스트하기위해 사용하는 한가지 방법이 breslow-day test입니다. 이 검정의 p-value가 작으면, 두 그룹의 OR 값이 유의하게 다른것이며, 이 경우에는 코크란 멘텔 헨젤 추정량을 이용하기보다 그룹별로 따로 구한 OR을 각각 해석하는 것이 좋습니다.

참고

http://sphweb.bumc.bu.edu/otlt/mph-modules/bs/bs704-ep713_confounding-em/BS704-EP713_Confounding-EM7.html


반응형
반응형

심슨의 역설(Simpon's Paradox)


심슨의 역설로 유명한 영국 통계학자 에드워드 심슨(1922~)

 

통계학에서의 심슨의 역설이란 그룹을 나누어서 봤을 때는 나타나는 경향이 그룹을 합쳤을 때는 사라지거나 오히려 경향이 역전되는 것을 말합니다. 이는 경향이 역전된다니 그것이 무슨 말일까요?


예를 들어, 신장 결석을 치료하는 두 가지 수술 방법이 있다고 해봅시다. 수술방법 A는 가격이 비싼 대신 치료 성공률이 높습니다. 하지만 가격이 비싸 기 때문에 결석이 큰 중증 환자만 수술방법 A를 택합니다. 반면, 수술 방법 B는 가격이 싸서 비교적 증상이 약하고 결석의 크기가 작은 환자들이 많이 하는 수술방법입니다. 하지만 가격이 싼 만큼 A에 비해서는 치료 성공률도 낮습니다. 이 때, 신장 결석의 크기 별로 수술방법 A와 수술방법B의 치료율을 알아보겠습니다.



작은 결석


 

 수술방법 A

수술방법B

 치료

81

234

 미치료

6

46

 

87

 270


수술방법 A 치료율 = 81/87 = 93%

수술방법 B의 치료율 = 234/270 = 87%


큰 결석


 

 수술방법 A

수술방법B

 치료

192

55

 미치료

 71

25

 

 263

80


수술방법 A 치료율 = 192/263 = 73%

수술방법 B의 치료율 = 55/80 = 69%

결과를 보면 작은결석과 큰 결석 모두에서 수술방법 A의 치료율이 조금씩 높습니다. 그러므로 결론적으로 수술방법 A의 치료율이 높습니다.



작은 결석 + 큰결석


 

 수술방법 A

수술방법B

 치료

 273

289

 미치료

 77

 61

 

 350

 350


수술방법 A 치료율 = 273/350 = 78%

수술방법 B의 치료율 = 289/350 = 83%


하지만 결석의 크기에 따라 치료율을 알아보지 않고 합쳐서 봤을 때는 어떨까요? 이 때, 수술방법 A의 치료 성공률은 273/350 = 0.78, 수술방법 B의 치료 성공률은 289/350 = 0.83입니다. 합치고 보니 오히려 수술방법 B가 더 좋은 것입니다. 이처럼 그룹(결석)을 나누었을 때, 보였던 경향(수술방법A의 치료율이 더 좋다)이 그룹을 합쳤을 때는 오히려 역전(수술방법 B의 치료율이 더 좋다)되는 것을 심슨의 역설이라고 합니다.


그렇다면 왜 이런 현상이 나타날 것일까요? 바로 수술을 받는 환자들의 결석 크기의 분포가 다르기 때문입니다. 서두에도 말했든 수술방법 A는 중증 환자가 받는 수술이기 때문에 큰 결석을 갖고 있는 환자가 많이 받았고, 수술 방법 B는 작은 결석 환자가 많이 받았습니다. 그래서 수술방법 A는 대부분 치료가 어려운 환자를 상대했기 때문에 치료율이 낮을 수 밖에 없는 것입니다.


이를 변수를 도입하여 모델링 해봅시다. 수술방법을 X1, 결석 크기를 X2, 치료 여부를 Y라고 놓아봅시다. 우리가 알고 싶은 것은 X1과 Y의 관계입니다. 하지만 X2는 X1과 Y에 모두 영향을 주면서, (즉 X2<->X1과 X2<->Y가 독립이 아닙니다.) X1와 Y의 인과관계 판단에 영향을 줍니다. 이러한 변수 X2를 우리는 혼란변수(confounding variable)이라고 합니다. 


심슨의 역설은 데이터를 해석할 때는 주의를 기울여야 한다는 교훈을 주었습니다. 왜냐하면 이 경우에는 작은 결석과 큰 결석으로 나눈 데이터를 먼저 보았기 때문에 이러한 결론을 내릴 수 있지만, 실제로 우리가 보는 데이터가 그룹별로 나뉘어진 데이터가 아닐 수도 있기 때문입니다. 그럴 경우에 우리는 '수술방법 B가 더 낫다' 라는 잘못된 결론을 내릴 수도 있습니다. 따라서 데이터를 해석하고 그 안에 숨겨진 인과관계를 추론할 때는 이러한 혼란 변수를 반드시 고려하여 결론을 내려야 합니다.

 


참고

https://en.wikipedia.org/wiki/Simpson%27s_paradox

반응형
반응형

Segmentation


classification이 사진에서 어떠한 물체가 '존재하는지' 를 판단하는 것이라면 Segmentation은 이미지에서 픽셀단위로 해당 픽셀이 어떤 Class에 속하는지를 예측하는 태스크로 볼 수 있다.


Input


Output


예를 들어, 위 그림을 보자. 오토바이를 타고 있는 사람이 보인다. 이 데이터를 Input으로 주면 아래와 같은 Output을 주는 것이 Segmentation의 태스크이다. 이를 트레이닝하기 위해서는 픽셀레벨로 해당 픽셀이 어디에 속하는지 label을 달은 데이터가 필요하다. 이는 사람이 직접 label을 하는 경우가많다. 위 pascal challenge에서도 사람이 직접 label한 데이터를 제공하였다.


Object Segmentation과 Class Segmentation


pascal voc2011 challenge에서는 segmentation을 object segmentation과 class segmentation으로 나누었다. object segmentation은 이미지에서 '어떤 물체가 있다는 사실' 을 픽셀단위로 예측하는 것이고, class segmentation은 어떤 물체가 '어떤 클래스에 속하는 지'까지 예측하는 것이다. 예를 들어 아래 그림을 보면, object segmentation에서는 어떤 object별로 모두 다른 색깔로 표현하고 있지만, class segmentation에서는 object들 중에서 같은 class인 경우 같은 색깔로, 표시하고 있다. (예를 들어 같은 '화분' 이라는 class를 갖고 있는 object는 같은 색깔로 표시하였다.) 



Dilated Convolution


Dilated Convolution은 필터 내부에 zero padding을 추가해 강제로 receptive field를 늘리는 방법이다. 위 그림은 파란색이 인풋, 초록색이 아웃풋인데, 진한 파랑 부분에만 weight가 있고 나머지 부분은 0으로 채워진다. receptive field란 필터가 한 번의 보는 영영으로 볼 수 있는데, 결국 필터를 통해 어떤 사진의 전체적인 특징을 잡아내기 위해서는 receptive field는 높으면 높을 수록 좋다. 그렇다고 필터의 크기를 크게하면 연산의 양이 크게 늘어나고, 오버피팅의 우려가있다. 그래서 일반적인 CNN에서는 이를 conv-pooling의 결합으로 해결한다. pooling을 통해 dimension을 줄이고 다시 작은 크기의 filter로 conv를 하면, 전체적인 특징을 잡아낼 수 있다. 하지만 pooling을 수행하면 기존 정보의 손실이 일어난다. 이를 해결하기 위한것이 Dilated Convolution으로 Pooling을 수행하지 않고도 receptive field의 크기를 크게 가져갈 수 있기 때문에 spatial dimension의 손실이 적고, 대부분의 weight가 0이기 때문에 연산의 효율도 좋다. 공간적 특징을 유지하는 특성 때문에 Dilated Convolution은 특히 Segmentation에 많이 사용된다.


이 그림을 통해 pooling-conv후 upsampling을 하는 것과 dilated convolution(astrous convolution)을 하는 것의 차이를 볼 수 있다. 위 그림에서 볼 수 있듯 공간적 정보의 손실이 있는 것을 upsampling 하면 해상도가 떨어진다. 하지만 dilated convolution의 그림을 보면 receptive field를 크게 가져가면서 convolution을 하면 정보의 손실을 최대화하면서 해상도는 큰 output을 얻을 수 있다.



Dilated Convolution을 어떻게 Segmentation에 활용할까?


출처-http://blog.naver.com/sogangori/220952339643


첫번째 그림은 classification을 위한 CNN VGG-16의 아키텍쳐이다. conv-pooling을 반복적으로 수행한 후, 마지막으로 Fully Connected Layer에 통과하여 최종 classification 결과를 얻는 과정을 보여주고있다. 그 아래의 그림은 Dilated Convolution을 통하여 이미지를 segmentation하는 예를 보여주고 있다. 이 아키텍쳐의 아웃풋의 사이즈는 28x28xN 이며, (N은 segmentation 원하는 클래스의 수) 이를 다시 upsampling하여 원래의 크기로 복원한다. (이부분에서 공간적 정보의 손실이 있다.)


이 아키텍쳐와 classification 아키텍쳐의 다른점은 우선 다이아몬드 모양으로 표시한 dilated convolution으 통해 공간적 정보의 손실을 최소화하였다. 그리고 dilated convolution 2번을 적용한 뒤 나온 28x28x4096 에 대하여 1x1 convolution으로 channel의 dimension reduction을 수행한다. 최종적으로 28x28xN이 나오고 이를 8x upsampling하여 최종적인 segmention 결과를 output으로 내놓는다. 이 때 1x1 convolution 은 공간적인 정보를 잃지 않기 위해 사용되며, classifiction의 Fully Connected Layer(FC)와 비슷한 역할을 한다. 하지만 classification에서는 공간적인 정보는 중요하지 않기 때문에 Flatten하여 사용하는 것이다.


반응형
반응형


Deconvolution

CNN에서 convolution layer는 convolution을 통해서 feature map의 크기를 줄인다. 하지만 Deconvolution은 이와 반대로 feature map의 크기를 증가시키는 방식으로 동작한다.


Deconvolution은 아래와 같은 방식으로 동작한다.


1 각각의 픽셀 주위에 zero-padding을 추가한다. 

2. 이렇게 padding이된 것에 convolution 연산을 한다.


위 그림에서 아래쪽의 파란색 픽셀이 input 초록색이 output이다. 이 파란색 픽셀 주위로 흰색 zero-padding을 수행하고, 회색 filter를 통해 convolution 연산을 수행하여 초록색 output을 만들어낸다.


Deconvolution은 일반 cnn의 최종 결과물을 다시 반대로 되돌려 input과 같은 사이즈를 만들어내고 싶을 때 쓰인다. 주로 semantic segmentation등에 활용할 수 있다. Deconvolution은 Upsampling 등으로도 불린다.


반응형
반응형

Spatial Transformation Network


CNN을 통해 이미지 분류를 할 때, 특정 부분을 떼어내서 집중적으로 학습시키는 것은 Spatial Transformation Network라고 한다. 이미지 분류 문제에서는 spatial invariance(이미지가 변환되어도 그 이미지로 인식하는 것. 고양이를 90도 회전시켜놓아도 고양이로 인식하는 능력)가 중요한데 일반적인 CNN에서는 이를 해결하기 위해 max pooling layer가 필요하다. Spartial Transformation은 max pooling layer보다 더 좋은 spatial invariance 능력을 갖게 하기 위해 이미지의 특정 부분을 자르고 변환해서 그 부분만 떼어서 트레이닝을 시킨다. 이 변환하는 과정을 affine transformation이라고 하는데 아래 그림을 보면 이해할 수 있다. 



CNN 안에 하나의 layer로 spartial transformation module이 들어가는데 이 layer는 위의 affine transformation을 하는데 필요한 parameter을 배운다. 이는 일반적인 regression 과정이다. 정교하게 하기 위해서는 많은 트레이닝 데이터가 필요하다.



위 그림은 DeepMind에서 Spartial Transformation Network 관한 논문을 낼때 들어간 그림인데 일부러 지저분하게 변경한 MNIST 데이터에 이 spatial transformation을 적용해서 원하는 부분을 잘라내서 변환하는 것을 보여주고 있다. MNIST 같은 simple한 데이터셋에서는 큰 효과가 없을지 몰라도 원하는 데이터에 여러가지 잡음이 있는 경우 spartial transformation이 좋은 성능을 보여줄 것으로 기대된다.


참고

https://adeshpande3.github.io/adeshpande3.github.io/The-9-Deep-Learning-Papers-You-Need-To-Know-About.html

https://www.slideshare.net/xavigiro/spatial-transformer-networks?from_action=save

https://github.com/oarriaga/spatial_transformer_networks/blob/master/src/mnist_cluttered_example.ipynb

반응형
반응형

데이터베이스 정규화 1NF, 2NF, 3NF, BCNF



데이터베이스 정규화란 데이터베이스의 설계를 재구성하는 테크닉입니다. 정규화를 통해 불필요한 데이터(redundancy)를 없앨 수 있고, 삽입/갱신/삭제 시 발생할 수 있는 각종 이상현상(Anamolies)들을 방지할 수 있습니다. 



데이터베이스 정규화의 목적은 주로 두 가지입니다.


1. 불필요한 데이터(data redundancy)를 제거한다.

2. 데이터 저장을 "논리적으로" 한다.


여기서 2번 데이터 저장을 논리적으로 한다는 것은 데이터 테이블의 구성이 논리적이고 직관적이어야한다는 것입니다.


우선 정규화를 안 했을 때의 문제점에 대해서 알아보겠습니다.




위와 같이 정규화가 되지 않은 구조의 테이블(Adam이라는 학생이 두 번 들어가 있습니다.)의 경우, 데이터 핸들링시 다양한 이상현상이 발생하게 됩니다.


1. Update : Adam의 Address가 변경되었을 때, 여러줄의 데이터를 갱신해야합니다. 이로인해 데이터의 불일치(inconsistency)가 발생할 수 있습니다.


2. Insert : 만약 학생이 아무 과목도 수강하지 않는다고 하면, Subject_opted 컬럼에는 NULL이 들어갈 것입니다.


3. Deletion : 만약 Alex 학생이 과목 수강을 취소한다면 Alex의 레코드가 아예 테이블에서 지워져버립니다.


위와 같이 정규화가 제대로 되지 않은 테이블의 경우 갱신/삽입/삭제 시 다양한 문제점이 발생할 수 있습니다. 이를 테이블의 구성을 논리적으로 변경하여 해결하고자 하는 것이 바로 정규화입니다.


정규화의 법칙(Normalization Rule)은 1차정규화, 2차정규화, 3차정규화, BCNF, 4차정규화, 5차정규화로 나눌 수 있는데, 실무적으로 4차, 5차 정규화까지 하는 경우는 많지 않다고 합니다. 따라서 이 포스팅에서도 BCNF까지만 알아보겠습니다.



1. 1차 정규화


1차 정규형은 각 로우마다 컬럼의 값이 1개씩만 있어야 합니다. 이를 컬럼이 원자값(Atomic Value)를 갖는다고 합니다. 예를 들어, 아래와 같은 경우 Adam의 Subject가 Biology와 Maths 두 개 이기 때문에 1차 정규형을 만족하지 못합니다.



위의 정보를 표현하고 싶은 경우 이렇게 한 개의 로우를 더 만들게 됩니다. 결과적으로 1차 정규화를 함으로써 데이터 redundancy는 더 증가하였습니다. 데이터의 논리적 구성을 위해 이 부분을 희생하는 것으로 볼 수 있습니다.



2. 2차 정규화


2차 정규화부터가 본격적인 정규화의 시작이라고 볼 수 있습니다. 2차 정규형은 테이블의 모든 컬럼이 완전 함수적 종속을 만족하는 것입니다. 이게 무슨 말이냐면 기본키중에 특정 컬럼에만 종속된 컬럼(부분적 종속)이 없어야 한다는 것입니다. 위 테이블의 경우 기본키는 (Student, Subject) 두 개로 볼 수 있습니다. 이 두 개가 합쳐져야 한 로우를 구분할 수가 있습니다. 근데 Age의 경우 이 기본키중에 Student에만 종속되어 있습니다. 즉, Student 컬럼의 값을 알면 Age의 값을 알 수 있습니다. 따라서 Age가 두 번 들어가는 것은 불필요한 것으로 볼 수 있습니다.


Student Table



Subject Table


이를 해결하기 위한 방법은 위처럼 테이블을 쪼개는 것입니다. 그러면 두 테이블 모두 2차 정규형을 만족하게 됩니다. 위 테이블의 경우 삽입/갱신/삭제 이상을 겪지 않게됩니다. 하지만 조금 더 복잡한 테이블의 경우, 갱신 이상을 겪기도하는데 이를 해결하는 것이 바로 3차 정규화입니다.


3. 3차 정규화



이와 같은 데이터 구성을 생각해봅시다. Student_id가 기본키이고, 기본키가 하나이므로 2차 정규형은 만족하는 것으로 볼 수 있습니다. 하지만 이 데이터의 Zip컬럼을 알면 Street, City, State를 결정할 수 있습니다. 또한 여러명의 학생들이 같은 Zip코드를 갖는 경우에 Zip코드만 알면 Street, City, State가 결정되기 때문이 이 컬럼들에는 중복된 데이터가 생길 가능성이 있습니다. 정리하면 3차 정규형은 기본키를 제외한 속성들 간의 이행적 함수 종속이 없는 것 입니다. 풀어서 말하자면, 기본키 이외의 다른 컬럼이 그외 다른 컬럼을 결정할 수 없는 것입니다.


3차 정규화는 2차정규화와 마찬가지로 테이블을 분리함으로써 해결할 수 있는데, 이렇게 두 개의 테이블로 나눔으로써 3차 정규형을 만족할 수 있습니다. 이를 통해 데이터가 논리적인 단위(학생, 주소)로 분리될 수 있고, 데이터의 redundancy도 줄었음을 알 수 있습니다.




4. BCNF


BCNF는 (Boyce and Codd Normal Form) 3차 정규형을 조금 더 강화한 버전으로 볼 수 있습니다. 이는 3차 정규형으로 해결할 수 없는 이상현상을 해결할 수 있습니다. BCNF란 3차정규형을 만족하면서 모든 결정자가 후보키 집합에 속한 정규형입니다. 아래와 같은 경우를 생각해보면, 후보키는 수퍼키중에서 최소성을 만족하는 건데, 이 경우 (학생, 과목) 입니다. (학생, 과목)은 그 로우를 유일하게 구분할 수 있습니다. 근데 이 테이블의 경우 교수가 결정자 입니다. (교수가 한 과목만 강의할 수 있다고 가정) 즉, 교수가 정해지면 과목이 결정됩니다. 근데 교수는 후보키가 아닙니다. 따라서 이 경우에 BCNF를 만족하지 못한다고 합니다. 3차 정규형을 만족하면서 BCNF는 만족하지 않는 경우는 언제일까요? 바로 일반 컬럼이 후보키를 결정하는 경우입니다.


학생

과목

교수

학점

 1

AB123

 김인영

 A

 2

 CS123

 Mr.Sim

 A

 3

 CS123

 Mr.Sim

 A


 위와 같이 테이블이 구성된 경우에 데이터가 중복되고, 갱신 이상이 발생합니다. 예를 들어 Mr.Sim이 강의하는 과목명이 바뀌었다면 두 개의 로우를 갱신해야합니다. 이를 해결하기 위해서는 마찬가지로 테이블을 분리합니다.


교수 테이블


교수

과목

 김인영

AB123

 Mr.Sim

CS123


수강 테이블


학생

과목 

학점

 1

 AB123 

 A

 2

 CS123 

 A

 3

 CS123 

 A




참고

http://www.studytonight.com/dbms/database-normalization.php

http://pronician.tistory.com/922

반응형
반응형

Ecological Fallacy


https://www.britannica.com/topic/ecological-fallacy


Ecological fallacy, also called ecological inference fallacy, in epidemiology, failure in reasoning that arises when an inference is made about an individual based on aggregate data for a group. In ecological studies (observational studies of relationships between risk-modifying factors and health or other outcomes in populations), the aggregation of data results in the loss or concealment of certain details of information. Statistically, a correlation tends to be larger when an association is assessed at the group level than when it is assessed at the individual level. Nonetheless, details about individuals may be missed in aggregate data sets. There are a variety of examples of ecological fallacy; three are described in this article.


In a third example, researchers found that death rates from breast cancer were significantly increased in countries where fat consumption was high when compared with countries where fat consumption was low. This is an association for aggregate data in which the unit of observation is country. Thus, in countries with more fat in the diet and higher rates of breast cancer, women who eat fatty foods are not necessarily more likely to get breast cancer. One cannot be certain that the breast cancer cases had high fat intakes.


우선, 생태학적 연구란 관찰연구이며 risk factor와 health outcome 사이의 관계를 인구집단 단위로 보는 것이다. 생태학적 오류(Ecological Fallacy)란 하지만 이러한 인구집단별 차이가 개개인의 risk-outcome 관계를 추론하는데 실패하는 경우를 이르는 경우를 말한다. 생태학적 연구의 결과는 집단의 평균에 관한 것이며 이를 개인으로 일반화 시키면 안된다는 것을 말한다.


예를 들어, A 국가와 B 국가의 지방섭취량과 유방암 사망률을 조사해서 지방섭취량이 많은 나라가 유방암 사망률이 더 높다는 결론을 얻었다 하자. 하지만 이러한 결론을 개인화화여 "지방섭취량이 많으면 유방암 사망률을 높인다." 와 같이 결론을 내릴 수는 없다. 이 국가중 한 나라를 집어서 개인별로 지방섭취량과 유방암 사망률의 관계를 조사한 결과 이러한 생태학적 연구 결과와 상관없이 지방섭취량과 유방암의 관계는 없었다고 한다. 이처럼 생태학적 연구의 결과를 개인에 적용하면 안되며, 심지어 생태학적 연구의 결과와 이를 개인에 적용했을 때의 결과는 반대일 수도 있다.


그러면 일반화의 오류(hasty generalization)과 생태학적 오류는 어떻게 다를까? (https://enviropaul.wordpress.com/2016/04/03/logical-fallacies-and-the-environment-hasty-generalization-and-the-ecological-fallacy/) 일반화의 오류는 작은 데이터로 전체를 판단하는 오류이다. 이는 집단의 평균적 특성을 개인에 적용하면 안된다는 생태학적 오류와는 다소 다르다.


* 2017/10/17 추가


생태학적 연구로 risk-outcome의 관계에 대해 결론을 내릴 수 없다면 생태학적 연구는 왜 하는 것일까? 이유는 생태학적 연구를 통해 가설을 생성(hypothesis genetraing) 할 수 있기 때문이다. 생태학적 연구를 통해 어떠한 risk가 outcome의 잠재적인 원인이 될 수 있다는 가설을 세울 수 있고, 이를 RCT 등의 연구를 통해 검증할 수 있다. 또한 생태학적 연구의 장점은 비용과 시간이 적게 들며, 개인으로는 쉽게 얻을 수 있는 데이터를 쉽게 얻을 수 있다는 점이다. 예를 들어 개인의 알코올 섭취량과 어떤 질병의 관계에 관한 연구에서, 개인의 정확한 알코올 섭취량을 얻기는 힘들다. (설문지 등을 이용하여야하기 때문에 이로 인해 bias가 생길 수  있음) 하지만, 생태학적 연구를 통해 집단별로 연구를 하게 되면 그 지역의 주류세 등을 이용해 알코올 섭취량과 질병의 관계를 집단 단위로 수행할 수 있게 된다.


반응형
반응형

Gradient Boosting 의 기초


Gradient Boosting이란 도대체 무엇인지, 약한 Learner를 강화 시켜서 강한 학습기를 만드는 것이 무슨의미인지 직관적으로 이해할 수 있던 자료. https://www.youtube.com/watch?v=sRktKszFmSk Gradient Boosting = Residual Fitting 이다. 매우 Simple한 모델을 구축한 후, Residual에 Fitting한 모델을 만들고, 이 두 개를 결합한다. 그리고 결합된 모델에서 다시 Residual이 나오면 다시 이 Residual에 Fitting하는 모델을 만들어나가고 이를 계속 반복하여 최종 모델을 만들게 된다.




그리고 Stackoverflow에 누군가 Gradient Boosting에 대해 설명한 내용이다. GB는 residual fitting method이다. 아래 그림은 Regression에 GB 방법을 적용시킨 것이지만, Classification에도 GB 를 적용할 수 있다. 적절한 residual만 설정하면 똑같이 적용할 수 있다. 또한 GB 에 가장 인기 많은 베이스모델은 바로 Shallow한 Decision tree이다. decision tree는 다른 통계모형과는 다르게 가정이 적고, 범주형이든 연속형이든 제약없이 쉽게 만들 수 있는 모델이라고 설명하고 있다.







반응형
반응형

XGBoost 모델에서의 변수선택


/* 2017.9.3 by 3months */


원본글

https://machinelearningmastery.com/feature-importance-and-feature-selection-with-xgboost-in-python/



Gradient Boosting에서의 변수 중요도 (Feature Importance)


gradient boosting의 장점은 boosted tree가 완성된 후, feature의 중요도 스코어를 내는 것이 상대적으로 쉽다는 것이다.  어떠한 변수가 decision tree에서 "중요한 결정" 을 내리는데 사용된다면 그 변수의 중요도는 높을 것이다. 중요도는 변수별로 계산되며, 각각의 변수는 중요도 랭킹에 따라 정렬될 수 있다. 어떠한 변수의 중요도는 하나의 decision tree에서 그 변수로 인해 performance measure를 증가하는 양으로 계산된다. 이 때 performance measure는 purity(Gini index)가 사용된다. 최종적인 변수의 중요도는 모든 decision tree의 중요도의 평균값이 된다. boosted decision tree에서 변수의 중요도를 구하는 기술적인 방법은 https://www.amazon.com/dp/0387848576?tag=inspiredalgor-20 이 책의 page 367 에서 볼 수 있다고 한다. 또한 https://stats.stackexchange.com/questions/162162/relative-variable-importance-for-boosting 이 링크도 참고할만 하다.



Python XGBoost에서 변수의 중요도 구하기


get_xgb_imp 함수를 이용해 XGBoost의 변수 중요도를 구할 수 있다. 해당 함수의 파라미터로 트레이닝된 XGBoost의 모델과 feature의 이름을 리스트 데이터 타입으로 넣어주면 된다.


출처 - https://stackoverflow.com/questions/38212649/feature-importance-with-xgbclassifier

def get_xgb_imp(xgb, feat_names):
    from numpy import array
    imp_vals = xgb.booster().get_fscore()
    imp_dict = {feat_names[i]:float(imp_vals.get('f'+str(i),0.)) for i in range(len(feat_names))}
    total = array(imp_dict.values()).sum()
    return {k:v/total for k,v in imp_dict.items()}


예)

from xgboost import XGBClassifier model = XGBClassifier()
# train_x와 train_y는 학습하고자 하는 트레이닝 셋의 설명변수와 종속변수의 ndarray 타입이다. model.fit(train_x, train_y) feat_names = [i for i in range(0,100)] # 변수가 100개인 경우 가정 feature_importance = get_xgb_imp(model,feat_names)

{0: 0.021963824289405683, 1: 0.020671834625323, 2: 0.041343669250646, 3: 0.023255813953488372, 4: 0.05297157622739018,
5: 0.03488372093023256, 6: 0.025839793281653745, 7: 0.021963824289405683, 8: 0.04780361757105943, 9: 0.04392764857881137,
10: 0.06847545219638243, 11: 0.023255813953488372, 12: 0.006459948320413436, 13: 0.012919896640826873,
14: 0.012919896640826873, 15: 0.015503875968992248, 16: 0.0012919896640826874, 17: 0.003875968992248062,
18: 0.006459948320413436, 19: 0.003875968992248062, 20: 0.002583979328165375, 21: 0.00904392764857881,
22: 0.0012919896640826874, 23: 0.0012919896640826874, 24: 0.00516795865633075, 25: 0.0, 26: 0.0,
27: 0.014211886304909561, 28: 0.002583979328165375, 29: 0.0012919896640826874, 30: 0.00516795865633075,
31: 0.002583979328165375, 32: 0.007751937984496124, 33: 0.003875968992248062, 34: 0.00904392764857881,
35: 0.0012919896640826874, 36: 0.012919896640826873, 37: 0.0103359173126615, 38: 0.015503875968992248,
39: 0.003875968992248062, 40: 0.006459948320413436, 41: 0.006459948320413436, 42: 0.012919896640826873,
43: 0.006459948320413436, 44: 0.0103359173126615, 45: 0.02454780361757106, 46: 0.025839793281653745,
47: 0.021963824289405683, 48: 0.006459948320413436, 49: 0.0103359173126615, 50: 0.01808785529715762,
51: 0.020671834625323 .....

* 결과는 위와 같이 dict 타입으로 반환된다.



변수 중요도 그래프 그리기


아래와 같이 matplotlib를 통해 변수 중요도의 barchart를 그릴 수 있다.

from matplotlib import pyplot
pyplot.bar(range(len(feature_importance)), feature_importance.values())
pyplot.show()


반응형
반응형

수식없이 이해하는 Gaussian Mixture Model


/* 2017.8.4 by. 3개월 */


개요


머신러닝에서 자주 사용되는 Gaussian Mixture Model(GMM)을 알아보겠습니다. GMM은 머신러닝에서 Unsupervised Learning(클러스터링)에 많이 활용이 됩니다. 하지만 다른 K-means와 같은 클러스터링 알고리즘과는 다르게 통계적인 용어나 수식 때문에 한 번에 이해하기가 어렵습니다. 이 포스팅에서는 수식 없이 기초적인 통계 수준에서 Gaussian Mixture Model을 이해할 수 있게 글을 써보려고 합니다.


우선 GMM을 알기 위해서는 Mixture Model을 알아야합니다. Mixture Model 전체 분포에서 하위 분포가 존재한다고 보는 모델입니다. 즉, 데이터가 모수를 갖는 여러개의 분포로부터 생성되었다고 가정하는 모델입니다. 책에서는 보통 이를 두고, "Unsupervised Learning의 모수적 접근법"이라고 합니다. 


이 중에서 가장 많이 사용되는 가우시안 믹스쳐 모델(GMM)은 데이터가 K개의 정규분포로부터 생성되었다고 보는 모델입니다.


<표준 정규분포의 pdf>


샘플 데이터 생성


예를 들어, A, B, C라는 세 종류의 정규분포의 PDF(probability density function)를 상상해봅시다. GMM은 데이터가 이 3가지 정규분포중 하나로부터 생성되었으며, 또 그 안에서 random하게 정규분포 형태를 갖고 생성되었다고 보는 모델입니다.


<3개의 정규분포의 pdf>


정규분포 1 : 평균 = -0.5, 표준편차 = 0.2 (파란색)

정규분포 2 : 평균 = -0.1, 표준편차 = 0.07 (주황색)

정규분포 3 : 평균 = 0.2, 표준편차 = 0.13 (녹색)


<3개의 정규분포로부터 랜덤하게 생성된 데이터>


정규분포 1로부터 2000개, 정규분포 2로부터 5000개, 정규분포 3으로부터 10000개의 데이터를 랜덤하게 생성 후, 분포를 알아보기 위해서 그린 히스토그램입니다. 지금 우리는 데이터가 어느 분포로부터 나왔는지를 알기 때문에 색을 통해서 데이터를 구분하고 있습니다. 하지만 우리가 실제로 보는 데이터는 바로 이 데이터들을 모두 합친 모양일 것입니다.


<실제 업무에서 보게되는 데이터>


세 종류의 데이터를 모두 합치면 위와 같은 모양이 됩니다. 여러분들은 이 데이터를 보고 "아 왠지 데이터가 3개의 정규분포로부터 생성되었을 것 같아." 라고 생각하고, GMM을 적용시키면 되는 것입니다. 그림을 보면 무엇이 떠오르시나요?


첫 번째, 3개의 정규분포의 평균과, 분산을 어느정도 짐작할 수 있습니다.

두 번째, 각각의 분포로부터 생성되는 데이터의 양의 차이가 있습니다.


즉, 우리가 알아야할 건 총 9개입니다. 데이터를 통해 이 9개의 모수를 알아내야합니다. (세 가지 분포의 평균과 모수, 세 가지 분포의 Weight) 이 9개의 모수를 통해 데이터의 분포를 설명할 수 있는 혼합 PDF를 만들어낼 수 있는 것이죠.


모수 추정


GMM에서의 모수는 두 가지 종류가 있습니다. 첫 번째는 3가지 정규분포 중 확률적으로 어디에서 속해있는가를 나타내는 Weight 값이고, 두 번째, 각각의 정규분포의 모수(평균, 분산)입니다. 첫 번째 종류의 모수를 잠재변수 라고 부르며, 잠재변수가 포함된 모델은 Mixture Model에서의 모수 추정은 MLE(maximum likelihood estimation)으로 구할 수 없기 때문에 EM(Expectation Maximazation)이라고 부르는 알고리즘을 통해 iterative하게 구하게 됩니다. (왜냐하면 잠재변수가 포함되었기 때문에 likelihood function을 미분할 수가 없기 때문입니다. - 이 부분은 EM 알고리즘을 공부하시면 됩니다.) GMM에 대한 이해가 우선이므로, 이 포스트에서는 EM 알고리즘을 통해 Mixture Model의 모수를 추정하는 방법은 다루지 않겠습니다.



실제 모수와 추정된 모수의 비교


모수 추정은 파이썬 sklearn 패키지의 GaussianMixture 모듈을 이용하였습니다.


실제 모수


Weight1 = 2000/(2000+5000+10000) = 0.117

Weight2 = 5000/(2000+5000+10000) = 0.29

Weight3 = 10000/(2000+5000+10000) = 0.588

평균1 = -0.5

평균2 = -0.1

평균3=  0.2

표준편차1 = 0.2

표준편차2 = 0.07

표준편차3 = 0.13


추정된 모수


Weight1^ = 0.100714

Weight2^ = 0.39059817

Weight3^ = 0.50868783

평균1^ = -0.54073433

평균2^ = -0.07930454

평균3^ =  0.22779283 

표준편차1^ = 0.1680513611965104

표준편차2^ = 0.094137665150565528

표준편차3^ =  0.11380030755670215





데이터의 분포와 데이터를 통해 추정한 모수를 통해 그린 혼합 모델의 PDF입니다. 물론 왼쪽 그림은 히스토그램이라 Y축이 빈도이고, 오른쪽그림은 PDF이기 때문에 scale은 다르지만 모양이 거의 같다는 것을 알 수 있습니다. sklearn의 GaussianMixtureModel 패키지가 모수를 잘 추정해준 것입니다. 혼합모델의 PDF는 구해진 모수를 통해 구할 수 있는데 혼합모델PDF = Weight1*정규분포1PDF + Weight2*정규분포2PDF + Weight3*정규분포3PDF로 구할 수 있습니다.



클러스터링


모수 추정을 완료하였으면 클러스터링은 쉽습니다. 어떤 데이터를 관측하였을 때, "이 데이터가 어떤 분포에서 왔는가?" 를 확률적으로 알아내기만 하면 됩니다. 즉, 예를 들어 데이터 -1.0을 관찰하였을 때, 정규분포1에서 -1.0을 관찰하였을 확률, 정규분포2에서 -1.0을 관찰하였을 확률, 정규분포3에서 -1.0을 관찰하였을 확률을 비교하여 가장 큰 확률을 갖는 정규분포로 이 데이터를 분류하면 됩니다. 그러면 어떤 정규분포에서 그 데이터를 관찰하였을 확률을 어떻게 구할까요? 바로 p-value를 이용해서 구할 수 있습니다.



반응형