trtd56 / BirdCLEF

1 stars 0 forks source link

指数分布による閾値の決定 #44

Open shinmura0 opened 3 years ago

shinmura0 commented 3 years ago

以前、正規分布(平均と分散)で閾値を決める手法を検討した。 今回は、その発展版。

teyoさんのモデル、新村のモデルで一定の成果を上げたので 最終subでは使っていきたい。

閾値の決め方は

この手法はbirdcallがなくても、決められる手法だが、

新村のmodelでやるとこんな感じ。 image

課題であったreevir1も拾えるようになった。 なお、ameredは、TS内でbircallはなく、FPが多いため大きめの閾値になる。

(この分布を、正規分布で当てはめようとしていた過去の自分は愚かであった(^^;)

codeはこんな感じ。

from scipy.stats import expon

def get_threshold(score, label): #score(2400,397)  #label(2400,397) is 1 or 0
    optim_thresh = np.zeros(397)

    for i in range(397):
        target_score = score[:, i]
        target_label = label[:, i]
        nocall_score = target_score[target_label==0]

        # 指数分布にフィッティング
        fit_parameter = expon.fit(nocall_score)
        frozen_expon = expon.freeze(*fit_parameter)

        # 0.2 + 99.9%で閾値を決める
        optim_thresh[i] = frozen_expon.ppf(0.999) + 0.2

    return optim_thresh # shape(397)