ktrのブログ

だいたい体験談と勉強したことのアウトプット

SIGNATE公園コンペの反省

KaggleのRコンペでリークが見つかり呆然としているときに、SIGNATEでデータ量もそれほど多くないテーブルコンペが開催されたので初日から参加しました。結構本気で取り組みましたがフォーラムなし+時系列タスク+コンペ参加2回目ということもあって大分苦労しました。

結果は17位なので役に立つ情報はありませんが、自身への備忘録と反面教師的に参考になればと思います。

コンペの概要

  • 開催期間 2018/10/24 - 2018/12/13
  • 8つの国立公園周辺の宿泊者予測。
  • 訓練データに2015年と2016年の日次データが与えられる。

モデリングの概要

  • 特徴量
    最終提出に使用した特徴量は天気データ、路線検索結果、SNSデータ、そしてターゲットを1日シフトさせたラグ変数 。
  • 交差検証
    2015年を訓練データとして2016年を検証データ使用。結果的にはCVの変動とLBの変動が一致しなかった。

詳細

特徴量

提供データの結合
  • 天気データ
    公園名ではなく地名でデータをもっていたので単純に公園と1:1では結合しなかった。なので公園をググって地名と公園が結びつくようしました。天気データは予測時点では使用できないので前日の値をシフト。
  • 路線検索データ
    検索結果の到着地と出発地が県名だったので公園の場所をググって紐付けを行った(公園が複数の県にまたがっているような場合もあり)。
    対象公園外からの到着検索と対象公園からの出発検索の二つに分けて集計。
    検索実行日時で集計は行わず到着(出発)指定日時で集計を行えば、未来の情報として役に立つと思ったが、一部の公園でターゲットの推移と一致しないことが終盤になって判明しました。
  • SNSデータ
    公園に関連しそうな単語のSNS投稿件数のデータ。公園に関連しそうな単語は勝手に選定がされていたので、抽出方法が恣意的な感じがして気持ちが悪かったが、それをいい塩梅で処理する方法が浮かばなかったので、こちらも「単語 国立公園」でググってすべての単語を公園と紐付け。
ラグ

時系列予測ではターゲット変数をシフトさせて(ラグをとる)説明変数とするのが常套手段みたいです。1

ラグが有効だと感じていたし、公園ごとにコレログラムが異なっていたので、ターゲットを7日までシフトさせてそれぞれの公園で一番CVが良いラグの組み合わせで予測を行うようにしましたが、結局改善しませんでした。今考えるとCVがLBと一致しなかったんだからCVが下がるように特徴量を選定してもLBに反映されないのは当たり前です(泣)。

結局ラグ1で落ち着きました...

モデリング

学習器にはLightGBMを使用。理由は同時期に参加していたKaggleのRコンペで使用していた為でとくに深い意味なし。最後にXGBoostも試したが結局LightGBMの方がスコアはよかった。

予測には公園一つずつの訓練データを使用する方法と、すべての公園を訓練データとしてぶち込む2通りがありました。直感的にはそれぞれの公園にそれぞれモデルをこしらえら方が良さそうだが、後者の方がスコアが良かったです。おそらく全体の傾向をみて、平均的な予測する方が効果的だった印象。2

交差検証の設定

時系列予測で単純なk-foldが通用しないことは目に見えていたので、コンペの予測タスクと同じように2015年を訓練データとして2016年を検証データすることにした。 しかし、特徴量を追加したり、ハイパーパラメータチューニングするとCVが下がるが、LBが悪化するという乖離状態に落ち入り、悲惨な結果を辿る事に.....

その他

定常性

ツリーベースの学習器は基本的にデータを外挿することができず、徐々に増加したりするトレンド予測ができないないことは知っていたので、前日の差分をとってトレンド除去をして予測を試みましたが、差分を戻した際にうまくいかなかったので使用しませんでした。

シフト365日

時系列だし新しいデータほど価値のあるでは?という考えから365日分のラグを取れば2015年と2016年同時に特徴が見れていいじゃん!と思って追加したがLBで大幅に悪化した。

反省点

とにかくCVとLBの一致できなかったが大きな反省点です。参考にできるフォーラムもなかったのでまるで暗闇を手探りで歩いている感覚でした。

窓関数を使った移動平均などを特徴量に追加するときに訓練データは問題ないですが、テストデータは予測結果を当てはめて、その結果もって予測中に計算する必要があります。これが結構面倒で、実験速度の低下になりました。自分の実装スキルのなさが露呈したと思います。

Kaggleのような公開カーネルが存在しなかったので、最初から最後までをすべて自分の頭で考えて、それをコードに落とし込む必要がありました。なので実装スキルは確実にアップしたと思います。 初めてやり通したコンペとなったので非常に良い経験となりました。ぜひ皆さんの解法も共有いただきたいです。


  1. https://mlcourse.ai/notebooks/blob/master/jupyter_english/topic09_time_series/topic9_part1_time_series_python.ipynb?flush_cache=true

  2. signate「国立公園の観光宿泊者数予測」コンペで10位でした - u++の備忘録 によると、公園ごとに予測した方が結果がよかったみたいなので、やはり個別に予測するほうが良いのかもしれません。

