A comment on Boruta algorithm
전략
볼타 은 특징량 중요도를 사용한 특징량 선택 기법 중 하나입니다.
아래 사이트의 해설을 참고로 공부했습니다. 매우 알기 쉬운 해설로, 실험도 있어 매우 참고가 됩니다.
코멘트
Boruta의 알고리즘에서 특정 특징이 예측에 유효한지 여부를 결정하기 위해 귀무 가설
이 특징 량의 중요도는 판별 (회귀)에 기여하지 않는 특징 량의 중요도와 동일하다. ”를 세우고 검정을 실시합니다. 귀무가설이 올바르면, 특정 특징량의 중요도와 판별(회귀)에 기여하지 않는 특징량의 수용도의 대소는 랜덤이 되어야 하고, 특정 특징량의 중요도가 커질 확률은 $p=0.5 $의 이항 분포를 따라야 합니다.
여기에서 궁금한 것은, Shadow Feature는 하나가 아니고, 원래의 특징량 차원과 같은 수만 있습니다. 그리고 대소 비교는 "어떤 특징량의 중요도 VS Shadow Feature의 중요도 중 가장 큰 것"에서 실시하고 있습니다.
위의 이미지는 랜덤 포레스트와 검정을 이용한 특징량 선택 기법 Boruta
boruta_py 구현 도 그렇게 보인다.
def _do_tests(self, dec_reg, hit_reg, _iter):
active_features = np.where(dec_reg >= 0)[0]
hits = hit_reg[active_features]
# get uncorrected p values based on hit_reg
to_accept_ps = sp.stats.binom.sf(hits - 1, _iter, .5).flatten()
to_reject_ps = sp.stats.binom.cdf(hits, _iter, .5).flatten()
...
그런데 Shadow Feature의 특징량 중요도 중 가장 큰 것을 나타내는 확률 변수를 $S_{\mathrm{max}}$로 하면,
S_{\mathrm{max}} \leq F_1 \Leftrightarrow S_1\leq F_1 \wedge S_2\leq F_1 \wedge S_3\leq F_1 \wedge S_4\leq F_1
그러므로
\mathrm{Pr}(S_{\mathrm{max}} \leq F_1) = \mathrm{Pr}(S_1 \leq F_1)\mathrm{Pr}(S_2 \leq F_1)\mathrm{Pr}(S_3 \leq F_1)\mathrm{Pr}(S_4 \leq F_1) = \left(\frac{1}{2}\right)^4
귀무 가설이 올바르면 특정 특징량이 Shadow Feature의 특징량 중요도 중 가장 큰 것보다 커질 확률은 $p=(1/2)^4$의 이항 분포를 따를 것입니다.
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import binom
plt.rcParams['font.family'] = 'IPAPGothic'
plt.rcParams["figure.figsize"] = [12, 6]
plt.rcParams['font.size'] = 20
plt.rcParams['xtick.labelsize'] = 15
plt.rcParams['ytick.labelsize'] = 15
# 試行回数
N = 100
# 試行回数中の発生回数 (配列)
k = np.arange(N+1)
# グラフにプロット
fig, ax = plt.subplots(1,1)
ax.plot(k, binom.pmf(k, N, p=0.5), 'bo', ms=8, label='p=0.5')
ax.vlines(k, 0, binom.pmf(k, N, p), colors='b', lw=1, alpha=0.2)
ax.plot(k, binom.pmf(k, N, p=0.5**4), 'x', ms=8, color='r', label='p=0.5^4')
ax.vlines(k, 0, binom.pmf(k, N, p=0.5**4), colors='r', lw=1, alpha=0.2)
ax.set_xlabel('iterarion')
ax.set_ylabel('probability')
ax.legend()
plt.show()
그래프로 하면 알 수 있습니다만, 기각 영역과 상당히 다릅니다.
잔디
라고, 여기까지 썼습니다만,
Boruta
를 실제로 사용해 보면 제대로 움직이고 있는? 그래서 뭔가 사고방식 잘못하고 있나요.
Reference
이 문제에 관하여(A comment on Boruta algorithm), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ground0state/items/2b48ee3fee4d495c02a1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)