欲張りスライムの備忘録

ソフトウェア関連の話題について記載する予定。「明日から本気出す」がモットー。

PyCon JP 2018に参加してまいりました

先日JOJO展で欲しいグッズがほぼ売り切れでへこんだ感動したAnaconda反対&Pandas派の欲張りスライムです。色々あって遅くなりましたが、PyCon JP 2018に参加してきましたので、簡単ではありますが個人的に重要だと思った部分だけ備忘録として上げておきます。

 

実践・競馬データサイエンス

  • 特徴量のエンジニアリング:(出走)履歴データの扱い

   (1) 過去X走までの情報を特徴量に加える:Xが増えると欠損データが増える

   (2) 過去X走の成績を集計する:次元数はXに依存しないが情報の欠損がある

   (3) 過去Xヶ月の成績を集計する:次元数はXに依存しないが情報の欠損がある

   (1) One-Hot-Encoding:対応する次元に1、対応しない次元に0を入れる方法

     カテゴリ数が多いと次元数が増えるので出現回数で足切るなどの工夫要

   (2) Target Encoding:過去のデータから該当カテゴリの目的変数を集計する方法

     「誰が」「どんなレース条件で」「どのような統計値になったか」

       ⇒機械的に特徴量を生成できる

  • 特徴量のエンジニアリング:Smoothing

   Target Encodingのような集計値を使う特徴量では、集計対象の数が少なくなると

   統計値の自信度、確信度が低くなる

     ⇒該当カテゴリが少ない場合に、集計値を全体平均に近づける

  • 特徴量のエンジニアリング:季節特徴量の扱い

   ・競馬だと季節は大きなファクターとして考えられている

   ・周期性のある特徴量変数を三角関数エンコーディングする

  • 予測モデルの学習:LightGBM

   (1) カテゴリカルデータのエンコーディングをしなくても

     カテゴリ変数を入力として受け付けてくれる

   (2) 欠損値を欠損値として扱うことができる

  • 予測モデルの評価:not only 定量評価 but also 定性評価

   実際に予測結果を目で見てみると、nDCG(関連度に基づいた評価)のような

   マクロな評価だけでは気づけない部分に気づくことがある

 

Pythonで時系列のデータを分析してみよう

  • 季節調整モデルの表示:トレンド、季節性、残差に分解・表示
  • 自己相関(ACF:Autocorrelation Function)

   ・過去の値が現在のデータにどれくらい影響しているか関係性を調べる

   ・ズラしたデータのステップ数をラグ(lag)と呼ぶ

   ・StatsModelsのtsa.stattools.acf()で求める

  • 偏自己相関(PACF:Pertial Autocorrelation Function)

   ・自己相関係数から時間によって受ける影響を除去した自己相関

   ・今日と二日前の関係には一日前の影響が含まれるが、一日前の影響を除いて

    今日と二日前だけの関係を調べられる

   ・StatsModelsのtsa.stattools.pacf()で求める

 

REST APIに疲れたあなたへ贈るGraphQL入門

  • GraphQLとは

   ・API用のクエリ言語

   ・TypeSystemを使用してクエリを実行するためのサーバ側のランタイム

   ・クライアントがサーバからデータを取得、変更、購読できるようにする

   ・REST APIの開発者、利用者間の課題

     API仕様のドキュメント管理が大変

     APIの叩き方を理解するのが大変

     APIのドキュメントと実装がずれててケンカ

   ・クライアント開発者からの不満

     1ページを表示するのに何個もAPIを叩かなければならない

     イベントドリブンに作っていてもサーバとの接続はREQUEST/RESPONSE

  • GraphQLのメリット

   ・クライアント、サーバ間のインターフェースがクリーンになる

   ・通信オーバーヘッドが削減される

   ・APIドキュメントの作成に費やす時間が不要になる

   ・APIを理解するのに費やす時間が削減される

  • GraphQLの特徴

   (1) 型指定されたスキーマ

     APIドキュメントを手動で記述する必要がなくなり、

     APIを定義したスキーマをベースに自動生成できる

   (2) クライアントからのレスポンス形式の指定

     クライアントからレスポンスの形式を指定できる

     オーバーフェッチ、アンダーフェッチがなくなる

   (3) サブスクリプションを利用したリアルタイム処理

     クライアントはデータをサブスクライブすることで、

     イベントドリブンに処理を実装することができる

  • AWS AppSync:すぐにGraphQLの利用を始められる

 

