Open shinmura0 opened 3 years ago
一番やりやすいのはvotingだと思います
出力値が結構まばらなので、単純なaveragingは難しいかなーと思いました やるなら重み付きですが、調整がTSだけだと少しoverfitが心配ですね
stackingも同じ理由でハードル高いかもですね
そうですね。閾値最適化すると、種別によって最適値がバラバラなのを 痛感します。従って、averagingをすると、閾値大きめの種別に飲み 込まれる気がします。
stackingはdomain shiftがあるので、難しいかなぁというのが感想ですが、 成功できれば強そうです。
votingするとなると、
にするかの選択になってきます。各モデルにすると、私の場合15model あって、(戸田さんは5モデル?、teyoさんは7model)あって、全27modelの 重み付けvotingになるのか?ですね。何か良いアイデアをお願いします<( )>
各モデルのvotingがいいかなーと思ってます(私のはsiteによってモデルが異なるので厳密には20モデルですが、1つの予測に対しては27モデルであってます!)
重みとかは特に考えていなくで、例えば1つの予測に対して3件以上あるものを真の予測、逆に3件未満しか無い場合はnocallと予測する、って感じでしょうか
ありがとうございます。 そこらへんはトライ&エラーで修正していければ、ですね。
ちなみに、皆さんの最近のベストsubと思われるものをピックアップしてみました。
改めてteyoさんのモデルはTPが多く、FPが少ないことが分かりました。(凄い!)
todaさんと、新村でvotingすればお互いのFPを消せそうです(^^) あとは、teyoさんのTPをどこまで拾えるか・・・ですね。
まとめありがとうございます!
そういえば、TSがお話にならないスコア(0.63とか)だったので特に話題に挙げなかったのですが、私のsiteごとのモデルを分けずにensemble(各siteで結構かぶっている種もあるから、というモチベでした)という方法も実験していました
最終的にensembleが数の勝負になりそうだったら、こちらの方法をとってみるのもありかもしれません
CNNモデルが褒めてもらってる👀
votingが一番拡張/縮小しやすくていいかなと僕も思います。
stackingは鳥蛙のaraiさんのスライドで見たので魅力的ですが、使うモデルを固めたあとにやるものなんですかね? 最後のあがきで試すのは良いと思いますが、その時trainshortaudioのpredictを使うか、TSのpredictを使うかになって 前者は、それぞれfoldが違う。後者はデータが少ない。といいところでしょうか?
アメリカの選挙みたいにweightかかったvotingとかどうなのでしょう?
前回の一位は単独はあまり強くなかったとも言ってるのでアンサンブル期待したいですよね・・・
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 |
MinMaxScalerでweightのnormalize→TS=0.7282
バグ修正+戸田のnocall 15000件追加: 0.7311
重み付け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はこちらのようになっています。(閾値最適化済)
TNがほぼ1に近いので、RexNet200で出したbirdcallは100%信じても良さそうです。 (nocallを侵食することはない) 残りpositive0.84(1-0.16)を残りのモデルで拾っていければと思いますが、いかがでしょうか?
つまり、
そうですね単独でoptimthresholdでだいぶブーストかかってると思います (SSWに関してはこのモデルよりもfinetuningしたやつのほうが出せる気もするけどうまく組み込めてない)
試すのは面白そうだと思います! TNもTPも総数比なのでどれくらいずれてるかですね・・・
shinmuraさんのモデル追加→0.7224166666666524 shinmuraさんのモデル追加+重み付け→ 0.7329444444444287 現状BESTっぽい
https://www.kaggle.com/takamichitoda/birdclef-ensemble-toda-teyo-shinumra?scriptVersionId=63907859
RexNet200+その他、いいですね!
→vote>=3のほうが良さそう
基本RenNext200を信じる RenNext200がなにか鳥を予測しているかつその他がRenNext200が予測していない鳥を予測している場合はその他の予測を追加する TS= 0.7248055555555412
18003_COR_535をもともとRenNext200はrucwarと予測していたのに対し、incdov rucwarと予測しいている しかし正解はrucwar どうしたもんか・・・
言葉不足ですみません。 positive0.84はRexNet200がnocallと予測したものに対して、positiveが多く含まれて いるということです。したがって、その他のモデルを使って
2つの考え方があります。後者のほうがpositive0.84を拾う方法です。
なるほど 私が試していたのは前者ですね
ちょっと後者の方も試してみます
ちなみに前者の方になりますが、私の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 |
こう見ると、その他のモデルはFPを多く出している傾向ですね(^^;
nocall部分でもこれをやられるとスコアが大きく下がるので、min_voteを大きくするか 閾値を大きくするかになりそうです・・・
色々実験ありがとうございます!
15000件noocall学習を除外でその他のweight voteでTS=0.7156805555555414 現状その他ではBESTっぽい
ばたばたですが後者の方を試してみました 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
bucmot2が消せればスコア上がりそうですね。 現状、min_vote=3でしょうか?
weight voteなので、TSの正解数で重み付けした投票数の半数以上にしています 3/4とかで実験してみようと思います
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
その他の、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
で間違いないでしょうか?
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
bucmot2の消去良いですね。 これで、RexNet200と肩を並べられるスコアです(^^) bucmot2消去でsubしてみても良いですね。
bucmot2、どうやらTSの7019において、classificationのモデルで頻出するらしいです。 SEDでも出るのかどうか分かりませんが、アーキテクチャの種類による長所短所も あるっぽいです。
RexNet200のnocall部分については、思い切ってSEDで補完する手もアリかもですね。
SEDで補完
Segment Wiseの予測を使う、ということでしょうか?
普通にclipwiseです。今使っているのと変わらずです。
あ、アーキテクチャの話ですね 失礼しました
最終subに向けてディスカッションをする場です。 気になることは、何でも上げてください。
とりあえず、
が思いつきますが、本コンペでは、averagingとvotingが有力でしょうか?