まずは蝋の翼から。

学んだことを書きながら確認・整理するためのメモブログ。こういうことなのかな?といったことをふわっと書いたりしていますが、理解が浅いゆえに的はずれなことも多々あると思うのでツッコミ歓迎

Kaggle初挑戦にあたり2019 Data Science Bowlを2日間やってみた記録

概要

これはなにか

この3連休に12時間くらいKaggleに初挑戦(Titanic除く)をしてみたので、現在開催中に2019 Data Science Bowlをやってみたのでそのメモ。

www.kaggle.com

何故やったか

仕事で使いそう

予測系は仕事でほぼ使わないので学習コストに対するリターンがあまりなかった。そのため、入門書を一通りさっとやって嗜んだ程度で終わっていた。
しかし、仕事で今後使う機会が生まれそうなので手を動かしたかった。

Pythonに慣れたい

予測の場合はRよりもPythonでやる方が便利そうだが、Pythonはかじった程度なので書き慣れてない。実際仕事で使う段階になったときに今のままだとやりたい前処理レベルでも時間がかかりそうなのでコードを書き慣れたかった

機械学習プロジェクトを疑似体験したい

前述のように、仕事で使う段階のときにスムーズにプロジェクトを進めるために疑似体験をして、自分なりのテンプレを作っておきたかった。

何について書いているか/書いていないか

ただの日記なので、雑感をまとめているだけです。そのため、コンペの細かい手法は 今回の記事では 追わないです。
ただし、コンペが終わってから役立ったことや初めて知ったことはまとめる予定です。

2019 Data Science Bowl概要

児童用教育ゲームアプリのログが分析対象。高さ・重さ・容量などの概念を学ぶためのゲームをプレイしていき、各概念のテストを最終的に受けるという内容。その各テストに対してプレイヤーが何回目で試験に合格するかを予測する

やったこと(時系列順)

基本的に以下の記事に書いている流れを意識してやった。 drumato.hatenablog.com

データ理解

今回の評価は The quadratic weighted kappaを使う。以下の記事を参考にした。 www.med.osaka-u.ac.jp

qiita.com

ドキュメントにデータの各列の説明はあったが割と抽象的だったので実際のログを見たり、列の関係性(階層関係など)をみたりした。なんとなく理解したので一般的なEDAとして、よくある手法を試したりEDA系のNotebookを読んだ。

特徴量追加準備

他の人の考えに引っ張られる前に、NotebookやDiscussionを見ずに先に自分でこういう特徴量作れるのでは?というメモを作成

Notebook, Discussionを読む

Voteが多いNotebook, Discussionを読んで今後のベースになりそうなNotebookをフォークした。いったん、なにやってるのか細かく見ていった。Python力が低くてよくわからない部分も多かったので実際の挙動を見ながら何をしているか理解していった。

以下のやつをフォーク。

www.kaggle.com

開催からまだ1週間くらいしか経っていないからなのか、Notebook・Discussionどちらも基本的なものが多かった。

Voteが多いNotebookでも、他のVoteが多いものをベースに少し手を加えたものが多かったので一番包括的なものを探すと良さげ。

Discussionはこのデータどうなっているの?とかデータに対する質問が多かったしVoteも多かった。このあたりは参加すると皆が当たる疑問だと思うので早いうちにそういう質問を投げたり、まとめたりすると常に高いVoteを得られてDiscussionメダルが労力の割に簡単に得られそうな気がした。典型的なものはについて説明したDiscussionとか

www.kaggle.com

特徴量追加

特徴量追加準備として考えたものをいくつか作った。

EDAして思いついたものはEDA内容を見ながらコードに落としていった。このとき、同じNotebookだと可読性が悪いのでEDA用Notebookとモデル作成用Notebookは分けて作った方がやりやすかった。

モデル作成

いったんフォークしたものをそのままSubmitしてベースとなる精度を見た。

このコンペではKaggle上でNotebookを作成して、それ経由で提出する必要があったのでKaggle上で作業していたがネットワークが一瞬でも切れるとはじめからやり直し。結構計算時間がかかるコードだったのでいったんローカルで作業をした。ローカルの方が圧倒的に計算早かったので今後はとりあえずローカルでやった方が良さげ。

フォークしたNotebookに先程作成した特徴量を追加していった。フォークしたNotebookでは、一般的なやり方なのかもしれないが「基本的な特徴量(これがどこから出たか不明。NotebookやDiscussionか?)でのモデル精度に対して、特徴量Xを追加して精度が上がったなら採択するアルゴリズム」を用いて手当り次第作った特徴量から使える特徴量を見つけていくというやり方をしていた(前述のように計算時間がかかる)。そのため、自分で考えた特徴量を付け加えて同様に特徴量採択アルゴリズムを回して追加するか決めた・・・かったが、途中で 詰まったのでまだモデル作成までしてない。

