競技プログラミングAtCoderのABCに初参加
はじめに
国内の競技プログラミングで有名なAtCoderのABC(AtCoder Beginner Contest)に初参加しました。
以前から興味はあったのですが、解けるかの心配と子どもの寝かしつけの時間と被るのとでなかなか参加に踏み切れずにいました。
しかしAtCoderの社長が、
今日は記念すべき100回目のBeginner Contest、AtCoder Beginner Contest 100なので、ぜひぜひ参加してみてくださいな!
— chokudai(高橋 直大) (@chokudai) June 16, 2018
Hello Worldが出力出来れば参加してみておっけーなレベルだよ!!!https://t.co/bCiCjMD2hT
なんてツイートしてたので、敷居が思いっきり下がりました。「Hello Worldなら書ける!」と思い、急遽参加しました。
参加したコンテスト
今回はABCの100回目ということで、記念すべき回に参加できました。ABCと言うのは、AtCoder Beginner Contest で初心者向けのコンテストです。
問題は公開されているので、興味がある方は見てみて下さい。
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
- Ruby on Railsでサイト構築
- 機械学習で遊ぶ
- おやじの会の活動を広げる
- 物理・数学を深める
一つずつ振り返っていきたいと思います。
ブログ、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月から毎日ブログ記事を書くネタに困ってデイリースクラムを記事にしていたのですが、それは「日報」でいいだろうと思い、毎日日報を書いています。これも続けていきます。
結果が全て
「結果が全て」と「過程が大事」という言葉がある。以前はどっちも大事だと思っていたので、どちらかだけを重視する偏ったやり方ではダメだと思っていた。でも考え方が変わった。
まずはこの記事に納得した。「「結果が全て」という口癖から性格が分かる心理学」
「結果が全て」という口癖の人は、実績や結果だけを重視し、それまでのプロセスにはあまり価値を見出していない人です。
つまり「過程が大事」とは思っていない。しかし、
このタイプの人は、結果を出すために最大限の努力を惜しみません
「過程が大事」とは思っていないが、過程をなおざりにしている訳ではなくて、結果を出すために最大限の努力をしている。
この記事を見たときに、自分は結果が出なかったときの逃げ道を作っていたのだと思った。
こんな事を考える事になったキッカケは、会社のある活動だ。活動の報告資料をレビューしてもらったところ、ボロクソに言われた。「目的は?」「定量的でない」「第三者にはわからない」「結果は?」
レビュー前は、それなりにまとまったと思っていただけにショックが大きかった。それでも言われた事を思い返しながら資料をどう見直すか考えていた。
思いがあって行った活動だったが、「定量的」「結果」について致命的な欠陥があることに気付いた。
この活動には「定量的な結果」について考えられてなかったのだ。「結果」が「なんとなくできた」程度にしかならないのだ。
この時に自分の甘さに気付いた。「過程が大事」で活動している事だけで満足して、「結果」を考えていなかった。そんな活動だったら、第三者なら「そう、よかったね。」ぐらい言ってもらえるかもしれないが、関係ある人なら「それ意味あるの?」「時間の無駄じゃない?」と言われても仕方がない。
とは言っても全く「結果」を考えていなかった訳ではない。理想があり、そこに近づくための1ステップだったのだ。ただ「定量的な結果」を考えていなかったため、途中経過がわからず「なんとなくできた」の域を脱せられなかったのだ。
少し話はずれれるが報告する以上、理解してもらわないといけない。理想の途中経過なら、それがわかるよう「定量的な結果」を持って説明しなければいけない。わかってもらえなければゼロだ。「過程が大事」の過程さえもゼロだ。結局「結果が全て」で、「結果」がなければ始まらない。
長くなってしまったが、自分にとっては「過程が大事」は「結果」をなおざりにするための逃げだったと思う。「結果が全て」であり、「結果」を考えなければ始まらない。今回の活動をもう一度考え直したい。
Qiitaのアドベントカレンダー2017で量子コンピュータの記事を書いた
Qiitaのアドベントカレンダーに今回初めて参加しました。お題はというと「量子コンピュータ」。興味がある分野だったのですが、全く知識なし。「参加することに意義がある」の気持ちで、挑戦しました。その辺りの気持ちは「
Qiitaのアドベントカレンダー - What one likes, one will do well 〜好きこそ物の上手なれ〜
」「
量子コンピュータの勉強開始 - What one likes, one will do well 〜好きこそ物の上手なれ〜
」あたりに書いています。
勉強を開始してみると好きな物理の話が出てくるし、最近メインで使っている言語のPythonで簡単に実装できるし、実装できれば実際に色々試して動きを確認できるし、かなり楽しませてもらいました。
1週間程度で勉強して、記事を書かないといけなかったので、他の個人プロジェクトは止めて、量子コンピュータの勉強に集中しました。期限までにアウトプットが必要なため、短期集中できました。まずやってみると言うのはありですね。
ただもう少し深いところまでやりたかったですが、簡単にはいかないです。今回得た知識を元に、継続して勉強していくことが体節だと思います。
アウトプットする機会を持つことができるQiitaのアドベントカレンダーはいい刺激になりました。今後も参加したいです。
定期的に何かを目標にして、短期集中というのは効果が高い気がするので、Qiitaのアドベントカレンダーはもちろんですが、他にも目標設定できる機会を作っていきたいです。
Qiitaの記事はこちらです。よければ見てください。
量子コンピュータの勉強開始
Qiitaのアドベントカレンダーに参加すると言って、無謀にも量子コンピュータの記事を書くことにした。
「量子コンピュータ入門」を借りたので、早速読んでいる。勉強した内容を書こうと思っているが、まともな記事が書けるか。。。
そんな心配はありつつも、量子コンピュータは最近話題になってネットで調べていたので、勉強する機会が出来て嬉しい。好きな物理の内容なのでやっていても楽しい。実は物理では量子力学でつまずいているので、実用化に近づいている量子コンピュータを学ぶことで、理解が深まるという期待もある。
また最近やっているディープラーニングは、コンピュータの計算速度が重要になってきており、量子コンピュータの並列処理はつながっていくのではと思っている。
目移りしやすい方なので、あれこれと手を出さないようにしていたが、今回は今までやってきたこと、これからの構想にも関係ありそうなので、手を出した。興味がある分野でもあるので、ブログタイトルの「好きこそ物の上手なれ」を体現していきたい。
Qiitaのアドベントカレンダー
今年はAdvent Calendar 2017 - Qiitaに参加したいと思う。気付けば12月1日で今日から始まるが、まだ参加宣言できてない。
ツイッターでアドベントカレンダーは五七五でよいというツイートを見た。そんな気持ちで参加したいと思う。
ネタとしては、PythonかVBAか量子コンピュータかなと思っている。今日中にネタを検討して、まずは参加宣言しようと思う。