Download - Pythonを使った機械学習の学習
Pythonを使った機械学習の学習
2017年1月27日 found it project セミナー
加藤公一 シルバーエッグ・テクノロジー(株)
自己紹介
加藤公一(かとうきみかず) シルバーエッグ・テクノロジー(株) チーフサイエンティスト Twitter: @hamukazu 博士(情報理工学)、修士は数学 機械学習歴もPython歴も4年 趣味:筋トレ、特技:ベンチプレス
今日のはなし
• 機械学習の学習の話
–どのように勉強するとよいか
• 私はどのように学習したか
– 4年前は初心者
ちなみに…
http://bit.ly/kimikazu20140913
http://bit.ly/kimikazu20160204
いままでPythonの高速化芸を得意としてきました。
PyCon JP 2014 ソフトウェアジャパン2016
今日はその話はしません。
今日の話
• 機械学習を効率よく勉強するにはどうすればいいだろうか
• ただツールを使うだけではなく内部動作にも詳しくなるために
• 理解を助けるツールとしてのPython
私はどうやって勉強したか
• 本(論文)を読む
• 自分で実装する
–人工データで振る舞いを確認する
–内部動作を可視化する
• 既存の実装を見る
– ソースコードを読む
–内部データを読む
まずはこれ
さらにその前に
• 線形代数
• 微積分
自分で実装する
• 便利なライブラリがあっても、理解のためにあえて自分で作ってみる
–参考例:大学のクラスで学習するソートのアルゴリズム→機能を得ることが目的ではない、便利なライブラリならいくらでもある
• 最新の論文に出ているアルゴリズムは自分で実装せざるをえないことも
–意外と簡単につくれる
人工データでの確認
I1 I2 I3 I4 I5
U1 1 1 1
U2 1 1 1
U3 1 1 1
U4 1 1 ? ? ?
レコメンデーションの場合
ユーザU4には何を薦めればいい?
クラスタリングの場合
これを2つのクラスタに分ける
離れた2つの点を中心に正規分布した点をそれぞれ作る
こういう自明なケースで確認:単体テストとしても有効
内部動作の可視化
Metropolis-Hastingsアルゴリズム(MCMCの一種)の動作原理を説明できますか?
とりあえず動かしてみよう
(PRMLより)
低次元のケースについて、実際に動かしてみて可視化する
他の例:Lasso
• Lassoの解がなぜsparseになるか説明できますか?
L2ノルムの最小化
直線と共有点を持つように 円(L2球)を最小化
L1ノルムの最小化
直線と共有点を持つように ひし形(L1球)を最小化
このように…
• データが単純なとき(極端な分布のとき)、次元が低いとき、など簡単なケースで実装して試してみる
• 実用上の価値がなくても動作の理解には役に立つ
数値的な解析に便利なツール
• Numpy/Scipy (これはあたりまえ)
• Sympy (あまり使わない?)
問題
次の機械学習でよく出てくる関数を微分せよ(制限時間各5秒)
答
数値微分はあまりよくないという話
実際にfの値を評価しながら計算すると、hが小さいときに桁落ちが起こって精度が落ちる
Sympy
• シンボリックな計算ができる
• 代数的な演算や、微分・積分などもシンボリックに
既存のライブラリを使ってみる
• とりあえずはscikit-learn
• インターフェースが統一されてる
• ドキュメントも整備されている
みんな大好きあやめの分類
PCAで2次元に射影してからSVMで分類
これで喜んでていいの? 普通サポートベクタ知りたいよね?
サポートベクタの可視化
SVC.support_vector_でサポートベクタが取得できる (ドキュメントに書いてある)
Scikit-learnのよさ
• ドキュメントがよく書かれていて、内部データ構造についても記述があるものが多い
• 内部データ構造を見ることで機械学習アルゴリズムの理解に役立つ
• それでも納得しなければソースコードを読めばいい
• とにかく深掘りしやすい環境
しかし…
• Scikit-learnがすべてではない
• 機械学習ライブラリの中にはドキュメントが不親切なものも
Gensim (自然言語処理のライブラリ)
チュートリアルにあるLDAを使ったトピック抽出例
文書群をトピックに分類し、各トピックではどのような単語が支配的かを可視化
LDAについて D.M.Blei, A.Y.Ng, M.I.Jordan, "Latent Dirichlet Allocation" JMLR, vol.3, pp.993-1022 (2003)
このようなグラフィカルモデルで表される
文書には潜在的なトピック群についての確率分布が割り当てられる
こんなデモでいいの?
その他の内部パラメータを可視化しなくない?
そのためには
• 内部データ構造について、ドキュメントにはなにも書いていない
• なので、ソースコードを読まないとならない
• といっても、よく整理されているので読みやすい
LDAのパラメータ
まとめ
• 中身を理解したかったら手を動かしながら勉強しよう
• 理解のためのツールとしてもPythonは使える
• Sympyはいいぞ
私のキャリア戦略
• 「中身をよくわかっている」というのは競争力になるのではないか
–より深いチューニング
–最新の研究論文の実装・実験がスムーズに
良い理論ほど実用的なものはない
「科学技術計算のためのPython―確率・統計・機械学習」より