Pythonによる異常検知入門

  • まずは異常の定義から:異常検知の難しさ

   ・データのふるまいだけから異常であるかを判断することは難しい

   ・現象の背後にあるドメイン知識、オペレーション、状況を理解するのが重要

  • 異常検知の種類:Pythonなら簡単なコードで実装できる

   (1) 外れ値検知:正常解の分布から外れたデータを検知する

     ・ホテリング法

       長所:マハラノビス距離を使用しているため、変数毎に

          ばらつきが異なる多変量データでも扱うことができる

       短所:正規分布を仮定しているため、それ以外の分布のデータに

          あてはめられない

     ・近傍法

       長所:確率分布を仮定せずに、他データ点からの距離のみで

          異常判定ができる

       短所:クラスタ毎に密度が異なる場合は適切に動作しない;

          次元数が大きいと距離の情報が薄くなるため事前に

          次元を絞る必要がある

     ・LoF

       長所:クラスタ毎に密度が異なる場合にも利用可能

       短所:次元数が大きいと距離の情報が薄くなるため事前に

          次元を絞る必要がある

     ・One-Class SVM

       長所:カーネルの選択次第で、変数間の非線形性も扱うことができる

       短所:パラメータによって出力が大きく異なるためチューニングが必要

   (2) 変化点検知:データの傾向が変化した点を検知する

     ・複数モデルのあてはめ

       長所:直感的に理解しやすい?

       短所:計算量が大きい(O(N^2));オンラインに適用できない

     ・累積和法

       長所:データの分布を仮定しないため、様々なデータに適用可能

       短所:手動での閾値調整が必要

     ・Change Finder

       長所:オンラインでの変化検知を行うことができる

       短所:忘却率、ウィンドウサイズ毎のパラメータによって

          結果が大きく異なりチューニングが必要

   (3) 異常部位検知:非独立なデータの異常な区間を検知する

     ・近傍法

       長所:データの分布を仮定せず、クラスタからの距離のみで異常検知可

       短所:周期が変動するデータでは適切に動作しない;

          ウィンドウサイズを調整する必要がある

  • データのクレンジング

   (1) 季節性の除去

   (2) トレンドの除去

   (3) 分布の変換

     バースト性を持つデータを正規分布に近づける処理(BOX-COX変換)

 

Pythonで始めるウェブスクレイピング実践入門

   ・ウェブ上のリソースを取得し分析可能な構造化データへ変換すること

   ・ブラウザに見えてるデータであれば取得可能

   ・APIがなくてもデータ取得できる

   ・必要なデータに絞って取得できる

  • 注意点

   ・サーバ負荷の増加

   ・取得したデータの二次利用はやめよう

   ・サービス規約をよく読むこと

  • おおまかな手順

   (1) 対象のページを決める(自分で決める部分)

   (2) HTTPリクエストを送る/レスポンスを得る(ライブラリがやる部分)

   (3) HTMLのパース(ライブラリがやる部分)

   (4) 必要なデータの取得(自分で決める部分)

  • 基本編(技術的な部分のみ)

   ・try-exceptはしっかりやっておく

     不要なリクエストの送信を防ぐ

     夜実行する→朝起きてデータが何もないを防ぐ

   ・@retryデコレータを使うと再試行が簡単

  • 実践編(実例):ブラウザの気持ちになるのが大事

   ・ページング

     ⇒pageのクエリストリングをインクリメントして取得

     ⇒同じドメインに複数回アクセスするときはsleep()する

   ・ログイン必須のページ

     ⇒ブラウザの自動操作でログインする

   ・JavaScriptで要素を描画している(Ajaxなど)

     ⇒ブラウザによるJavaScriptの実行が必要

 

業務でもPythonを使っているのですが、改めてPython(プラスSymPy)の素晴らしさを再確認できたPyConだったと思います。