AI_ML_DL’s diary

人工知能、機械学習、ディープラーニングの日記

TReNDS Neuroimaging

TReNDS Neuroimaging

2020年6月14日から参戦

 

最終提出締切:2020年6月29日

目標:メダル獲得

 

6月14日:1日目

概要:

データのダウンロード:164GB

文献1:B. Rashid and V. Calhoun, Towards a brain-based predictome of mental illness

文献2:Y. Du et al., Comparison if IVA and GIG-ICA in Brain Functional Network Estimation Using fMRI Data

notebook : ざっと見ただけだが、画像解析したものが見当たらなかった。それから、年令以外の評価値の意味がまったくわからなかった。

 

6月15日:2日目 

予定:

1.データの読み込みと表示、

2.機械学習の実装方法の検討、

3.画像解析の実装方法の検討 

今日のリーダーボード:

LB:1st: 0.1569, 2nd: 0.1573, 3rd: 0.1575, ..., 10th: 0.1583, ..., 50th: 0.1591

100th: 0.1593, 200th: 0.1594, 300th: 0.1595, 400th: 0.1598, 500th: 0.1619, 600th: 0.1663

銅メダルは100位までだが、今、77位から185位までが0.1593である。

実施:

コンペのnotebookの1つを選んで、いろいろな推論モデルを使ってみる。

モデル0:SVMで計算しようとしたが、SVRとすべきところをSVCとしていることに気付かずエラー発生。そのときは原因不明のまま放置した。

モデル1:LinearRegressionでは、600位以内に入らなかった。

モデル2:DecisionTreeRegressorでも、600位以内に入らなかった。計算時間は6分余りであった。

モデル3:RandomForestRegressorは、計算中だが、かなり時間がかかりそうだ。約6時間かかって終了した。時間はかかったが、スコアは伸びた。しかし、まだ、600位以内には入れていない。

モデル4:SVM Regression: LinearSVR:計算時間は34秒。validationの結果が良くないので、submitはしない。もっとも、1日3回までだから、今日はできない。

モデル5:SVRの2次の多項式:計算中。モデル3のRandomForestRegressorよりは早く計算できそうだ。計算時間は1時間17分であった。スコアは0.161に近づいてきた。

モデル6:SVRのパラメータを変えてみる。

 

6月16日:3日目(残り14日)

予定:

1.昨日のSVRの結果をsubmitする。

2.GradientBoostingRegressorを試す。

3.XGBRegressorを試す。

4.その他のモデルを試す。

実施:

1.昨日計算したモデルで最も良かったものをsubmitしたところ、0.1598となった。

・現在の100位は0.1593だから、メダル獲得まで、最低でも、あと、0.0005、約0.3%の改善が必要だ。

2.今日は、SVRに絞り、パラメータの最適化を行った。C値、epsilon、KFoldの分割数、スケール調整などを変えてみたが、公開notebookの値が最適値付近にあることを確認するにとどまった。

3.今日最適化したモデルの予測値を2件submitしたが、スコアは改善されなかった。

 

明日の予定:明日は、詳細にデータ解析されたnotebookを読んで、次のステップに進む手がかりをつかもう。

Ridge Regressionをやってみよう。:A. Geronさんのテキスト第4章Training MethodにあるRegression methodを使いこなそう。:第7章のregressionのアンサンブル:Stacking:も使えるようにしよう。 

 

6月17日:4日目:残13日

予定:

1.Kaggle kernelで計算していたが、このコンペは、submissionファイルのアップロードだけであることから、自分の計算環境でも計算できるようにする。

2.A. Geronさんのテキストに例示されているregressionのモデルを片っ端から試す。

3.アンサンブル、スタッキングを使えるようにする。

実施内容:

1.計算環境:昨日までと同じプログラムを自分のパソコン上のnotebookで動かしてみた。とくに変わったモジュールやパッケージは使っていないので、問題なく動いた。

SVRで、Kaggle kernelを用いた昨日の計算結果と同じになることを確認した。

