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

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

優先するもの

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

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

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

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

 

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

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

 

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

今後、力を入れること

はじめに

今年に入って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なら比較的簡単なので、参加しやすいです。

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

初めてAIコンテストに参加した

はじめに

2年ほど前から機械学習ディープラーニングを勉強している。チュートリアルなどをやっていると簡単に予測精度が出てすごいと思い、Webから簡単に使えるディープラーニングフレームワークを作っていた。

しかし分類の予測を作り、次に回帰の予測を作っているとなかなか精度が出ない。思えば分類は実際のデータで予測の精度を上げるため試行錯誤した経験があった。

やはり実践的な経験を踏まえてフレームワークを作らないと意味がないと思い、AIコンテストに参加した。

 

参加したAIコンテスト

参加したのは「オプトDSL・DeepAnalyticsDeepAnalytics」が開催している日本のAIコンテスト。日本語で参加できるので敷居が低い。AIコンテストと言えば「Kaggle: Your Home for Data Science」が有名だが、英語なので敷居が上がる。

またディープラーニングフレームワークを作成している時の検証は、オプトDSLの練習問題で行っていた。そのためコンテストに参加するのも抵抗感がなかった。

たくさんのコンテストが開催されているのだが、参加したのは『走行中の北陸新幹線車両台車部の着雪量推定モデルの作成』だ。北陸新幹線は実家に帰るときに乗るため、愛着もあり、開催された当初から参加したいと考えていた。

そう思いながらも開催されてから参加できていなかった。今年の抱負でAIコンテストの参加を掲げ、参加に至ったという感じだ。

 

コンテストに参加してみて

コンテストは12月の頭から始まり、1月の終わりまでだったのだが、本格的に内容を確認し始めたのが、1月の中旬で2週間ほどしか取り組めなかった。

コンテストの参加前はディープラーニングが最強で、ディープラーニングを使えば結構いけると思っていたのだが、実際はそうではなかった。

自分の結果では一番基本(?)の線形回帰での結果が一番精度が出た。そこで大切と思った事が以下だ。

  • データの観察
  • 予測に使うデータの選択
  • 予測に使うモデルの選択
  • モデルのパラメータのチューニング

 

データの観察

データがどんな特徴を持っているかを知るために、まずはデータの観察が大切だ。データの件数や欠損状況、基本統計量、ヒストグラム、散布図、相関係数など、予測に使うデータの選択にもつながるたいせつなプロセスだ。

欠損が多かったり、予測するデータと全く関係がなかったり、異常値がたくさんあるなど、予測の精度を上げるには、どんなデータかを知ることが大前提となる。

 

予測に使うデータの選択

データを観察したら、そこから予測に関係のありそうなデータを選択する。相関係数を見るのが基本だが、全体でなくとも一部に効くデータだったり、ラベル化して使うなど、どのデータをどのように予測に使うかを決める。

予測に使うデータが悪ければ、どんなによいモデルでも精度がでない。実際にデータを追加して精度が下がることも多かった。そのためデータの選択が1番大切なプロセスとも言える。

 

予測に使うモデルを選択

モデルはたくさんあるので、試しながら決めることになる。私の場合は、まず線形回帰を使い、その後ディープラーニングやxgboostなど試してみた。

線形回帰は解析的に平均二乗誤差を最小にする予測なので、一番基本だか、精度は悪くない。逆にディープラーニングだと過学習やランダム性で、精度が出なかったり、安定しなかったりする。

線形回帰を基本に置きつつ、より精度の高いモデルを探すのがよいと思う。

 

モデルのパラメータのチューニング

線形回帰はパラメータはないが、多くのモデルはパラメータの調整が必要だ。パラメータを変えることで精度が大きく上がったりする。

xgboostを今回試してみたが、すべて同じ値を予測していた。Kaggleではデータをうまく選択すればxgboostだけでも1位になれると言う情報もあるのにだ。つまりデータの選択やパラメータの選択が大切と言う事だ。

今回は時間がなくxgboostのパラメータを変えることもできなかったので、次回以降試してみたい。

 

その他の試した手法

stackingと言う手法を試した。Kaggleでは最後に少し精度を上げるために使われている。実際に作ったモデルで試してみると1割ほど精度が上がった。これは使える手法だと思うが、決め手になるのは上記に書いたデータとモデルだ。精度が高いデータとモデルを選択した後、最後にstackingでもう一歩精度を上げる感じだ。

 

その他に試したかったこと

今回は時間が足りず試したかったが、試せなかったことも多かった。

  • 時系列データとみなせるのでRNNを使う
  • 予測したデータから予測する(予測に使うデータも時系列データで、未来のデータを使うと予測精度が上がる)
  • 合計値を予測するのだが、内訳の相関が違っていたので、それぞれ予測する

