What one likes, one will do well 〜好きこそ物の上手なれ〜

寄り道しながらも、最後は昔から好きな物理とプログラミングに戻ってくる。そんな男の思いをつづるブログです。

Kaggle宇宙コンペで銅メダルとりました

はじめに

しばらく時間が経ってしまいましたが、Kaggleの宇宙コンペで銅メダルを取ったので、その記録です。初メダルでとても嬉しかったです。

 

 

宇宙コンペ

宇宙コンペは星の光の変化データから、どのような星かを予測するコンペでした。

星の最後の大爆発である超新星だったり、点滅する星の変光星だったりを予測します。

一言に超新星変光星と言っても色々種類があり、予測する種類は14種類となかなか数が多いと思います。しかも学習データにはない、その他の星も予想する必要があり、考えることが多いコンペだったと思います。

 

解法

私の解法としては、大きくは以下の通りです。Kernelにスコアが高い解法が公開されてましたので、それをベースに変更を加えた形になります。

特徴量の事前抽出

光の変化データはデータサイズが大きく、そこから特徴量を抽出するには時間がかかりました。そのため事前に特徴量を計算しておき、その後にどの特徴量を使うか取捨選択しました。繰り返し学習-精度確認のサイクルを回すために役に立ちました。

LightGBMで特徴量の取捨選択

Kernelをforkして、特徴量を追加・削除しました。ローカルのCVを見ながら行い、時々submitして、LBを確認しました。追加するだけでなく、不要な特徴量を減らすことも効果がありました。

1.080のKernelを参考に、特徴量の追加・削除で0.988まで精度が向上しました。(さらにSEEDを変化させて単純平均を取ると0.983)

特徴量の追加・削除、精度確認を地道に行うことは重要なんだなと感じました。

NN(MLP)でのパラメータチューニング

KerasでNN(MLP)モデルを作成し、特徴量はLightGBMから多少取捨選択しました。試行錯誤により、パラメータチューニングしました。精度1.128とLightGBMよりも0.140悪かったですが、アンサンブルで効果がありました。

アンサンブル

LightGBMとNNをアンサンブルを最終のsubmitとしました。1:1だとLightGBMのシングルモデルより悪く、最後にえいやで3:1とすると0.963と精度が上がりました。本当に最後のsubmitだったので、精度が上ったのはラッキーでした。

 

結果

結果は95位で、初銅メダルをゲットしました。前回のTrackMLでは、最終Public LBが100位で、Private LBが101位と後1位でメダルを逃したので、今回もPrivate LBを見るまではドキドキだったので、ゲットした瞬間はガッツポーズしてしまいました。

ちなみにPublic LB 0.963で、Private LB 0.977でした。アンサンブルしてないシングルモデルだと、メダル圏外だったので本当にラッキーでした。

  

さいごに

初メダルは嬉しかったですが、まだKernelをいじって、少し精度上げる程度なので、金銀メダルは程遠いと感じました。もっと精進して、金銀メダルに届くようになりたいと思います。

 

今年の抱負

はじめに

今年も半分が終わろうとしてますが、延び延びになっていた今年の抱負を書こうと思います。

ちょうど気持ち的に切りがよく、次に向けて進める環境が出来上がってきたためでもあります。

 

健康第一

健康でないと何もできません。そのため最近は以下のことに気をつけてます。

  • 早寝早起き。9時に子どもと一緒に寝て、4時に起きてます。
  • 禁酒。最近やめました。お酒飲むと次の日体調が悪くなるので。
  • 禁間食。体重増えてきたので、間食我慢してます。食べたくなるけど、少なくとも仕事中と夜は食べないようにしてます。

本当はさらに運動をするのが良いと思ってるけど、そこまで出来てません。小学校のPTAでソフトボールを少しだけやってるけど、それぐらいです。そのうちダンス復活したいとは思ってます。

 

家族優先

