trtd56 / BirdCLEF

1 stars 0 forks source link

アンサンブルのディスカッション #48

Open shinmura0 opened 3 years ago

shinmura0 commented 3 years ago

最終subに向けてディスカッションをする場です。 気になることは、何でも上げてください。

とりあえず、

が思いつきますが、本コンペでは、averagingとvotingが有力でしょうか?

trtd56 commented 3 years ago

一番やりやすいのはvotingだと思います

出力値が結構まばらなので、単純なaveragingは難しいかなーと思いました やるなら重み付きですが、調整がTSだけだと少しoverfitが心配ですね

stackingも同じ理由でハードル高いかもですね

shinmura0 commented 3 years ago

そうですね。閾値最適化すると、種別によって最適値がバラバラなのを 痛感します。従って、averagingをすると、閾値大きめの種別に飲み 込まれる気がします。

stackingはdomain shiftがあるので、難しいかなぁというのが感想ですが、 成功できれば強そうです。

votingするとなると、

にするかの選択になってきます。各モデルにすると、私の場合15model あって、(戸田さんは5モデル?、teyoさんは7model)あって、全27modelの 重み付けvotingになるのか?ですね。何か良いアイデアをお願いします<( )>

trtd56 commented 3 years ago

各モデルのvotingがいいかなーと思ってます(私のはsiteによってモデルが異なるので厳密には20モデルですが、1つの予測に対しては27モデルであってます!)

重みとかは特に考えていなくで、例えば1つの予測に対して3件以上あるものを真の予測、逆に3件未満しか無い場合はnocallと予測する、って感じでしょうか

shinmura0 commented 3 years ago

ありがとうございます。 そこらへんはトライ&エラーで修正していければ、ですね。

ちなみに、皆さんの最近のベストsubと思われるものをピックアップしてみました。 image

改めてteyoさんのモデルはTPが多く、FPが少ないことが分かりました。(凄い!)

shinmura0 commented 3 years ago

todaさんと、新村でvotingすればお互いのFPを消せそうです(^^) あとは、teyoさんのTPをどこまで拾えるか・・・ですね。

trtd56 commented 3 years ago

まとめありがとうございます!

そういえば、TSがお話にならないスコア(0.63とか)だったので特に話題に挙げなかったのですが、私のsiteごとのモデルを分けずにensemble(各siteで結構かぶっている種もあるから、というモチベでした)という方法も実験していました

最終的にensembleが数の勝負になりそうだったら、こちらの方法をとってみるのもありかもしれません

teyosan commented 3 years ago

CNNモデルが褒めてもらってる👀

votingが一番拡張/縮小しやすくていいかなと僕も思います。

stackingは鳥蛙のaraiさんのスライドで見たので魅力的ですが、使うモデルを固めたあとにやるものなんですかね? 最後のあがきで試すのは良いと思いますが、その時trainshortaudioのpredictを使うか、TSのpredictを使うかになって 前者は、それぞれfoldが違う。後者はデータが少ない。といいところでしょうか?

teyosan commented 3 years ago

アメリカの選挙みたいにweightかかったvotingとかどうなのでしょう?

前回の一位は単独はあまり強くなかったとも言ってるのでアンサンブル期待したいですよね・・・

trtd56 commented 3 years ago
detal TS LB
baseline 0.7184
TSの正解数で重み付けvoting 0.7300 0.68
戸田のnocall 15000件学習追加 0.7179
戸田のnocall 15000件学習追加, TSの正解数で重み付けvoting 0.6673
teyoさんのefficentnet fold-4追加 0.7201
teyoさんのefficentnet fold-4追加, TSの正解数で重み付けvoting 0.7300
trtd56 commented 3 years ago

MinMaxScalerでweightのnormalize→TS=0.7282

trtd56 commented 3 years ago

バグ修正+戸田のnocall 15000件追加: 0.7311

shinmura0 commented 3 years ago

重み付けvote良いですね! teyoさんのサブを見ると、Rexnet200単独でLB0.68という認識で合ってますか? https://www.kaggle.com/teyosan1229/birdclef-inference-3ch-ppno2-3-4-easy-sub-t#prediction

だとすれば、RexNet200はかなり猛者ということになります。 RexNet200が強力なので、アンサンブルはこのモデルを基本にして考えた方が良さそうです。