コンテストだと上位者は創意工夫しながら挑戦しているので、自分で考えたことをやり切り、自分の中で最高のパフォーマンスを出す必要がある。

 

おわりに

初めてのAIコンテストだったが、ギリギリまで挑戦していて最後に精度の悪い結果を投稿してしまい、最終的には60位ぐらいで、なんとも残念だった。

まず参加してみるというところと、色んな手法を使いこなせないまでも、まずは試してみるというところまではできた。今後もAIコンテストに参加していって、経験値を積んでいきたいと思う。

まずは日本のコンテストに参加していこうと思うが、その後は世界的に有名なAIコンテスト「Kaggle: Your Home for Data Science」に挑戦したいと思っている。

Kaggleで結果を残す人は、Kaggle Masterという称号をもらい、データサイエンティストとして引く手あまたのようだ。目標は高くKaggle Materを目指したい。

2017年の振り返りと2018年の抱負

はじめに

今週のお題「2018年の抱負」の記事を書きます。去年も1年の初めに「2017年にやりたいこと」のお題として「2017年に実現したいこと」を書きました。

最初に2017年の振り返りをして、その後に2018年の抱負を書きたいと思います。

 

2017年の振り返り

2017年を振り返るにあたって、ブログ記事を読み返しました。1年はあっという間だったという気持ちがありましたが、色んな事があってずいぶん前のことに思えることもたくさんありました。それだけ色々な経験を積んでこれたと思っています。

昨年立てた「2017年に実現したいこと」は以下になります。

一つずつ振り返っていきたいと思います。

 

ブログ、Qiita、Github

3ヵ月に1回ブログ記事やQiita、Githubなどにアウトプットするという目標です。

QiitaやGithubにアップする場合は、同時にブログ記事にもアップしていたので、ブログ記事でカウントしてみると、1月~3月はスタートダッシュということで6回と頑張っていました。個人的に一番いいアウトプットが出来たと思ったのは「ママに夜の自由な時間を。パパが子どもを寝かしつける方法。」で、子育てについての記事です。自分の経験から寝かしつけの方法をまとめました。

4月~6月はペースが落ちて1回で「モブプロ(モブプログラミング)やってみた。」です。これはDevLoveの初参加のときの記事で、モブプロを体験して「楽しかった!」という思い出です。その後会社の仲間ともモブプロを体験して、楽しさを共有出来て、かなり思い出深い記事です。

7月~9月は「Excel VBAで使える自作のテストフレームワークを使って、実際に開発してみた。」を書いています。これは自作したテストフレームワークを、仕事で実際に使ってみた話です。自分アプリを作って、実際に使う所まで行ったのはこれが初めてかもしれません。

また初めて「ハッカソンに参加」しました。デモに向けて仲間と開発したり、他の人のデモを見て刺激を受けたりととてもいい経験をしました。毎日夜遅くまで開発していたのもいい思い出ですし、集中する期間があったこともいい経験になっています。

さらに9月はWEB+DB100号の記事の影響で、「毎日ブログを書くこと」を心に決めて、毎日ブログ記事を書き始めた時でもあります。

10月~12月は継続して毎日ブログ記事を書いていたことと、「Qiitaのアドベントカレンダー2017で量子コンピュータの記事を書いた」の記事に書いたように、初めてQiitaのアドベントカレンダーに参加しました。

こう思い返すといろいろ経験をして、アウトプットも出来ていると感じます。

ただ、経験して多少のアウトプットを出してブログ記事を書いているのですが、Githubのアウトプットがあまりできていないことが反省点です。

 

Ruby on Railsでサイト構築

これは出来ていません。一つ言い訳をするなら「RubyからPythonへ」で書いたように、メインのプログラミング言語RubyからPythonにしたことがあります。そのためWebフレームワークもRuby on RailsからDjangoに変えました。で、Djangoでサイト構築できたかというと、作り始めてはいますが、リリースまで出来ていないので、この目標は未達です。

今年も継続してサイト構築をしていくので、まずはリリースできるところまでもっていきたいです。

 

機械学習で遊ぶ

これは学んだ機械学習を実際に使ってみることを目標にしています。実際に仕事に関係あることで、試しにやってみたことがあったのですが、それは残念ながらボツになり、お蔵入りしました。ただ経験はつめたし、その時に実装したものを流用して、機械学習フレームワーク的なものを作っています。それを使ってAIコンテストの「オプトDSL・DeepAnalyticsDeepAnalytics」の練習問題を解いています。本当は実際のAIコンテストに使って、コンテストに参加したかったのですが、そこまでは行けず、練習問題を解いている最中になります。

 

