Machine Learning을 하기 전에 수가지의 후보 Feature 셋중에 쓸만한 것들을 골라내는 작업을 한다.
이 작업이 필요한 이유는 쓸데없는 noise feature를 추가할 경우 실험셋에서만 적합한 classifier가 나올 가능성이 많고(overfitting) 실제 새로운 데이터를 입력했을때 잘못 판정할 가능성이 많기 때문이다.
Feature Selection알고리즘에는 많은 알고리즘들이 있다. 그러나 대부분의 알고리즘의 원리는 어떤 Class를 판정하는데 가장 영향을 많이 끼치는 feature에 높은 점수를 주는 방법을 쓴다.
처음 이런 알고리즘을 봤을때 Decision Tree의 각 노드를 분할하는 Information gain이 생각이 났다. 이것도 선택된 Feature를 가지고 가장 분류에 영향을 많이 끼치는 정보량을 가진 것들부터 상위 노드에 위치 시킨다.
쓰일 수 있을거 같기는 하지만 일단 이건 접어두고…^^;
가장 일반적으로 많이 쓰이는 Feature Selection 방법은 Mutual Information방법이 있다.
y Class의 분류에 x정보의 유무가 얼마나 많은 영향을 끼치는지 가늠하는 방법이다. 위 식은 몇개의 entropy식으로 변환이 가능하다.
위 식에서 만일 x, y가 독립적이라면 P(x,y)는 P(x)*P(y)로 되고 따라서 안쪽에 log 취한 값이 0이 되어 버린다. 따라서 MI가 크다 함은 x,y의 연관성이 좀 많다고 봐야 한다.
이것에 대해서 하니가모님의 블로그를 보니 좋은 정보가 있어서 링크를 건다.
위 방법 외에 chi-square distribution 을 이용한 X^2 Feature selection 방법이 있다.
이는 관측치와 예측치의 차이값의 제곱을 한것을 예측치로 나눠주는 값의 총합이다.
여기서 우리가 예측치라고 정하는 E값은 두값이 독립이라는 독립성 가정을 통해서 나온 값이다. 따라서 E11 값을 구하기 위해 해야되는 계산은 N * P(t) * P(c) 가 되겠다.
만일 연관성이 있다면 N * P(t) * P(c|t) 나 N * P(c) * P(t|c) 같은 식으로 계산이 되어야 한다. (이걸 다른 말로 null hypothesis 라고도 하는거 같은데… ^^;)
위에서 나온 X^2 값을 기반으로 X^2 distribution table 값을 찾아서 결과값을 구하면 된다.
X^2으로 나온 결과값이 크다는것은 우리가 가정한 독립성의 가정에 적합하다는 것을 의미한다.
이것 이외에 frequency based feature selection 방법이 있는데, 이건 일반적으로 해당 class에서 가장 빈번하게 출연하는 feature를 선택하는 방법이다. 간단하지만 별로 성능이 좋지 않다고 한다.
확률적인 단점 때문에 chi-square 방법이 feature 셋을 작게 선정 했을때 성능이 좋지 않다고 한다. 예를들어 spam class에 erlang이 한번 나왔다고 그것을 스팸 확률을 100으로 주는건 문제가 있는것과 비슷하다.
저런 저빈도 고확률의 feature들이 다 선택이 되고 난 다음에 선택되는 고빈도 중확률 feature들과의 조화로 인해 feature셋이 추가 될수록 성능은 나아 진다고 한다.
물론 위의 단점을 보완하기 위한 Roinson의 희소 확률 보정식 같은게 있긴 하지만 이런 카이제곱 방법의 단점은 알아두는게 좋을거 같다.
Mutual Information 방법은 feature 선정 초반에 정확도가 높아지다가 셋이 추가 될수록 점점 하강하는 곡선을 탄다.
따라서 feature셋의 크기가 작게 선정이 되어야 되는 경우라는 Mutual Information 방법이 더 나을거란 생각을 해본다.
위 세가지 방법에 대한 F1 measure 측정 결과를 올려본다.
보면 frequency 방법이 가장 성능이 좋지 않은걸 볼 수 있다. 최적화된 점을 찾기도 힘들고..
Machine Learning에서 Feature Selection은 분류기의 성능을 판가름 할 정도로 큰 영향을 끼치는 변수중에 하나이다.
알고리즘의 장단점, 데이터의 특성, 그리고 문제의 정의를 정확하게 이해할때 가장 효율적인 Feature Selection이 되지 않을까 하는 생각을 해본다.
Feature Selection by from __future__ import dream is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.