ちなみに、TSで試算したRexNet200のTP、TNはこちらのようになっています。(閾値最適化済) image

TNがほぼ1に近いので、RexNet200で出したbirdcallは100%信じても良さそうです。 (nocallを侵食することはない) 残りpositive0.84(1-0.16)を残りのモデルで拾っていければと思いますが、いかがでしょうか?

つまり、

teyosan commented 3 years ago

そうですね単独でoptimthresholdでだいぶブーストかかってると思います (SSWに関してはこのモデルよりもfinetuningしたやつのほうが出せる気もするけどうまく組み込めてない)

試すのは面白そうだと思います! TNもTPも総数比なのでどれくらいずれてるかですね・・・

trtd56 commented 3 years ago

shinmuraさんのモデル追加→0.7224166666666524 shinmuraさんのモデル追加+重み付け→ 0.7329444444444287 現状BESTっぽい

https://www.kaggle.com/takamichitoda/birdclef-ensemble-toda-teyo-shinumra?scriptVersionId=63907859

RexNet200+その他、いいですね!

trtd56 commented 3 years ago

RexNext200以外

→vote>=3のほうが良さそう

RexNext200+その他

基本RenNext200を信じる RenNext200がなにか鳥を予測しているかつその他がRenNext200が予測していない鳥を予測している場合はその他の予測を追加する TS= 0.7248055555555412

18003_COR_535をもともとRenNext200はrucwarと予測していたのに対し、incdov rucwarと予測しいている しかし正解はrucwar どうしたもんか・・・

shinmura0 commented 3 years ago

言葉不足ですみません。 positive0.84はRexNet200がnocallと予測したものに対して、positiveが多く含まれて いるということです。したがって、その他のモデルを使って

2つの考え方があります。後者のほうがpositive0.84を拾う方法です。

trtd56 commented 3 years ago

なるほど 私が試していたのは前者ですね

ちょっと後者の方も試してみます

ちなみに前者の方になりますが、私の15000件noocall学習させたやつが悪さをしてそうだったので除外したらちょっと改善しました →TS=0.7248333333333188

row_id ResNext200 その他 正解
2782_SSW_30 grycat grycat reevir1 bkcchi reevir1
18003_COR_535 rucwar incdov rucwar
51010_SSW_190 grycat grycat balori rewbla
44957_COR_115 grekis grekis bobfly1 grekis
44957_COR_140 bobfly1 bobfly1 gbwwre1 nocall
50878_COR_45 orcpar orcpar laufal1 nocall
28933_SSW_110 sonspa sonspa comyel sonspa
shinmura0 commented 3 years ago