家族を第一に考えていきたいです。仕事は定時に終わらせて、早く家に帰る。最近は職場環境に恵まれて、出来ています。今後も継続したいです。

また子どもに投資していきたいと思います。勉強であったり、スポーツであったり、成功体験できる機会を与えていきたいと思います。

 

自己啓発

自分を高めていく行動はしていきたいです。

実際に4時起きして、自分の時間を作り、スキルアップやアウトプットに精進しています。

特に見える形で結果が大切なので、以下の目標をおきます。

  • Kaggle。銀メダル取得。銅メダルまでは取りましたが、銀メダルは取得できるイメージがつきません。今年中にゲットしたいです。
  • AtCoder。水色。緑で低迷&Kaggle優先してるため時間も取れてません。少しずつ精進して、水色までは今年中にいきたいです。
  • ブログ。書く書くといいながら、カクカクサギなのですが、改めて経験したことや結果をアウトプットしていきたいです。
  • クラウドワークス。気が向いて、一案件やりました。納期があったり、責任が伴ったりと、ただ勉強するのとは緊張感が違います。自分のスキルアップ、かつ、実績にもなるため、これからも挑戦していきたいと思います。

 

おわりに

基本的に自分がやりたいことは大きく変わってないのですが、優先順位が変わってきました。健康や家族が一番になり、自分のことはその後。同じことは元々思ってはいたのですが、明確に言葉にするようになり、その思いが強くなったと思います。

この気持ちで1年(あと半年ぐらい)頑張りたいと思います。

優先するもの

一番は家族であり、子育て。自分のことは二の次で家族、子育てが一番になっている。

平日は仕事だけど基本的に定時に帰り、子どもの食事やお風呂、寝かしつけはやるし、送り迎えなんかもある。土日だって、子どもの予定を優先。平日の子どもの行事があれば、仕事を休む。

まあ仕事と寝る時間以外のほとんどは子どもの時間になってると思う。

家族や子どもを一番優先にするのは変えようと思ってないし、それが幸せだと思ってるので、よいのだけれども、自分の時間はなかなかとれない。

 

しかも子どもにお金かけるのは再現がない。特に東京は色んなリソースがあって、お金をかけると良いものがたくさんある。本格的にやろうと思えば思うほどお金がかかる。

時間もお金も子どもにかければ自分がやれる範囲は狭くなる。でも子どもを優先すると面白いほど吸収してくれるし、結果も出やすい。自分の分身みたいなものだし、とても嬉しい。

 

何を優先するかは人それぞれだけど、自分は家族や子育てを優先することがいいと思う。まあ何かいいかなんてわからないんだけど、自分がいいと思う方向に進むのがいいのだろう。

今後、力を入れること

はじめに

今年に入ってKaggle(データ分析コンテスト)やAtCoder競技プログラミング)を始めた。それまでもデータ分析やプログラミングに興味があって、勉強をしてきたのだけど、コンテストや競技に参加するようになって、さらに向上心が上がった気がする。

順位やランキングがつくので、客観的に自分のダメダメ具合がわかり、もっと頑張らねばという気持ちになる。

そういった気持ちとともに、やりたい分野が増えたり、深めたい分野が出てきたりする。

そこで、今年の初めに立てた目標も鑑みながら、これからの目標を再設定したいと思う。

 

ちなみに、自分のメモ用という側面が強いので、人様に読んでもらえるような文章にはならないと思います。駄文申し訳ありません。

 

Kaggle

今年に入ってからKaggleに2回参加した。どちらもメダル圏外で、2回目は参加者が少ないこともあったが、101位でギリギリメダル圏外だった。最後もう一歩精度上げる方法があったのに、ギリギリメダル取れるかなと、そこで辞めてしまったのが敗因だと思う。(終了日を1日勘違いしてたのもあるが)

今は仕事でもデータ分析をやっているので、公私ともにこの分野の力をつけていくことは、重要だと思う。継続的にコンテストには参加していこうと思うが、まずは前回の復習をしっかりやって、自分の足りなかった部分を振り返ろうと思う。

