A comment on Boruta algorithm

전략



볼타 은 특징량 중요도를 사용한 특징량 선택 기법 중 하나입니다.

아래 사이트의 해설을 참고로 공부했습니다. 매우 알기 쉬운 해설로, 실험도 있어 매우 참고가 됩니다.
  • 랜덤 포레스트와 검정을 이용한 특징량 선택 기법 Boruta

  • 코멘트



    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 를 실제로 사용해 보면 제대로 움직이고 있는? 그래서 뭔가 사고방식 잘못하고 있나요.

    좋은 웹페이지 즐겨찾기