こう見ると、その他のモデルはFPを多く出している傾向ですね(^^;

nocall部分でもこれをやられるとスコアが大きく下がるので、min_voteを大きくするか 閾値を大きくするかになりそうです・・・

色々実験ありがとうございます!

trtd56 commented 3 years ago

15000件noocall学習を除外でその他のweight voteでTS=0.7156805555555414 現状その他ではBESTっぽい

trtd56 commented 3 years ago

ばたばたですが後者の方を試してみました TS=0.7178611111110976

ログベタ貼りで汚くて申し訳ないのですが、結果です resnext200がnocallだったもののみ出力しており、predがその他のvoteモデルの予測、Trueが実際のTSのラベルです

42907_SSW_5 pred= reevir1 / True= reevir1
42907_SSW_5 pred= reevir1 / True= reevir1
42907_SSW_5 pred= reevir1 / True= reevir1
42907_SSW_5 pred= reevir1 / True= reevir1
42907_SSW_5 pred= reevir1 / True= reevir1
42907_SSW_5 pred= reevir1 / True= reevir1
42907_SSW_5 pred= bkcchi / True= reevir1
7019_COR_5 pred= bucmot2 / True= nocall
7019_COR_5 pred= bucmot2 / True= nocall
7019_COR_5 pred= bucmot2 / True= nocall
7019_COR_5 pred= bucmot2 / True= nocall
7019_COR_5 pred= bucmot2 / True= nocall
7019_COR_5 pred= bucmot2 / True= nocall
7019_COR_5 pred= bucmot2 / True= nocall
7019_COR_5 pred= bucmot2 / True= nocall
7019_COR_5 pred= bucmot2 / True= nocall
7019_COR_5 pred= bucmot2 / True= nocall
7019_COR_5 pred= bucmot2 / True= nocall
7019_COR_5 pred= bucmot2 / True= nocall
7019_COR_5 pred= bucmot2 / True= nocall
7019_COR_5 pred= bucmot2 / True= nocall
7019_COR_5 pred= bucmot2 / True= nocall
7019_COR_5 pred= bucmot2 / True= nocall
7019_COR_5 pred= bucmot2 / True= nocall
7019_COR_5 pred= bucmot2 / True= nocall
7019_COR_5 pred= bucmot2 / True= nocall
7019_COR_5 pred= bucmot2 / True= nocall
7019_COR_5 pred= gretin1 / True= nocall
7019_COR_5 pred= bucmot2 / True= nocall
7019_COR_5 pred= bucmot2 / True= nocall
7019_COR_5 pred= bucmot2 / True= nocall
7019_COR_5 pred= bucmot2 / True= nocall
7019_COR_5 pred= bucmot2 / True= nocall
7019_COR_5 pred= bucmot2 / True= nocall
7019_COR_5 pred= bucmot2 / True= nocall
10534_SSW_5 pred= rewbla / True= nocall
2782_SSW_5 pred= reevir1 / True= bkcchi grycat reevir1
2782_SSW_5 pred= reevir1 / True= bkcchi grycat reevir1
11254_COR_5 pred= yebfly / True= rubwre1
11254_COR_5 pred= grasal1 / True= rubwre1
11254_COR_5 pred= sthwoo1 / True= rubwre1
26746_COR_5 pred= bobfly1 / True= bobfly1
26746_COR_5 pred= bobfly1 / True= bobfly1
26746_COR_5 pred= rucwar / True= bobfly1
26746_COR_5 pred= rucwar / True= bobfly1
26746_COR_5 pred= bobfly1 / True= bobfly1
18003_COR_5 pred= rucwar / True= rucwar
18003_COR_5 pred= rucwar / True= rucwar
18003_COR_5 pred= incdov / True= rucwar
18003_COR_5 pred= incdov / True= rucwar
51010_SSW_5 pred= bawwar / True= grycat norfli
51010_SSW_5 pred= rebwoo / True= grycat norfli
51010_SSW_5 pred= balori / True= grycat norfli
51010_SSW_5 pred= balori / True= grycat norfli
21767_COR_5 pred= bugtan / True= grekis rucwar
21767_COR_5 pred= bugtan / True= grekis rucwar
21767_COR_5 pred= rucwar / True= grekis rucwar
21767_COR_5 pred= rucwar / True= grekis rucwar
21767_COR_5 pred= rucwar / True= grekis rucwar
21767_COR_5 pred= whfpar1 / True= grekis rucwar
14473_SSW_5 pred= daejun / True= nocall
14473_SSW_5 pred= daejun / True= nocall
44957_COR_5 pred= bobfly1 / True= nocall
44957_COR_5 pred= bobfly1 / True= nocall
44957_COR_5 pred= bobfly1 / True= nocall
50878_COR_5 pred= cregua1 / True= nocall
28933_SSW_5 pred= blujay / True= sonspa
shinmura0 commented 3 years ago

bucmot2が消せればスコア上がりそうですね。 現状、min_vote=3でしょうか?

trtd56 commented 3 years ago

weight voteなので、TSの正解数で重み付けした投票数の半数以上にしています 3/4とかで実験してみようと思います

trtd56 commented 3 years ago

3/4、TSは改善すれど悪化ですね・・・ bucmot2はたしかに減らせてますが、それ以上にnocallを改善できていたものも消えちゃっている印象

TS=0.7231388888888748

42907_SSW_5 pred= reevir1 / True= reevir1
7019_COR_5 pred= bucmot2 / True= nocall
7019_COR_5 pred= bucmot2 / True= nocall
7019_COR_5 pred= bucmot2 / True= nocall
7019_COR_5 pred= bucmot2 / True= nocall
11254_COR_5 pred= grasal1 / True= rubwre1
18003_COR_5 pred= rucwar / True= rucwar
18003_COR_5 pred= incdov / True= rucwar
18003_COR_5 pred= incdov / True= rucwar
14473_SSW_5 pred= daejun / True= nocall
44957_COR_5 pred= bobfly1 / True= nocall
28933_SSW_5 pred= blujay / True= sonspa
shinmura0 commented 3 years ago

その他の、model数を確認したいのですが、こちらのコードを見ると https://www.kaggle.com/takamichitoda/birdclef-ensemble-toda-teyo-shinumra/notebook#%E6%9C%80%E7%B5%82ensemble%E3%82%B3%E3%83%BC%E3%83%89

で間違いないでしょうか?

trtd56 commented 3 years ago

teyoさんのモデルはは


すごいカッコ悪いけどbucmot2だけ除外 TS= 0.7291111111110964

42907_SSW_5 pred= reevir1 / True= reevir1
42907_SSW_5 pred= reevir1 / True= reevir1
42907_SSW_5 pred= reevir1 / True= reevir1
42907_SSW_5 pred= reevir1 / True= reevir1
42907_SSW_5 pred= reevir1 / True= reevir1
42907_SSW_5 pred= reevir1 / True= reevir1
42907_SSW_5 pred= bkcchi / True= reevir1
7019_COR_5 pred= gretin1 / True= nocall
10534_SSW_5 pred= rewbla / True= nocall
2782_SSW_5 pred= reevir1 / True= bkcchi grycat reevir1
2782_SSW_5 pred= reevir1 / True= bkcchi grycat reevir1
11254_COR_5 pred= yebfly / True= rubwre1
11254_COR_5 pred= grasal1 / True= rubwre1
11254_COR_5 pred= sthwoo1 / True= rubwre1
26746_COR_5 pred= bobfly1 / True= bobfly1
26746_COR_5 pred= bobfly1 / True= bobfly1
26746_COR_5 pred= rucwar / True= bobfly1
26746_COR_5 pred= rucwar / True= bobfly1
26746_COR_5 pred= bobfly1 / True= bobfly1
18003_COR_5 pred= rucwar / True= rucwar
18003_COR_5 pred= rucwar / True= rucwar
18003_COR_5 pred= incdov / True= rucwar
18003_COR_5 pred= incdov / True= rucwar
51010_SSW_5 pred= bawwar / True= grycat norfli
51010_SSW_5 pred= rebwoo / True= grycat norfli
51010_SSW_5 pred= balori / True= grycat norfli
51010_SSW_5 pred= balori / True= grycat norfli
21767_COR_5 pred= bugtan / True= grekis rucwar
21767_COR_5 pred= bugtan / True= grekis rucwar
21767_COR_5 pred= rucwar / True= grekis rucwar
21767_COR_5 pred= rucwar / True= grekis rucwar
21767_COR_5 pred= rucwar / True= grekis rucwar
21767_COR_5 pred= whfpar1 / True= grekis rucwar
14473_SSW_5 pred= daejun / True= nocall
14473_SSW_5 pred= daejun / True= nocall
44957_COR_5 pred= bobfly1 / True= nocall
44957_COR_5 pred= bobfly1 / True= nocall
44957_COR_5 pred= bobfly1 / True= nocall
50878_COR_5 pred= cregua1 / True= nocall
28933_SSW_5 pred= blujay / True= sonspa
shinmura0 commented 3 years ago

bucmot2の消去良いですね。 これで、RexNet200と肩を並べられるスコアです(^^) bucmot2消去でsubしてみても良いですね。

shinmura0 commented 3 years ago

bucmot2、どうやらTSの7019において、classificationのモデルで頻出するらしいです。 SEDでも出るのかどうか分かりませんが、アーキテクチャの種類による長所短所も あるっぽいです。

image

shinmura0 commented 3 years ago

RexNet200のnocall部分については、思い切ってSEDで補完する手もアリかもですね。

trtd56 commented 3 years ago

SEDで補完

Segment Wiseの予測を使う、ということでしょうか?

shinmura0 commented 3 years ago

普通にclipwiseです。今使っているのと変わらずです。

trtd56 commented 3 years ago

あ、アーキテクチャの話ですね 失礼しました

teyosan commented 3 years ago

ココにも書きましたが 手元には下記用意できそうです ①rexnet200 5fold ②densenet161 5fold ③efficientnetv2_s 5fold ④resnext50_32x4d 4fold(明日の午前中に完成します) ⑤resnest50d 4fold (明日の午前中に完成します。) おまけ:①からSSW向けにfinetuningしたモデル 5fold