当面の目標はメダル獲得で、今年中に達成したい。

 

AtCoder

今年に入ってAtCoderとの出会いは大きかった。前から興味はあったけど、前にブログで書いたようにAtCoderの社長が「Hello World書けるレベルでオッケーだよ!」が、実際にやることになったきっかけ。

自分のプログラミングの実力を客観的に測れる。実はやる前は、それなりに自信があったのだけど、始めてみると初心者向けのABCコンテストも全完できない。特に最後の問題は難しくて、時間をかけても自力では解けない。

これはアルゴリズムの知識が必要で、以前にアルゴリズムの本を読もうとして断念したことがあるぐらいなので、知識が圧倒的に足りない。6回参加したが、まだ下から2番目のランクだ。

しかし、このダメダメっぷりを期にアルゴリズムを勉強しようという気持ちになった。今はアルゴリズムイントロダクションを読んでいる。練習問題も解きながら、しっかりと理解したい。

同時にAtCoderには参加していき、当面の目標は、初心者向けのABC卒業レベルの水色を目指そうと思う。これも今年中に達成したい。

 

アプリ公開

今年の初めは、機械学習フレームワークを作ろうと思っていたけれど、自分がフレームワークを作るなんておこがましいと思った。実際にKaggleに参加すると、知識も経験も足りず、結果が出せなかった。そこで、まずはKaggleで結果を出すことにシフトした。

しかしプログラミングをやっている以上、自分の実力を示すために、自分のアプリを公開することは重要だと思う。まだアプリはないのだけど、まずはプロフィールから公開していこうと思う。同時にチュートリアルなど学んだ結果も公開して、蓄積していこうと思う。

アプリとしては、Line Botを作りたいと思っている。以前はRuby製のrubotyを使っていたのだけど、メインの言語がPythonに変わっているので、PythonBotを作っていきたいと思う。

プロフィールの公開は早々に行い、今年中にBotの運用を初めたい。

 

物理

物理の勉強は休み中なのだけど、やはり物理の勉強もしたい。KaggleのTrackMLに参加したのも、内容が高エネルギー加速器の粒子の軌跡の予測だったからだ。すぐには再開しないと思うけど、今年中に再開したい。まずは標準模型の理解だ。

 

おわりに

色々思って今回の記事を書いたけれど、方向性は今までと変わらない。ただ結果、アウトプットを重視したいという気持ちが明確になった気がする。KaggleやAtCoder、アプリなど、まずは目に見える形で結果を出していきたい。

 

競技プログラミングAtCoder AGC026参加記録

はじめに

初めてAtCoderのAGC(AtCoder Grand Contest)に参加しました。ABC(AtCoder Beginner Contest)は過去2回参加したのですが、それは初心者向け。AGCは上級者向けです。

 

参加結果

過去問を解いていたので、難易度がわかっており、当初の目標は2問正解としていました。結果は1問正解。1問目は比較的すぐに解けました。しかし2問目は、2時間ほどかけ、結局解けませんでした。サンプルのケースはクリアしたのですが、テストのケースの後半が外れ、原因もわからず終了しました。

終了後、解説を読んでもすぐには理解できず、ずいぶん考えてやっと理解できました。プログラミングの技術の前に、数学やパズルを解く能力が必要だと感じました。

 

今後に向けて

AGCの難易度は、1問目がABCのC問題、2問目がABCのD問題点程度だと思います。今の自分の実力は、ABCのC問題を解ける程度なので、妥当なところだと思います。次の目標は、ABCのD問題まで解く、つまり、ABCを完答することです。

まったく歯が立たないということはないので、過去問を解いてもう少し知識を付ければ行けると思います。

 

おわりに

AGCでは6問出題されるのに、1問しか成功できず悔しい思いをしました。2問目は時間が十分にあったのに、正解できず、知識のなさを痛感しました。