おやじの会の活動を広げる

おやじの会の活動は2年目でしたが、活動する範囲が広がったと思います。学校の行事での手伝いの範囲を増やしたり、プログラミング教室を開催したりと、やりたいことができたと感じています。

プログラミング教室は、自分が好きなプログラミングを子どもたちに教えることができる場が出来てとてもうれしく思っています。まだ始めたばかりで手探りですが、もっと充実させて楽しく学べる教室にしていきたいと思っています。本当は、プログラミング教室のブログ記事も書きたいですが、訳があって、まだブログ記事に出来ていないのです。今年はブログ記事にしていきたいと思っています。

また活動は広がったと思うのですが、会員を増やせなかったのが昨年の反省点です。募集活動もあまりできなかったことも影響していると思います。

 

物理・数学を深める

これはミレニアム懸賞問題の「ヤン-ミルズ方程式と質量ギャップ問題」を理解することが目標でしたが、まったく手がついていません。これは元々好きな物理や数学の勉強も継続していきたいという思いがありました。

これについては、「Qiitaのアドベントカレンダー2017で量子コンピュータの記事を書いた」にあるように、昨年の最後に量子コンピュータと出会ったことが、まさに「物理・数学を深める」の意図したことにつながりました。量子ということで物理の要素があり、物理の理解を深め、さらにはプログラミングにもつながり、「自分が深めるとしたらこれだ!」と思いました。

当初の目標とは違いますが、量子コンピュータを介して物理・数学を深めていきたいと考えています。

 

2017年の振り返りをすると去年は充実した1年だったと思います。一昨年ぐらいから「学ぼう」という気持ちが強くなりました。去年の初めは学んだことを次につなげていこうと思っていましたが、まだ具体的になっていませんでした。2017年はそれが具体的になって、アウトプットの一歩手前まで来たと思っています。

 

2018年の抱負

2018年の抱負は「自分の思いを具現化し、世の中にリリースする」です。

2017年の振り返りでも書いたように、色んなことが具体的になってきたのですが、「アウトプットの一歩手前」の状態だと思っています。

アイディアを思いつくまでは、誰でもできると思っています。しかし、それを具現化することに最初のハードルがある。また世の中にリリースして、使われるところにまたハードルがあると思っています。私の場合は、まだアイディアを思いつくまでで止まっているので、まずは具現化して、世の中にリリースしたいと思います。

 

と、抱負を決めたところで、具体的な目標を決めます。

 

アウトプットする

 昨年と同じになりますが、3ヵ月に1回はアウトプットします。具体的にはアプリ開発ハッカソン、AI・プログラミングコンテストアドベントカレンダーなどを想定しています。結果をブログ記事やQiitaに投稿して公開していきます。

 

機械学習フレームワーク公開

上記のアウトプットにもつながりますが、いま開発中の機械学習フレームワークを公開します。これは機械学習を簡単に使えるWebアプリケーションの構築になります。WebアプリケーションのフレームワークDjango機械学習フレームワークはchainerを使い、それを誰でも簡単に機械学習を行えるようにフレームワーク化します。これが「世の中にリリース」したい第一弾になります。

 

おやじの会の活動を広げる

こちらも昨年度と同じになりますが、具体的には「会員を増やす」「活動の広報活動を行う」ということに力を入れたいと思います。

活動の内容は充実してきたと思うので、継続していくとともに、「会員を増やして」今後も継続できる会にする。そのためにも「活動の広報活動を行う」ことで、認知されていくようにします。そうすることで協力したいという人を増やしたいと思います。

 

新しい技術・知識を積極的に学ぶ

今年はこの目標を一つ追加したいと思います。昨年度でいうと量子コンピュータがその一つですが、新しい技術・知識を学ぶことは、自分の広がりにつながると思います。気になるキーワードがあれば積極的に学ぼうと思います。まずは概要レベルでも知っていると知らないとでは大違いなので、積極的に学んでいきたいと思います。学んでそれをアウトプットすると理解が深まるので、学んだことはブログで公開していきたいと思います。

 

おわりに

抱負・目標を掲げたところ、結局はすべてアウトプットに関係することだと思いました。学べば学ぶほどアウトプットしたいものが具体的にイメージできるようになってきます。それをアウトプットできるか、できないかが大きな違いだと思います。抱負にもあるように今年は「自分の思いを具現化し、世の中にリリース」していきます。

 

蛇足ですが、昨年の11月から毎日ブログ記事を書くネタに困ってデイリースクラムを記事にしていたのですが、それは「日報」でいいだろうと思い、毎日日報を書いています。これも続けていきます。