ただし、計算時間が、約50分から約60分へと、少し長くかかった。

2.LinearRegressionで、Kaggle kernalと自分の計算環境を比較したら、計算結果が明らかに違った。原因は、KFoldの分割数が違っていたためであることがわかった。SVRでは、Kを7、5、3と変えても3桁目が変わるかどうか、という感じだが、LinearLergessionでは、Kが7と5でも、計算結果は明らかに違った。

3.Ridge Regressionを試したが、αの適切な値が見つからない。ageとその他とでは明らかに挙動が異なり、それらにうまく対応させるのは難しい。Cと同じで、5つそれぞれに対して、適切な値を与えるようにすればよいのか。

4.スタッキングをやろうにも、SVR以外に使えるモデルがないとどうにもならない。

5.IC_20が他と異なる挙動を示すとのことで、特徴量から外してみたが、結果に殆ど差異が認められなかった。

6.K分割数を極端に増やしたり、IC_20を除いたりした結果をsubmitしてみたが、スコアは改善されなかった。同じスコア内で、ほんの少し、前に移動した。

7.notebook見ながら思案中。

8.ニューラルネットワークのモデルを検討しよう。

・いつも感じることだが、ニューラルネットは再現性が悪い。

 

明日は、とりあえず、アンサンブルもしくはスタッキングを完成させよう! 

 

6月18日:5日目:残り12日

予定:

1.アンサンブル/スタッキングのコードを学ぶ(まねる)

2.0.1598からのランクアップ

実施内容:

1.昨日試みたニューラルネットは、overfittingとの格闘におわった。validationで0.161が最良で、それも再現性が悪かった(0.161~0.165の範囲でばらついた)。おそらく、学習率lrの制御の問題だろう。overfitting前にlrを小さくしておくことが重要だが、lrの勾配とoverfittingのタイミングをどう合わせるか。

2.Ridg regressionの使い方がようやくわかった。少なくとも、年令は、SVRよりもRidgeの方が少し良い結果を出せることがわかった。

・同レベルの予測ができるところまできたので、この2つのモデルについて、アンサンブルをやってみよう。

・とりあえず、複数の手法による予測結果を加重平均するという方法となる。

・予測結果の加重平均を試しにsubmitしたところ、ほんの少し前進した。

3.アンサンブル候補を探すため、LassoとElasticNetを試してみた。調べた範囲では、Ridgeを上回ることはなかったが、近い性能は得られている。

SVRとRidgeにLassoを加えるか、SVRとLassoの組み合わせを試してみるか。

 

明日も、アンサンブルを作って、submitしてみよう。

個別モデルのパラメータの最適化を進めないと、0.1590を切れない。

現在1位の0.1565を超えるために必要なものは何か?

 

6月19日:6日目:残り11日

予定:

1.自称アンサンブル結果のsubmit

2.SVM、Ridgeのパラメータの最適化

3.前処理技術の見直し

4.特徴量抽出

実施内容:

1.昨日計算した、アンサンブルモデルをsubmitした。

・5つの予測値のうち、validation結果の良かったモデルよるテストデータの予測値を採用する、ということで改善されているようであり、それ以上の効果(2つのモデルによる個々の予測値の加重平均をとることによる予測精度の向上)については、明確には認められなかった。アンサンブルに期待していたので、期待外れということになる。

・結果として、0.1595にとどまっている。

・今後の方向性としては、5種類の予測のそれぞれにおいて良い結果をもたらすモデルを探す、パラメータの最適化を図る、ということになるのかな。

2.RidgeとLassoのalphaを調整し、どちらもvalidationは0.158台に入るようになった。しかし、調べた範囲では、Lassoの優位点はなさそうだ。

3.A. Geronさんのテキストに、ElasticNetというのが紹介されていて、Lassoに優ると書かれている。昨日少し検討して感触は悪くなかったので、これを使ってみよう。

・alphaパラメータを最適化してみた。evaluationの結果は、Ridgeと同等であった。

 