でも全く歯が立たないということはないので、今後も頑張れそうです。次回はABC完答を目指します!

競技プログラミングAtCoder ABC参加記録(2回目)

はじめに

今回AtCoder ABC102に参加しました。AtCoder参加はこれで2回目になります。

 

参加結果

前回は制限時間110分のところ、50分しか参加できず、4問中3問正解でした。今回は110分で全問正解を目指したのですが、結果は前回と同じく4問中3問正解でした。

順位は212位で、前回よりも回答時間が早い分よかったようです。また全体のランキングは、9706位になりました。全体のランキングは色分けしていて、現状は灰色(一番下)です。早く灰色を抜けて茶色になりたいです。

前回と同じく問題Dが解けず、終わった後も1時間ほど挑戦していたのですが、結局解けませんでした。Dになると難易度がグンと上がる感じがします。

 

今後の課題

問題Dが解けない理由はアルゴリズムをよく知らないというのがあると思っています。今回最終的には解説を読んでサンプルは正解できるようになったのですが、提出するとTLE(Time Limit Exceeded)、つまり時間切れになります。アルゴリズムを知らないため最適な計算が出来ずループのループで処理時間がかかり過ぎているということです。

アルゴリズムは勉強しないといけないと思っていたので、これを機に1冊本を読もうと思います。

 

おわりに

AtCoder2回目の挑戦でしたが、今回も楽しかったです。以前のブログにも書きましたが、5回参加するまでスコアが低くでるそうです。自分の今の実力を知るために、まずは後3回参加することが目標です。その3回でABCは全問正解できるようになりたいと思います。

ちなみにABCの上には、ARC(AtCoder Regular Contest), AGC(AtCoder Grand Contest)があります。早くARCやAGCでも勝負できるぐらいになりたいです。

 

競技プログラミングAtCoderのABCに初参加

はじめに

国内の競技プログラミングで有名なAtCoderのABC(AtCoder Beginner Contest)に初参加しました。

以前から興味はあったのですが、解けるかの心配と子どもの寝かしつけの時間と被るのとでなかなか参加に踏み切れずにいました。

しかしAtCoderの社長が、

 

なんてツイートしてたので、敷居が思いっきり下がりました。「Hello Worldなら書ける!」と思い、急遽参加しました。

 

参加したコンテスト 

今回はABCの100回目ということで、記念すべき回に参加できました。ABCと言うのは、AtCoder Beginner Contest で初心者向けのコンテストです。

問題は公開されているので、興味がある方は見てみて下さい。

abc100.contest.atcoder.jp

AからDの4題出題され、Dが一番難易度が高くなっています。問題の答えを算出するプログラムを書いて、提出すると評価用の入力に対して採点されます。すべての入力に対して正しく算出できると正解です。

 

参加結果

初参加でしたが、問題A, B, Cの3題正解できました。ちょうど子どもの寝かしつけがあったので、最初1時間は参加できませんでした。最後の40分だけの参加だったので、もう1時間あれば全問正解も行けたかもしれません。(終わった後に20分ほどやりましたが、正解まではいけませんでしたが。。。)

ABC100の中では順位1551位でした。そして今まで参加したコンテスト全体のランキングも出て、そちらは14299位でした。

コンテスト全体のランキングは最初5回まで、点数が低く出るらしいです。なので、本当のランキングを見るためには最低5回参加が必要です。

 

今後に向けて

今回は急遽参加した割には、それなりにできました。次は全問正解を目指していきたいです。また本当のランキングを見るために、あと4回は参加したいと思います。

大体週1回開催なので、毎週参加しても後1ヶ月はかかりますね。

夜時間をとるのは大変なのですが、せっかく参加したので、継続していきたいと思います。

 

さいごに 

今まで参加できずにいたのですが、参加して本当に楽しかったです。自分のプログラミングの腕を試すのに丁度いいですね。ABCなら比較的簡単なので、参加しやすいです。

興味を持った方がいれば、ぜひ参加してみてください。