Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rubyにおける機械学習と統計分析のための環境整備の取り組み

Kenta Murata
February 23, 2017

 Rubyにおける機械学習と統計分析のための環境整備の取り組み

Ruby Business Users Conference 2017

Kenta Murata

February 23, 2017
Tweet

More Decks by Kenta Murata

Other Decks in Technology

Transcript

  1. Rubyにおける機械学習と 統計分析のための
 環境整備の取り組み Kenta Murata Speee Inc. 2017.02.23 Ruby Business

    Users Conference 2017 Rubyにおける機械学習と 統計分析のための
 環境整備の取り組み Kenta Murata Speee Inc. 2017.02.23 Ruby Business Users Conference 2017
  2. Ruby Business Users Conference 2017 (2017.02.23) self.introduction • Kenta Murata

    (mrkn) • Speee Inc. ‣ Researcher • CRuby committer ‣ A bigdecimal maintainer
  3. Ruby Business Users Conference 2017 (2017.02.23) gems • bigdecimal •

    enumerable-statistics • daru-td • iruby-rails
  4. Ruby Business Users Conference 2017 (2017.02.23) Topics • 統計分析、機械学習、データサイエンスに ついての基礎知識

    • Ruby ではデータサイエンスのお仕事はで きない → なぜか? • Ruby のためのデータサイエンス環境整備 プロジェクトの進捗
  5. Ruby Business Users Conference 2017 (2017.02.23) 今日の流れ • はじめに •

    統計分析と機械学習 • Ruby とデータサイエンスの関係 • Ruby のためのデータサイエンス環境 • まとめ
  6. Ruby Business Users Conference 2017 (2017.02.23) 統計分析と機械学習 • はじめに •

    統計分析と機械学習 • Ruby とデータサイエンスの関係 • Ruby のためのデータサイエンス環境 • まとめ
  7. Ruby Business Users Conference 2017 (2017.02.23) 統計分析と機械学習 • 数学と計算機科学のサブカテゴリ •

    データから知識を取り出す仕組み • データサイエンスで使う道具
  8. Ruby Business Users Conference 2017 (2017.02.23) データサイエンス • ビッグデータ ‣

    政府や企業が大量にデータを蓄積している • サイエンス ‣ 大量のデータから科学的な知識を取り出し て政策や事業開発に活かしたい
  9. Ruby Business Users Conference 2017 (2017.02.23) 統計分析? 機械学習? • データサイエンスのための手法

    • 既知のデータ (訓練データ) から統計 モデルを作る • 何が違う?
  10. Ruby Business Users Conference 2017 (2017.02.23) 統計分析 • 統計分析で作った統計モデルの目的 ‣

    統計モデルを使って既知のデータの性質 を説明する • 要求されること ‣ 統計モデルの中身が解釈しやすいこと ‣ 過学習していないこと
  11. Ruby Business Users Conference 2017 (2017.02.23) データの性質の説明 • 「なぜそうなるのか?」を説明できること ‣

    例1: 一般化線形モデル - 目的変数に対する説明変数の関与の仕方: 線形結合 ‣ 例2: 単一決定木 - サンプルを分ける規準: ジニ係数, エントロピー ‣ 例3: 統計的検定、ベイズ推定 - 「どうしてそうなるのか?」の確率を与える • シンプルな統計モデルを利用する必要がある ‣ 未知のデータに対する予測性能は頭打ちになる
  12. Ruby Business Users Conference 2017 (2017.02.23) 機械学習 • 機械学習で作った統計モデルの目的 ‣

    未知のデータに対して良い精度の予測を 与える • 要求されること ‣ 予測の精度が高いこと ‣ 過学習していないこと
  13. Ruby Business Users Conference 2017 (2017.02.23) 良い精度の予測 • 大量の訓練データを使用 ‣

    できるだけ広いケースで学習したい • 交差検定による過学習の回避 ‣ 統計モデルが複雑でも過学習しないように • ハイパーパラメータの機械的な最適化 • 複数の統計モデルを組み合わせて精度を高める ‣ 予測結果を説明する必要がないから可能
  14. Ruby Business Users Conference 2017 (2017.02.23) 統計分析と機械学習の違い • 統計モデルに対して解釈性と予測性のど ちらを求めるか

    ‣ 統計分析では解釈性 ‣ 機械学習では予測性 • 理論的背景は同じ • 人間と機械のどちらが学ぶか?
  15. Ruby Business Users Conference 2017 (2017.02.23) 機械 に 学習 させる

    • 人間が自然に行っている学習能力 を
 コンピュータ上で実現するための技術 • 問題の解き方を直接プログラムとして 記述せずに、いろいろ 試行錯誤を通し て正しい解き方を見つけ出す ように記 述されたプログラム
  16. Ruby Business Users Conference 2017 (2017.02.23) 機械学習の厳密な定義 あるプログラムの 問題 T

    に対する性能 を 性能尺度 P で評価したとき 経験 E に よって性能が向上しているとき、
 そのプログラムは 問題 T と 性能尺度 P について 経験 E から 学習 している
  17. Ruby Business Users Conference 2017 (2017.02.23) 例: 料理レシピのジャンル分類 • 問題

    T ‣ レシピのジャンルを予測 • 経験 E ‣ レシピに対する適切なジャンルを人間が指定する • 性能尺度 P ‣ ジャンル予測が正しかったレシピの件数
  18. Ruby Business Users Conference 2017 (2017.02.23) なぜ統計分析や機械学習が
 必要なのか? • ビジネス上の意思決定をデータに基づいて

    行うことが主目的 • 統計分析や機械学習の利用は必須ではない • 大量のデータから知識を取り出してビジネ スに活かすには、特に機械学習の利用は避 けられない
  19. Ruby Business Users Conference 2017 (2017.02.23) 機械学習によって実現できること • 人間には不可能なタスク •

    手書きのプログラムで直接表現できな いタスク • プログラムが自ら変化することで正解 が変化する問題に対応する
  20. Ruby Business Users Conference 2017 (2017.02.23) 人には不可能なタスクの例 • 大量のデータから知識を取り出す ‣

    医療診断記録から予後を予測 ‣ 10万人のユーザを購買履歴に基づいて グループ分けする方法 ‣ Web のクリックログから将来のコン バージョンを予測
  21. Ruby Business Users Conference 2017 (2017.02.23) 手でプログラミング
 できないタスクの例 • 将棋や囲碁の指し手を求める

    • 自動車やヘリコプターの自動操縦 • 手書き文字認識 • 線画に対する自動色塗り • スパムメール判定
  22. Ruby Business Users Conference 2017 (2017.02.23) プログラムが自ら変化することで 正解が変化する問題に対応する • ユーザの行動履歴に基づくコンテンツ掲出

    ‣ e.g. おすすめ商品の推薦 • A/B テストにおける掲出パターン選択の自 動最適化 ‣ バンディットアルゴリズムと呼ばれてるやつ
  23. Ruby Business Users Conference 2017 (2017.02.23) 要求されるスキルセットの違い • 統計分析では、統計モデルを理解する ための能力が要求される

    • 機械学習では、統計分析のプロセスを 自動化するためのプログラミング能力 も要求される ‣ 場合によってはインフラ構築・運用スキ ルまで要求される
  24. Ruby Business Users Conference 2017 (2017.02.23) 統計分析と機械学習 • 統計分析はデータから人間が学んでビ ジネス上の意思決定に活かす

    • 機械学習はデータから機械が学び、そ の機械を人間が仕事に活用する • どちらも同じ道具を使うが、要求され るスキルセットが違う
  25. Ruby Business Users Conference 2017 (2017.02.23) Ruby とデータサイエンスの関係 • はじめに

    • 統計分析と機械学習 • Ruby とデータサイエンスの関係 • Ruby のためのデータサイエンス環境 • まとめ
  26. Ruby Business Users Conference 2017 (2017.02.23) データサイエンスのワークフロー • データ収集 •

    探索的データ解析 • データ・クレンジング • 複数データソースの統合 • 前処理 • 統計モデルの学習 • 実世界への適用
  27. Ruby Business Users Conference 2017 (2017.02.23) 統計分析・機械学習が
 絡むプロセス • データ収集

    • 探索的データ解析 • データ・クレンジング • 複数データソースの統合 • 前処理 • 統計モデルの学習 • 実世界への適用
  28. Ruby Business Users Conference 2017 (2017.02.23) Ruby のみで完了できるもの • データ収集

    • 探索的データ解析 • データ・クレンジング • 複数データソースの統合 • 前処理 • 統計モデルの学習 • 実世界への適用
  29. Ruby Business Users Conference 2017 (2017.02.23) 実用的ではない • 機能が足りない •

    道具間の連携が不十分 • かなり頑張らなければならない
  30. Ruby Business Users Conference 2017 (2017.02.23) プルリクエストする? • データサイエンスがやりたいのである •

    データサイエンスのための道具を作る ことが目的でない • データサイエンスの道具を実装するの は、利用する人には結構大変
  31. Ruby Business Users Conference 2017 (2017.02.23) 利用者と実装者の違い • 利用者に要求されるスキル ‣

    利用する道具の理論的背景 ‣ ビジネス領域の知識と経験 • 実装者に要求されるスキル ‣ 実装する道具の理論的背景 ‣ 高度なコンピュータサイエンスの知識と経験 ‣ 実装する道具に特有のプログラミング技能
  32. Ruby Business Users Conference 2017 (2017.02.23) 使ってる人がいない • 使える道具がないから •

    Python と R を使ってる人が多い • Python と R の求人が多い
  33. Ruby Business Users Conference 2017 (2017.02.23) 作ろうとする人がいない • 作ることが目的の人は少ない •

    使われないものを作りたい人は少ない • 作り始めようとすると障壁が大きい
  34. Ruby Business Users Conference 2017 (2017.02.23) 負のサイクル • Ruby でデータサイエンスができない

    状態がより強くなる経済原理が働いて いる • できるだけ早く Ruby でデータサイエ ンスができる状態を作ってユーザを集 め、負のサイクルを止める必要がある
  35. Ruby Business Users Conference 2017 (2017.02.23) Ruby のためのデータサイエンス環境 • はじめに

    • 統計分析と機械学習 • Ruby とデータサイエンスの関係 • Ruby のためのデータサイエンス環境 • まとめ
  36. Ruby Business Users Conference 2017 (2017.02.23) 求められる条件 • 実用的に使える機能と品質を持つものでないと 使ってもらえない

    • Python や R で作られた資産を捨てずに使い続 けられないと使ってもらえない • できれば1年くらいでシュッと実現したい ‣ 早くしないと Ruby が使われなくなっちゃうかも
  37. Ruby Business Users Conference 2017 (2017.02.23) 他の言語をそのまま使う • 主流の環境を Ruby

    からそのまま利用できる • スイッチングコストが低いのでユーザを集め やすい ‣ 知ってる技術だから ‣ 既存の資産を使い続けられる • ユーザが集まれば、Ruby のための独自システ ムを作るサイクルが軌道にのるかも
  38. Ruby Business Users Conference 2017 (2017.02.23) PyCall • Ruby から

    Python の処理系を呼び出 せるようにする • Python のオブジェクトを Ruby から 操作できる (一部実装完了) • Ruby のオブジェクトを Python から 操作できる (未実装)
  39. Ruby Business Users Conference 2017 (2017.02.23) PyCall の使い方 $ git

    clone https://github.com/mrkn/pycall.git $ git checkout -t origin/eval $ bundle install $ bundle exec ruby example/hist.rb ⚠ まだ実用段階ではない
  40. Ruby Business Users Conference 2017 (2017.02.23) Python → Ruby #

    Python のこのコードを from sklearn.datasets import fetch_olivetti_faces data = fetch_olivetti_faces() x = data.images.reshape((len(data.images), -1)) y = data.target # 現状の PyCall を使って Ruby で書くとこうなる require 'pycall/import' import PyCall::Import pyfrom 'sklearn.datasets', import: 'fetch_olivetti_faces' data = fetch_olivetti_faces.() x = data.images.reshape.(PyCall.tuple(PyCall.len(data.images), -1)) y = data.target
  41. Ruby Business Users Conference 2017 (2017.02.23) Python → Ruby #

    Python のこのコードを from sklearn.datasets import fetch_olivetti_faces data = fetch_olivetti_faces() # numpy.ndarray オブジェクト x = data.images.reshape((len(data.images), -1)) y = data.target # 現状の PyCall を使って Ruby で書くとこうなる require 'pycall/import' import PyCall::Import pyfrom 'sklearn.datasets', import: 'fetch_olivetti_faces' data = fetch_olivetti_faces.() x = data.images.reshape.(PyCall.tuple(PyCall.len(data.images), -1)) y = data.target 不自然な部分を隠すための ラッパーライブラリを作る 必要がある
  42. Ruby Business Users Conference 2017 (2017.02.23) Ruby VM Python VM

    OVNQZOEBSSBZ
 ΦϒδΣΫτ 1Z$BMM1Z0CKFDU
 ΦϒδΣΫτ Python 側のオブジェクト のポインタを保持 SFTIBQFؔ਺ͷ
 ΦϒδΣΫτ reshape 属性 1Z$BMM1Z0CKFDU
 ΦϒδΣΫτ [2] call メソッドの呼び出し [3] PyObject_Call 関数の呼び出し 例: NumPy 配列の reshape の動き [1] reshape 属性の取り出し
  43. Ruby Business Users Conference 2017 (2017.02.23) PyCall の今後の開発予定 • Python

    オブジェクトを Ruby から操作するための機能の完成 • Ruby オブジェクトを Python から操作するための機能 • Ruby ←→ Python 両方向のコールバック機能 • PyCall が事前に知らない型変換のサポート • Python オブジェクトの IRuby 対応 • PyCall を生で使った時の Ruby としての不自然さを隠すラッ パーライブラリの開発
  44. Ruby Business Users Conference 2017 (2017.02.23) PyCall 以外 • R

    とのブリッジ • Julia とのブリッジ • Python、R、Julia、Ruby の4者間で の自然なデータ交換の実現 • etc.
  45. Ruby Business Users Conference 2017 (2017.02.23) ITOC Report • 『データサイエンスにおけるRubyの

    現在の位置づけと可能性』 • http://www.s-itoc.jp/report/ reaserch_results/439
  46. Ruby Business Users Conference 2017 (2017.02.23) まとめ • はじめに •

    統計分析と機械学習 • Ruby とデータサイエンスの関係 • Ruby のためのデータサイエンス環境 • まとめ
  47. Ruby Business Users Conference 2017 (2017.02.23) まとめ • Ruby でデータサイエンスができる世界を作るために

    ‣ Python の機能を Ruby から使うブリッジ機能を提供す るライブラリを開発中 ‣ matplotlib, scikit-learn などが動く ‣ Ruby を Python に見せるブリッジも必要 ‣ R と Julia のブリッジも開発する
  48. Ruby Business Users Conference 2017 (2017.02.23) sciruby.slack.com • Slack で意見交換をしましょう

    ‣ https://sciruby-slack.herokuapp.com/ • 日本語でも英語でも可
  49. Ruby Business Users Conference 2017 (2017.02.23) まとめ • Ruby でデータサイエンスができる世界を作るために

    ‣ Python の機能を Ruby から使うブリッジ機能を提供す るライブラリを開発中 ‣ matplotlib, scikit-learn などが動く ‣ Ruby を Python に見せるブリッジも必要 ‣ R と Julia のブリッジも開発する https://sciruby-slack.herokuapp.com/