知識ゼロから統計検定2級に合格するまで

データ分析に必要な基礎的な統計知識を習得することを目標に、2018年前期(6月)に統計検定2級を受験し無事に合格したので、その時使用した参考書や勉強方法を記録です。

スケジュール

統計の基礎を1ヶ月。過去問を使用した勉強が3ヶ月。合計4ヶ月ほど。
勉強時間は平日は1時間半くらい。休日は2〜3時間ほど。

スペック

数学苦手。統計の知識はほぼなし。分散、標準偏差が曖昧なレベル。

使用した参考書

  • 統計の基礎

まずはこの一冊から 意味がわかる統計学 (BERET SCIENCE)

まずはこの一冊から 意味がわかる統計学 (BERET SCIENCE)

1冊目にハードルをあげるのはよくないと考えて中学数学程度の知識で読み通せる本から始めました。 第1章は殆ど数式を用いないで検定や区間推定を俯瞰し、第2章からは確率変数を導入してややステップアップした内容になっています。この章立てが自分には丁度良いレベル感で読みやすかったです。

Amazonでは以下の「完全独習 統計学入門」も人気が高いようです。本屋さんでパッと中身を見て自分に合いそうな方を選びました。

  • 回帰分析

統計学が最強の学問である[実践編]――データ分析のための思想と方法

統計学が最強の学問である[実践編]――データ分析のための思想と方法

例年試験では必ず重回帰分析の結果の解釈問題が出題されます。「まずはこの一冊から」では単変量の最小二乗法による回帰直線の求め方しか触れていません。 統計検定の為ではなく通勤の合間の読書として購入しましたが、実践的な内容で重回帰分析の解釈の仕方が説明されており、この分野の知識を補うことができました。統計検定と結びつけて紹介しているブログなどは多分ないと思いますが、付録に数理的な背景も載っており意外とオススメです。

  • 確率

長岡先生の授業が聞ける高校数学の教科書数学 (考える大人の学び直しシリーズ)

長岡先生の授業が聞ける高校数学の教科書数学 (考える大人の学び直しシリーズ)

袋から玉を取り出したり、じゃんけんで勝つ期待値など数Aのセンター試験ででるような確率や条件付き確率も出題されます。統計検定の勉強を始める前に高校数学全体の復習を上記の本でざっと勉強していたのでこの本を紹介しますが、適当な本で数Aの問題を勉強すればこの分野は問題ないと思います。

  • 過去問

日本統計学会公式認定 統計検定 2級 公式問題集[2015〜2017年]

日本統計学会公式認定 統計検定 2級 公式問題集[2015〜2017年]

当たり前ですが一番重要です。使用できる過去問は2016年までの6回分を、4回は時間に測らずに自分の頭で考え、分からなかったらネットや参考書をみて時間をかけてでも自力で答えを出すようにし、2回分はキッチリ時間を測りました。

  • その他

統計学入門 (基礎統計学?)

統計学入門 (基礎統計学?)

統計学の入門の勉強としてスタンダードなのがこの「統計学入門」(通称赤本)みたいです。網羅性は確かに高いのですが、読み解いていくのに大学レベルの数学知識が必須なので数学が苦手な私はだいぶ苦労しました。なので、つまづいたときの辞書の用途や、基礎が理解できた後により理解を深める副読本として使用しました。 私は読み通してないのでこれがなくても2級は受かると思います。

試験について

図をかなり細かいところまで読み込まないと解けない問題があったりしてとにかく時間が足りませんでした。いくつかはほぼ直感で選んだのもあります。これが外れていたら多分落ちてます。簡単に解けるオーソドックスな問題をいかに落とさないようにすることが重要だと思います。
試験後に数学教室で無料の解説授業があったので参加してみました。 講師の先生によると、より本質的な部分を問うような問題が増えてだんだん難化している印象とのことです。 一方でいつでも受けることができるCBT方式はプールされている問題からチョイスして出題されているためペーパーテストより問題が平均化されやすと話していました。特にこだわりがなければ結果もすぐに出るみたいですし、通年受けることができるCBT方式の方が精神衛生的に楽かと思います。

総括と準一級について

平均、分散、標準偏差などの統計指標の意味が理解できるようになり、箱ひげ図やコレログラムなど分析に使用されるチャートの見方もわかるようになりました。
ただ、検定や推定は機械学習の分野では全然使わないのでほとんど忘れかけています。というかもう忘れています。

最近の機械学習ブームによるものだと思いますが、準一級の傾向として本来の出題範囲と異なる機械学習で使うような分野の問題が出題されているようです。準一級はまだ始まって間もなく出題傾向が安定していないので、勉強外から出題されたら...と考えるとちょっとリスクが高いです。もう少しタイミングを見ていずれ受けたいと思います。