明日は、Ridge+Lasso、Ridge+ElasticNet、SVR+ElasticNetをsubmitしてみよう。

その後は、ノーアイデアだ。

次のステップを考えないと、メダルは、はるか彼方だ!

 

6月20日:7日目:残り10日

予定:

1.Ridg, Lasso, ElasticNetのアンサンブル(2種類)のsubmit

2.1.の結果をみて考える

実施内容: 

1.RidgeとElasticNetのアンサンブルをsubmitした。予測値間の差異が小さいので効果は期待していなかったが、期待通り、ダメだった。残念、1599!

2.SVRとElasticNetの組み合わせ(今やっているのは、別々に予測して予測結果の加重平均を求めるのと同じ)を計算し、submitしたが、残念、1595。

3.ネタ切れになってきたので、ニューラルネットを検討している。dense netを数層重ねたモデルを作って、試している。

 

6月21日:8日目:残り9日

LB:0.1590でも100位以内に入れないのか、みんな、日々向上している!

予定:

1.NNモデルの検討

2.SVR、Ridgeの検討

結果:

1.昨日検討したNNモデルによる予測をsubmitしたが、まさかの0.1669であった。非常に残念だが、伸びしろがたくさんあっていい、と、前を向く。

2.層数増やして、dropout入れて、overfitt押さえながらスコア下げて、と思っていろいろ試したつもりだが、まだ、0.1635である。validation_dataに対して0.158くらいの値が得られることもあるが、ばらつきが大きく、また、overfittinng状態になっていることが多く、見掛け倒し、ということになる。ということで、まだこんなところである。

3.SVR/Ridgeは進展なし。

 

NNでは、F. Cholletさんのテキストが非常に参考になる。試していない手法がまだまだあるので、明日も、1つづつ試しながら、スコアを小さくしよう!

 

6月22日:残り8日

0.1589でも、メダル確実ではなくなっている。みんな、頑張っているんだ。

予定:

1.NNの検討

2.SVR/Ridgeの検討

検討内容:

1.NNについて:NNは、SVR/Ridgeと比べると、容易にoverfittする。

あるモデル(パラメータ数約20万、dropout使用)の、ある計算条件においては、1404の特徴量をすべて使えば、スコアは容易に0.130まで下がり、特徴量を1/10くらいまで減らすと0.160くらいになることがわかった。

活性化関数について、今回、reluとeluとで計算結果が全く違ってしまって驚いた。eluでうまくいっても、reluではうまくいかないことがあった。

evaluation で0.158は出るようになってきたが、瞬間値で、再現性に乏しく、安定しない。

 

系統的に調べていかないと、スコアは、停滞したまま! 

 

6月23日:残りは今日を含めて7日

メダル獲得に向けて頑張ろう!

予定:DNNの検討

evaluationスコアが安定して0.1580、かつtrainコアが同レベル

検討結果:

今できる範囲で、ハイパーパラメータの調整をしたが、だめだった。

今日は、自分の既知の技術だけで勝負して、惨敗した。

ちなみに、連続するiterationの4回の平均値が、trainで0.1602, validationで0.1604となったので期待してsubmitしたら、0.1643となった。これはショックだった。

他にも少し条件を変えて、trainで0.1600, validationで0.1605となったので、submitしてみたら、0.1639となった。

 

今日、コメントを読んでいて気づいたのだが、1.590のスコアが出るnotebookが4日前に公開されたとのことで、議論になっているのを知った。上位者からみると、技術的に目新しいものはないとのことだが、ハイパーパラメータの調整を徹底的にやっている感じだ。これで、メダルはさらに遠のいたか!

 

明日は、A. Geronさんのテキストの10章から11章の内容を活用して、SVR/Ridgeに匹敵するスコアを、NNで出せるようにしたい。

 

6月24日:残りは今日を含めて6日 

メダル圏内は0.1588となっている。トップは0.1564。すごいな。

予定:

未定

結果: 

NNのモデルをチューニングした。