このパートはPython力が低いと詰まりがち。慣れているRなら余裕そうなものしか今のところ考えてないので作成ロジックはそこまで難しくないので、慣れの問題か。

ちなみに、以下のようなやり方もあったみたいなので後で試したい。 qiita.com

以上。

思ったこと

データの定義がわかりづらい

前述のようにDocumentに書いている定義がわかりづらい。

実際データを見たり確かめたりしなければいけないところが多かった。自分の英語力の問題もあるだろうが、Discussionでも結構データについての質問や考察が多いのでわかりづらい・明記されてないのはまちがいなさそう。

実務では自分の場合、今までそういう部分は担当者とのコミュニケーションで解決できる場合が多かった。ただ、受託分析とか、担当者に質問してもメールが返ってくるまで時間かかったり、窓口が非エンジニアだから問い合わせに時間かかったりするようなことはよくありそうなので、このあたりのスキルは大切そう。
EDAで各コードの横にメモっていくよりも、紙に図示したりする方がわかりやすかったし、後で見返しやすかったので今後ははじめからそうしていきたい。

コピペベースで勉強になるのか

今のところ、基本的にコピペだがはたして勉強になるのか?と一瞬思った。ただこの疑問はコード力がつくのか?という観点な気がする。そういう意味ではあまり意味がなさそうだが、そもそも思い返してみると分析に複雑なコードを各力は必要ないので特に意味がない疑問だと思った(そういうのやりたい場合はプログラミング系コンペやれって話すね

ただし、同じ処理をするにしても効率が良い書き方などは大いに参考になりそう。また、当たり前だが書きなれるので前処理力は付きそう。

コーディング以外だと以下の部分かな、と思った。

MLプロジェクトの進め方

フォークしたコードにあった「特徴量追加していって判断するアルゴリズム」のように、効率が良い分析の仕方を他の人から学んでいき、自分なりのプロジェクトの進め方を確立させる。また、今回はそこまでいけてないが、特徴量の管理の仕方などもこれに該当しそう。

amalog.hateblo.jp

www.currypurin.com

どういうことを試せばいいのか

プロがどういうことを考えている(あたりの付け方や注意した方がいいことなど)かをNotebookやDiscussionでトレースできる。ただし、前述のように開催から期間が経ってないので多くが基本的なことしか共有されてないので、まだあまり恩恵を受けてない。

疑問

よくわからなかった部分。読んだ人でわかる人がいたら教えていただけると助かります

人のコードをフォークしたものはどこからパブリックにあげてもいいか

特に禁止はされてなさそうだからモラルの問題か?極論でいえば、良い感じのことをしているけどコード説明がまったくないやつに説明つけるだけで結構vote取れそうな気がするけれど。

さすがにそれは極論んあおでモラル的にはアウトかもしれないが、じゃあ7割は人のコードでそれプラスオリジナルの特徴量加えたとかだといいのか?どこからならいいの?って思う。

Notebookみていると1Discussionにつき1Topic感がある気がする。特徴量や手法はオーソドックスなもの(誰かのフォークでもOK)を使ってそこは説明なし、オリジナル特徴の部分だけを説明するのが多い気がする。

Discussionの内容

Discussion(議論)というよりQuestionになってるのが結構あるけどいいのか・・・?

その他所感

  • 色々思い浮かんだことや議論内容を試していったり、最新のDiscussionやNotebookを常に追っていったりすると時間が無限に吸い取られるなこれ
  • 前述のように、Discussionは開催直後にすぐ手を動かしたらメダルゲットは労力少なく簡単に取れそう
  • NotebookはEDAに限れば簡単そうと思ったが、Vote貰えそうなEDAは基本的なものゆえに内容は皆似通うので内容の差別化が難しくて競争率高そう。Vote取れているやつは見た目に凝っていることが多いので凝る必要があるので、案外難しそう。(あと説明を丁寧に書くのは最低条件だが英語力が。。。)
  • 気軽にDiscussionに投稿した方が良さげ。英語力なくてもGoogle翻訳をして、その英文を軽く修正すれば案外なんとかなりそう(本当に読める英語になっているかは知らん)
  • すでに終わったコンペを見るより、開催中コンペの方が段階的に解法を見れる(みながどういうことを考えながらやっていってるのか見れる)のでよさげ

今後

目的の「Pythonに慣れる」「仕事で使う段階のときにスムーズにプロジェクトを進めるために疑似体験をして、自分なりのテンプレを作る」においてはとても有益そうなのでとりあえずこのコンペはそこそこちゃんとやっていく。

ただし、時間が無限に取られそうなので、機械学習をめっちゃ使うわけではない自分の場合はこのコンペの後どうするか付き合い方を考えた方が良さそう。 週1で軽くやるくらいか?