Kaggleで使われた特徴量エンジニアリングとアルゴリズムまとめ

Kaggleにおいて、人によってはソリューションを書いてくれているものがあります。特徴量エンジニアリングやアルゴリズムなど業務での参考になるだろうと思われるので、仕事で関わりそうなデータという観点から4つほどですが事例を集めてみました。このような事例のまとまった本とかあったらいいのですが。

基本的に各事例ごとに
・目的
・どんなデータセット
・どんな特徴量エンジニアリング
・どんなアルゴリズム
・リンク
を記していきます。

Walmart Recruiting – Store Sales Forecasting

  • 目的
    • ウォルマートの部門ごとの売上予測
  • どんなデータセット
    • ウォルマートの売上データ
      ・店舗番号
      ・部門番号
      ・週
      ・週次の売上
      ・祝日の有無

      外部のデータ
      ・気温
      ・物価指数
      ・スーパーボウルの時期
      など

  • どんな特徴量エンジニアリング
    • 予測する売上の過去データを用いたので、特徴量は用いていません。

        ・年間における週の番号
        ・高い成長率の店舗や昨年から大きく成長している店舗に関して祝日効果の重み付け 

      を行った程度のようです。

    • どんなアルゴリズム
      • 統計学と機械学習のハイブリッドな手法のようです。SASとRを使用しているとのことです。

          統計学の手法
          1. Auto-regressive Integrated Moving Average (ARIMA)
          2. Unobserved Components Model (UCM)

          機械学習の手法
          3. Random Forest
          4. Linear Regression
          5. K nearest regression
          6. Principle Component Regression

        以上の6つのモデルから平均値をとって予測し、部門ごとにモデルを作ったようです。

    • リンク
    • Algorithmic Trading Challenge

    • 目的
      • 大規模なトレーディングにおけるマーケットの反応を予測
    • どんなデータセット
        • 株式市場の出来高に関するデータ
           ・ask(買い)の価格データ
           ・bid(売り)の価格データ
           ・建値かどうか
           ・買い手か売り手のどちらが主導したか
           ・取引高
           ・時刻
          など
    • どんな特徴量エンジニアリング
      • ・価格
         ・トレンドを除外した価格の振幅
         ・流動性ショック発生前の最後のn回の価格指数の移動平均
         ・流動性ショック発生前の最後のn回の間の価格増加
        ・流動性
        ・スプレッド
         ・bidとaskの広がり
        ・レート
         ・最後のn回のイベントにしめる注文などの数
    • どんなアルゴリズム
      • ・ランダムフォレストを用いた変数選択
         【工程1】
         ・全ての特徴量を利用して訓練する
         ・テスト集合に対するモデルのパフォーマンスを計算する
         ・特徴量の重要度をランク付けする
         ・複数のサブセットから最も変数重要度の高い特徴量セットを作る
         ・最も平均二乗誤差(RMSE)が低いサブセットに決める
         【工程2】
         ・工程1で決めた特徴量から意味的に似ている特徴量を選ぶ
         ・工程1で選ばれていない特徴量を選択する
         ・RMSEが低くなるなら、意味的に似ている特徴量を除外する
         ・改善しなくなるまで続ける
         【工程3】 
         ・工程1〜2で選ばれて意味的に直交(独立)しているかどうか考慮して、工程1で除外されたものの中から特徴量を選ぶ
         ・RMSEが低くなるなら、工程1の特徴量にその変数を加える
    • リンク
    • Predict Closed Questions on Stack Overflow

    • 目的
      • 質問が閉じられるかどうかを予測
    • どんなデータセット
      • ・質問者の質問のその当時の回答数
        ・タイトル
        ・bodyテキスト
        ・タグ
        ・閉じられたかどうか
    • どんな特徴量エンジニアリング
      • ・タイトル、bodyテキスト、タグをVowpal Wabbit formatに変換
        ・ユーザーの評価や投稿数なども利用
    • どんなアルゴリズム
      • Vowpal WabbitというMicrosoftやYahoo!が出資している機械学習ツールを使い、多クラス分類を行ったようです。カテゴリカルな変数をone-hotに変換する必要がなく、楽に分析できるようです。
    • リンク
    • Outbrain Click Prediction

    • 目的
      • ユーザーにレコメンドするコンテンツのクリック予測
    • どんなデータセット
      • ・ユニークユーザーID
        ・ドキュメントID
        ・デバイス
        ・流入経路
        ・クリック
        ・プロモーションしたコンテンツID
        ・ドキュメントの詳細情報
        ・ドキュメントのトピック情報
    • どんな特徴量エンジニアリング
      • 重要な特徴量
        ・表示されてからの1時間後、1日後、1日以降のコンテンツのページビュー
        ・FFM(Field-aware Factorization Machines)を用いて、おのおの競合している広告のデータを作成
        ・ユーザーごとのクリックした際の流入経路やドキュメントの組み合わせ
         80回よりも少ないイベントのデータは切り捨てている
        ・ユーザーごとのページビューしたドキュメント
        ・広告クリックの1時間以内にクリックしたドキュメント
        ・広告のカテゴリーとドキュメントのカテゴリーの相互作用項
        ・現在時刻とドキュメントが表示された時刻との差分の対数
        ・ユーザーが同じカテゴリーや同じトピックの広告ドキュメントを見たかどうか
        ・過去にその広告を見たかどうか、それをクリックしたかどうか(広告主、流入経路、カテゴリー、トピックも同様に)
        ・将来的にその広告や広告ドキュメントを見たかどうか、将来的に見てなくても同じキャンペーンの広告を見ているかどうか
    • どんなアルゴリズム
      • 用いたモデル
        ・LibFFM
        ・Vowpal Wabbit FTRL(ロジスティック回帰でのL1・L2正則化)
        ・Liblinear
        ・XGBoost
        ・Keras
        ・Logistic regression
        ・SVC
    • リンク
    • 感想

      調べてみて、複数の時系列モデルの予測結果の平均値で予測する手法、特徴量の選択をstepAICのようにランダムフォレストで行う手法、Vowpal Wabbit(今回の2つのソリューションで扱われていた)などを新たに知れました。Kaggleには他にもKernelという手法をシェアする場があるので、その情報も今後キャッチアップしていきたいと思います。

      参考情報

      機械学習コンペティションの進展と今後の展開

    ベイジアンネットワークをRのbnlearnパッケージで推定して予測してみる

    ベイジアンネットワークの知見が無かったので、調べた情報をまとめています。一応、載せているスクリプトでRを用いて予測するということができます。

    【目次】
    ・ベイジアンネットワークとは
    ・ベイジアンネットワークの用途
    ・ベイジアンネットワークの推定のステップ
    ・Rでの実行例
    ・おまけ:Webサービスへの応用例
    ・参考文献

    ベイジアンネットワークとは

    ・複数の確率変数の間の定性的な依存関係をグラフ構造によって表し、個々の変数の間の定量的な関係を条件付確率で表した確率モデル。前提として、有向非循環(グルグルと回らないグラフ)となっているグラフの構造を持つものに限定している。
    ・入力となる変数と出力となる変数はモデルの中では区別されない。
    ・時間という明確な因果関係などをモデルに組み込みやすいので、系列データなどを扱うケースが多い。モデル設計者がデータが生成されるプロセスを考慮しながらモデルを組んでいける。
    ・非循環性とd分離の仮定のみによって導かれる現在考えられる最も自然な離散モデルであり、現在の様々なモデルの中でも、最も表現力と予測力を持つモデルとされる。

    ベイジアンネットワークの用途

    ・物体追跡
    ・ジェスチャ認識
    ・Webサイトなどのレコメンデーションサービス
    ・広告配信
    ・メルマガなどの配信最適化
    など画像処理問題から消費者行動問題までいろいろな分野で活用されているようです。

    ベイジアンネットワークの推定のステップ

    モデルの選択や推定は学習 (learning)と呼ばれ、以下の2段階のステップを踏みます。

    Step1:構造学習(structure learning)…データからネットワーク構造を学習する。
    Step2:パラメータ学習(parameter learning)…Step1で学習した構造によって意味付けした分布のパラメータを学習する。

    ベイジアンネットワークの推定は条件付き確率やMAP(Maximum a posteriori)推定量などを用います。構造学習の際に、事前知識を導入することができます。

    Rでの実行例

    ・データ
    何千もの主要な免疫系細胞から取り出した11種類のリン酸タンパク質とリン脂質の測定値からなるデータです。以下のサイトよりダウンロードできます。
    Supporting Online Material Causal Protein-Signaling Networks Derived from Multiparameter Single-Cell Data

    ・パッケージ
    ベイジアンネットワークを実行できるパッケージはいろいろありますが、参考文献に従いbnlearnを用います。加えて、ネットワーク図の可視化のためにRgraphvizを用います。Rgraphvizがcranでは対応したものがなかったので、こちらを参考にして、インストールしました。
    Provides plotting capabilities for R graph objects

    ・ネットワークの図示

    ・データ確認

    ・構造学習
    データセットから、ネットワーク構造を推定します。推定するための手法は様々あるようですが、今回はヒルクライムアルゴリズムを用います。

    構造学習より得られたネットワーク構造を可視化します。因果関係がダメな感じのネットワークが出来ていないかチェックする必要がありますね。機械的に作るだけでなく、背景的知識も考慮するという進め方が推奨されています。

    ・パラメータ学習
    先ほど、データセットから求めた構造について、以下のコードでパラメータ推定します。パラメータの推定や構造推定は試行錯誤するところなので、こんな簡単に済む訳では無いようです。

    ・予測
    テストデータを用意して、データセットから求めた構造・パラメータを用いて、任意の変数の予測を行います。予測したい変数の値は欠損していたらエラーで予測してくれないですが、全部0にしておけば回ります。運用上は予測したい変数の値はわからないはずなので。

    全然45度線上に乗っていないので、あまり精度は高くないようです。

    cpquery関数と言って、条件付き確率を予測できる関数もあるようです。
    Perform conditional probability queries

    おまけ:Webサービスへの応用例

    参考文献には、Webサイトの閲覧データをもとに、ユーザーの行動を予測するというモデルの紹介がなされていました。ただ、Webサイトの場合、ページ数や商品の数・ユーザーの数も膨大なことから、ネットワーク構造の推定が難しいようです。そこで、ネットワークを作るに際して、変数を確率的潜在意味解析(pLSA)で扱いやすい数に絞るなどの工夫をされていました。自社のサイトに関しても適用する際に、変数の多さは待った無しだと思うので、いざ適用する際は情報圧縮技術を駆使したいですね。

    参考文献

    ベイジアンネットワーク技術 ユーザ・顧客のモデル化と不確実性推論

    確率的グラフィカルモデル

    Learning Bayesian Networks in R an Example in Systems Biology

    グラフィカルモデル入門

    ベイジアンネットワークを用いたWeb レコメンデーションシステムの開発

    PRML8章