validationが0.1596、trainが0.1579のモデルで予測した結果をsubmitしたスコアは、0.1625となった。

自分的には、前進したのだが、競争にはならない。

あと5日間、このままNNの改善で頑張ってみようか。

といっても、策があるわけではない。

解析目的は、どこまで把握できているか。

提供されているデータの中身、train, test, feature, label, fMRI data

特徴量の内容、生物物理的な意味、学術研究における意義

目的量の内容、意味、学術研究における意義、診療応用

特徴量データは、どのようにして作成されたのか、正確さ、精度、誤差、

目的量は、どのような原理、定義のもとに取得されたのか、正確さ、精度、誤差

機械学習における前処理、unsupervised learning (Clustering, (dimensionality reduction, outlier detection, semi-supervised learning, ... ) (K-Means, DBSCAN, Gaussian mixtures, PCA, Fast-MCD, Isolation forest, Local outlier factor, A. Geronさんのテキストの項目を拾ってみた!

 

6月25日:本日を含めてあと5日

予定:

Stackingの利用

結果:

昨日の最後に行ったNNのチューニング結果をsubmitしてみた。validationが0.1602、trainが0.1578のモデルで予測した結果をsubmitしたスコアは、0.1619となった。

今日は、validationが0.1587、trainが0.1589のモデルができたので、これで予測したデータを期待をこめてsubmitしたが、0.1620であった。validationのデータは元のtrainデータの15%なのでばらつきが大きく、stratified samplingをしていないことも、課題かもしれない(意味不明?)。

個別モデルのチューニングはこのへんで置いておいて、機械学習の基本、A. Geronさんのテキストで説明されているデータの前処理の基本技術を、コンペのデータの前処理にきちんと適用できるようにしよう。

Stackingの学習:A.Geronさんのテキストp.208-p.211を読んでみたが、よくわからなかった。

さて、どうするか。

明日のことは、明日考えよう!

 

 6月26日:本日を含めてあと4日

メダル圏内は、0.1588から0.1587へ、トップは0.1562、みんな、日々向上している!

予定:

試行錯誤

結果:

F. CholletさんとA. Geronさんのテキストを参考にしながら、NNの予測能力の向上を図っている。再現性はよくなってきたが、これまで以上のスコアは出ていない。

SVR+Ridgeのスコアアップの方法を検討しているのだが、策がないというのが正直なところである。

 

 6月27日:本日を含めてあと3日

メダル圏内は、0.1588-0.1587、トップは0.1562。

結果:

自分の計算環境ではSVRは計算時間が1時間以上かかるので、数分以内に計算できるRidgeで、featuresの選択や規格化を行ったが、効果は認められなかった。

 

単層のNNでも、LBが0.160を切ったという報告があるので、最後の2日間は、NNにかけてみる。cv:0.1590くらいのところにいるので、LB:1585を目指してがんばってみる。

 

6月28日:本日を含めてあと2日

トップは1560だって、すごいね!

メダル圏内は、1588-1587

予定:

NNの探索

結果:

cvの瞬間値が、下がってきた。0.1572、0.1568、・・・、しかし、submitしてみると、0.1618にしかならない。

あと1日だが、どこまでやれるか、明日も、NNで、がんばってみる。

 

6月29日:今日がおそらく最終日。たぶん、明朝9時まで。

NNでいろいろやって、よさそうな結果をsubmitしたが、NNでのLBは0.1618で終了となった。SVR/RidgeでのLBは0.1595を改善できなかった。Ridge/ErasticNetでもLBは0.1595が最良値であった。

 

今回、本気で挑戦してみて、トップ10%に対しても、現状では、まったく歯が立たないことがわかった。

 

今回の挑戦は、これで、おわり。 

 

6月30日午前9時00分:コンペ終了

ふりかえり:

・コードはゼロから作成したか? No

・借用したコードを変更したか? Yes

・借用時のスコアを改善したか? Yes

・目標順位を達成したか? No:Top 56%:目標 Top 10%

・何か向上したか? Yes:

1.機械学習を順に試してみて、計算時間や予測性能、ファインチューニングの仕方をある程度把握することができるようになった。テキストに具体的に示されているものを順に試していった。A. Geronさんのテキストには、さらにその先の情報が示されているがそれらを試すとこまではいかなかったものもある。

2.NNの適用で、ちょっと奇抜な予測モデルを試した。

NNによる学習/予測については、featuresだけを用いたregressionの事例はテキストには簡単な説明しかなく、今回のように1400ものfeaturesをもつデータの5つのカテゴリーにおけるregressionでは、それなりにユニット数を増やす必要はあるのだろうと思ったが、予測性能はなかなか良くならなかった。

最近は、単純な構造であれば、NNの層数や各層のユニット数などを自動で最適化する手法が使われるようになっているが、使ったことがない。

ともかく、手当たり次第に試すことにした。といっても、画像処理でも自然言語処理でもなく、特徴量だけの、従来型の機械学習の範疇なので、簡単な構造のNNを試した。最終的には全結合の3層で全て0.45のdropout(削減する割合が45%)を行って、ユニット数は、入力側から、4, 128, 4096とした。cvが0.159で、LBが0.1620であった。

このような極端な構造にどんな意味があるのかわからないが、dropoutが0.3(削減割合)、ユニット数を入力側から4, 64, 1024としたモデルでは、cvが0.160で、LBが0.1625であった。

ユニット数を2倍ごとにして多くの層を並べても似たような性能は出ていたが、cvで0.155を目標に試行錯誤しているうちに、こんなものになった。

これらのモデルは、動作が不安定になりがちで、瞬間的にcvが0.1570を切ることがあったので、はまってしまった。ただし、このままでは、再現性が悪く、使い物にならないと思っている。入力層にユニット数1や2も試したが、挙動が面白く、隠れ層の途中にユニット1個を挟み込んでも普通に動作して驚いた。

3.とにかく、スコアを上げることに執着し、寝食を忘れるほどに打ち込んだ。

4.5つの目的量のそれぞれに適した予測モデルや特徴量の組み合わせ、損失関数の定義などもあるかもしれないなど、いろいろ考えるようになった。

5.予測結果をトレーニングに組み込むことも行ってみた。これは、pseud labelingとしてKagglerでは常識になっているようだが、本件では効果的ではなかった。

6.unsupervisedやsemi-supervised learningなども検討した。

ただし、時間も知識も不足していて、ほとんど実行できなかった。

 

反省:

1.fMRIの画像解析をしなかったこと。

2.特徴量のNN解析(遊び)に熱中しすぎたこと。昨年のAPTOS 2019のときもそうだった。大きな効果を狙うことを忘れて、小さな改善に熱中しすぎることがある。

3.結果論にはなるが、fMRIの画像解析について、公開コードで勉強させてもらうべきだった。計算結果を詳細に検討すべきであった。

 

*上位者に学ぶ

・トップテンの4名ほどの解法が紹介されており、それによると、fMRIの画像解析をCNNによって行っており、その結果と、特徴量の機械学習と合わせて、解析しているようだ。

・さらに多くの方々が、解法の説明をされている。すごいな。執念を感じる。この執念、執着心が、技術を向上させ、スコアアップにつながっているのだろう。

・トップテンに入っていなくても、しっかりと目標を定めて、難しい課題に取り組んでいる方もたくさんおられるようだ。

・トップチームの解法が明らかにされた。トップレベルの2人が互いに補強しあっていたようだ。fMRIの画像解析から膨大な特徴量を抽出しているようだが、それには、fMRIの解析に関する知識を超短期間で吸収して解析に反映させているように見える。しかも、コンペサイトの議論やノートブックはきちんとチェックして動向を把握し、重要な情報を察知して吸収しながら進んでいたようにみえる。

 

次は、PANDA Challenge!

 

f:id:AI_ML_DL:20200614091606p:plain

style=142 iteration=500