データサイエンティスト養成講座 第7回受講レポート 

      2016/11/07    - 勉強会・セミナー   執筆者:多根悦子

いつも渋谷で開催されているデータサイエンティスト養成講座ですが、今回は六本木です!SAS Institute Japan様の会議室をお借りして講座が開かれました。入館ゲートを通ったり、高層階へ上がったりと、いつもとは異なる雰囲気で受講者も講師もテンションが上がります!たまに環境を変えるのは気分の切り替えにもなっていいですね。

 IMG_0958 SAS Institute Japanが入っている六本木ヒルズ

さて、今回もDeepAnalyticsのコンテスト「Jリーグ観客動員数を予測せよ!」のモデル作成の工夫について各チームの発表から始まります。

・マンボウチーム
アウェイのスタジアムで試合が開催される場合に、距離が遠いほどサポーターの数が減るのではないかと仮説を立て、各チームのスタジアム間の距離を出して特徴量とした。各チームのスタジアムの緯度経度をKaggleのAPIを使って距離に変換した。

・ホウボウチーム
追加された4種類のデータを結合し、各種のスタジアムのデータも付けて、最後にモデルに入れる時にトレインデータとテストデータを抽出する形をとっている。dplyrのフィルターを使ってデータ加工を1回で済むように工夫した。また、順位のデータも追加して回帰をしてみたが、あまり効果がなかった。順位は後半になるほど効いてくるなど単純な線形ではなさそうなので、ツリー系を使ったり、データ加工に工夫したりする必要があると思っている。

・サクラダイチーム
データを加工する前に回してみようと思い、データ件数の数から稀なデータが出て来ないように手動で絞り込んだ。また、J1とJ2では明らかに動員数の平均が異なるのでJ1とJ2で学習データとテストデータに分けた。木曜だけはなぜか平均動員数が少ないので、祝日フラグをやめて木曜かそれ以外かを取るようにした。

・スナメリチーム
7つの変数(ステージ、J1 or J2、節、平日or休日、開始時間、ホームorアウェイ、天気)を投入して3480くらいのスコアが出た。時間があれば、ホームでの開幕戦や終幕など詳細に分けて分析してみたい。

・ニシキアナゴチーム
2011~2013年のMVPやベストイレブン、ベストヤングプレイヤーに選ばれた人にフラグを付けたり、ベストイレブンであれば試合に出ている選手の人数を集計したデータを結合させている。またスタジアムが位置する都道府県の人口もデータとして結合させている。それらを踏まえた上で重回帰分析以外にもランダムフォレストやGBMといったモデルを実行していきたいと思っている。

・クマノミチーム
選手を1~11までホームとアウェイにダミー変数化して、いるorいないのフラグを立てたが、スコアが大幅にダウンしてしまったため除外した。テレビの媒体に意外と効果があり、スラッシュ区切りだったのを分割してまとめてユニーク化してダミー変数としてフラグを立てると、スコアが50点くらい上がった。

・ゴンズイチーム
全ての変数を入れるのではなく、作ったモデルに対して精度を上げるにあたって使用しない変数を決めている。テレビ局、クラブチームのメンバーなどは抜いている。開催節の節と節の日数を数値化してモデルに組み込んでいる。その他、曜日(祝休日)、天候(室内含む)、都道府県、チームをダミー変数化してモデルを作り、最後に補正をかけたところ、3600くらいのスコアが出た。

IMG_0970

続いて、講師よりデータを分割してモデルを作るサブセットモデルの解説です。J1とJ2では、動員の水準が異なるため、それぞれ別のモデルを作ることにしました。明らかに挙動が違うモデルを作るときや、別々にモデル作って欲しいと要望があった時はこのようは手法を用いることもあります。ここではGLMなのでそれほど複雑なモデルは作っていませんが、ランダムフォレストやGBM、ニューラルネットワークのような複雑なモデルを使うと、分割することの効果は薄れていきます。また、分割を増やせば増やすほどデータ数が少なくなるので、その分機械学習効果は薄れます。しかし、簡単なモデルを使うときやデータ量が十分にある時には効果が出やすいので、試してみる価値はありそうですね。

更に、残差を確認してモデルを改善していく方法の紹介がありました。予測値と実測値の差を見て、差の大きいところを改善することによって、モデルの精度を上げて行きます。差が大きいレコードには、どのような特徴があるか、今回の場合なら、それはチームに特徴があるのか、天候なのか、対戦相手なのかなどを見て行くことにより、データの特徴をつかんで、作ったモデルの弱点を見つけ出して、改善のヒントをつかんで行きます。

最後に、先発選手のデータを使って作ったモデルが紹介されました。まず、試合のIDと選手の名前が並んだデータを作ります。かなりタフな作業になりますが、ここではtidyrという横に長いデータを縦にしたり、また逆にしたりする便利なパッケージが使われています。このデータでは1721のトレインデータに対して、2568の変数となり、そのまま線形回帰すると変数がデータよりも多いために連立方程式が成り立ち、トレインデータの誤差が0になってしまいます。それではモデルになりませんよね。ではどうしましょう?Lasso回帰やRidge回帰というものがあり、glmnetパッケージを使うと便利です。まず、Lasso回帰を使うと出てくる変数が減ります。出来るだけ少ない数でモデルを作ろうとするのです。逆にRidge回帰はどれかの変数に大きく依存するモデルになることを全力で回避しようとします。Lasso回帰をglmnetで回すとモデルがたくさんでき、極端にいえば罰則項がなくなり別の線形回帰となります。さらにクロスバリデーションをして一番良いものを採用するとスコアは4700くらい。チーム名を入れてパラメータが大きい順番に並べ替えてみると、おおよそ各チームを代表する選手がピックアップされていることが確認できました。ただし、過信してはいけません!ある人気選手が出場すると一気に観客数が15000人増え、欠場するとその分減るのか、というとそういう訳ではないですよね。この手法は必要な時に応じて利用するのが良さそうです。

IMG_0977

次回はいよいよ最終回!受講チームの最後の順位が発表されます。お楽しみに!

第8回の受講レポートはこちら