Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Pythonによる機械学習
計算機統計学会第30会大会
2016/5/20
シルバーエッグ・テクノロジー(株)
加藤公一
自己紹介
加藤公一(かとうきみかず)
シルバーエッグ・テクノロジー(株)
チーフサイエンティスト
博士(情報理工学) (修士は数理科学)
Twitter: @hamukazu
機械学習歴・Python歴ともに3年
今の仕事: 機械学習に関する研...
3
≪著書≫「One to Oneマーケティングを超えた
戦略的Webパーソナライゼーション」
(出版社:日経BP社 発売:2002年5月)
「ASP・SaaS・ICTアウトソーシングアワード2009」
ASP・SaaS部門「委員長特別賞」受賞...
Pythonでの機械学習入門にお薦め
データサイエンティスト養成講座機械学習入門編
第2部特集2「Pythonによる機械学習入門」
http://bit.ly/yoseiml
今日の話のターゲット
• Pythonを使って機械学習をやってみたいと
思っている人
• 未経験者、あるいはやってみたけど、めんどく
さくなって挫折した人
• 初心者のハマりどころを紹介したい
– 私もつい最近まで初心者でした
Pythonを使った機械学習のやり方
• 論文を読んでゴリゴリ実装する
– 必要なスキル:論文読解能力(Pythonと関係ない
けど)、パフォーマンス・チューニング
• 既存のライブラリ(scikit-learnなど)を利用す
る
– 必要なス...
今日の話
• Pythonのパフォーマンス特性について
• Pythonの機械学習関連ライブラリを読むため
のコツ
Pythonでやってはいけないこと
s = 0
for i in range(1, 100000001):
s += i
print(s)
1から1億までの和を計算する
これはPython的な書き方ではない
改善例
s = sum(range(1, 100000001))
print(s)
1から1億を返すイテレータを用意し、その和を計算する
Numpyを使う
import numpy as np
a = np.arange(1, 100000001, dtype=np.int64)
print(a.sum())
1から1億が入った配列を用意し、その和を計算する
ベンチマーク
s = 0
for i in range(1, 100000001):
s += i
print(s)
s = sum(range(1, 100000001))
print(s)
30.21秒
12.33秒
0.38秒
impor...
問題点(?)
• Numpy版は1~100000000が入った配列をあ
らかじめ用意している
• つまりメモリが無駄
• メモリにデータを入れるコストも無駄
⇨Pythonistaはそんなこと気にしない!
ここまでのまとめ
• Pythonの数値計算系ライブラリはC言語等で書
かれているので速い
• できるだけ計算はライブラリに任せたほうがいい
• ライブラリとのやり取りを大量にするより、一度ラ
イブラリに仕事を投げたらしばらく返ってこないく
ら...
参照
Numpy/Scipyの計算速度チューニングについて
は過去に色んな所で講演しています。
SlideShare参照:
http://bit.ly/kimikazu20140913
PyCon JP 2014ソフトウェアジャパン(2016年...
Pythonで使える
機械学習・データ分析のツール
• 汎用数値計算、科学技術計算:Numpy, Scipy
• 機械学習:scikit-learn
• 自然言語処理:nltk
• データ分析:pandas
• データ可視化:matplotli...
Pythonで使える
ディープラーニングのライブラリ
• Pylearn2
• Caffe
• TensorFlow
• Chainer
これらのライブラリの使い方を習得す
るためには…
公式ドキュメントを読む(当たり前!)
ドキュメント読むときのハマりどころ
(私が初心者だった時にハマったところ)
• APIの説明はわかるんだけど、サンプルコード
が何やってるかよくわからない
• サンプルコードに出てくる数々の謎関数
例:scikit-learnのSVCクラス
Scikit-learnドキュメントより
サポートベクターマシンを使ったあやめデータの分類
http://scikit-learn.org/stable/auto_examples/svm/plot_...
サンプルコード(抜粋)
svm.SVCをインスタンス化してfitしてpredictするという流れは分かる。
でもnp.meshgridってなに?ravalってなに?np.c_ってなに?
よくある疑問:
>>> import numpy as np
>>> x=np.array([1,2,3])
>>> y=np.array([4,5,6])
>>> xx,yy=np.meshgrid(x,y)
>>> xx
array([[1, 2, 3],...
メッシュを細かく切って格子点で予測して色分け
つまり…
• Pythonの機械学習ライブラリそのものの使い
方はそんなに難しくない
• でもその説明のサンプルコードにあまり見慣
れないNumpyの機能が出てくることがしばし
ば
• 可視化の過程で出てくることが多いので、き
れいな絵を描く目...
参考: scikit-learnの使い方テンプレート
model = SomeAlogrithm(hyperparameters)
model.fit(x,y)
prediction = model.predict(z)
model = Som...
他の例: Caffeによる画像分類
http://nbviewer.jupyter.org/github/BVLC/caffe/blob/master/examples/00-classification.ipynb
ディープラーニングによる画...
np.pad?? transpose??
なんじゃこりゃあ!
>>> a=np.array([[1,2],[3,4]])
>>> a
array([[1, 2],
[3, 4]])
>>> np.pad(a,((2,3),(1,4)),"constant",constant_values=9)
array...
問題点
• Numpyでは、For文をできるだけ避けることが
できるように、内部的に繰り返し構造を持った
関数(クラス)が多くある
• そういう機能をうまく使いこなして実行効率の
よいコード描くのがPython的(Pythonic)だと
思われ...
まとめ
• For文はできるだけ避け、Numpy/Scipyの機能をうまく使っ
たほうが高速なコードを書ける
• Scikit-learnを始め機会学習のライブラリの使い方を学ぶに
はまず公式ドキュメントを読みましょう
• しかし、公式ドキュメ...
Upcoming SlideShare
Loading in …5
×

Pythonによる機械学習

12,748 views

Published on

計算機統計学会第30回大会でのプレゼン資料です。

Published in: Technology

Pythonによる機械学習

  1. 1. Pythonによる機械学習 計算機統計学会第30会大会 2016/5/20 シルバーエッグ・テクノロジー(株) 加藤公一
  2. 2. 自己紹介 加藤公一(かとうきみかず) シルバーエッグ・テクノロジー(株) チーフサイエンティスト 博士(情報理工学) (修士は数理科学) Twitter: @hamukazu 機械学習歴・Python歴ともに3年 今の仕事: 機械学習に関する研究開発 特にレコメンデーション(自動推薦)システム、自然言語処理、画像処理 など 過去の仕事: データ分析ツールの開発、3次元CADの開発、幾何計算のア ルゴリズム設計、偏微分方程式のソルバなど
  3. 3. 3 ≪著書≫「One to Oneマーケティングを超えた 戦略的Webパーソナライゼーション」 (出版社:日経BP社 発売:2002年5月) 「ASP・SaaS・ICTアウトソーシングアワード2009」 ASP・SaaS部門「委員長特別賞」受賞 第8回(2010)、第9回(2011) 「デロイト 日本テクノノロジー Fast50」受賞 リアルタイム・スマートターゲティング技術で、レコメンドサービス 『アイジェント レコメンダー』やターゲティング型広告サービス『HotView』を提供 社名 : 設立 : 役員 : 資本金 : 事業内容: 株主 : 所在地 : シルバーエッグ・テクノロジー株式会社 1998年8月 代表取締役兼CEO トーマス・フォーリー 専務取締役兼COO 西村淳子 7,800万円(2012年12月末時点) 人工知能技術をベースとした、 リアルタイムレコメンドサービスおよび ターゲティング型広告サービスの提供。 トーマス・フォーリー 伊藤忠テクノロジーベンチャーズ株式会社 カルチュア・コンビニエンス・クラブ株式会社 株式会社オプト 【大阪本社】吹田 【東京オフィス】九段下 【大阪本社】 〒564-0051 大阪府吹田市豊津9-22 大同門本部ビル5F 【東京オフィス】 〒102-0072 東京都千代田区飯田橋2-6-6 ヒューリック飯田橋ビル5F 代表トーマス・フォーリー執筆 の書籍です。 是非、ご覧ください! 日本で最初にレコメンドASPを商用化したレコメンドサービス専業企業です。 シルバーエッグテクノロジーについて
  4. 4. Pythonでの機械学習入門にお薦め データサイエンティスト養成講座機械学習入門編 第2部特集2「Pythonによる機械学習入門」 http://bit.ly/yoseiml
  5. 5. 今日の話のターゲット • Pythonを使って機械学習をやってみたいと 思っている人 • 未経験者、あるいはやってみたけど、めんどく さくなって挫折した人 • 初心者のハマりどころを紹介したい – 私もつい最近まで初心者でした
  6. 6. Pythonを使った機械学習のやり方 • 論文を読んでゴリゴリ実装する – 必要なスキル:論文読解能力(Pythonと関係ない けど)、パフォーマンス・チューニング • 既存のライブラリ(scikit-learnなど)を利用す る – 必要なスキル:ドキュメントの読解能力
  7. 7. 今日の話 • Pythonのパフォーマンス特性について • Pythonの機械学習関連ライブラリを読むため のコツ
  8. 8. Pythonでやってはいけないこと s = 0 for i in range(1, 100000001): s += i print(s) 1から1億までの和を計算する これはPython的な書き方ではない
  9. 9. 改善例 s = sum(range(1, 100000001)) print(s) 1から1億を返すイテレータを用意し、その和を計算する
  10. 10. Numpyを使う import numpy as np a = np.arange(1, 100000001, dtype=np.int64) print(a.sum()) 1から1億が入った配列を用意し、その和を計算する
  11. 11. ベンチマーク s = 0 for i in range(1, 100000001): s += i print(s) s = sum(range(1, 100000001)) print(s) 30.21秒 12.33秒 0.38秒 import numpy as np a = np.arange(1, 100000001, dtype=np.int64) print(a.sum())
  12. 12. 問題点(?) • Numpy版は1~100000000が入った配列をあ らかじめ用意している • つまりメモリが無駄 • メモリにデータを入れるコストも無駄 ⇨Pythonistaはそんなこと気にしない!
  13. 13. ここまでのまとめ • Pythonの数値計算系ライブラリはC言語等で書 かれているので速い • できるだけ計算はライブラリに任せたほうがいい • ライブラリとのやり取りを大量にするより、一度ラ イブラリに仕事を投げたらしばらく返ってこないく らいの処理がよい – Numpyには高速化のための仕組みがたくさんある (indexing, slicing, broadcasting, etc…) • そのためにメモリ量やメモリコピーコストがか かっても気にしない
  14. 14. 参照 Numpy/Scipyの計算速度チューニングについて は過去に色んな所で講演しています。 SlideShare参照: http://bit.ly/kimikazu20140913 PyCon JP 2014ソフトウェアジャパン(2016年2月) http://bit.ly/kimikazu20160204
  15. 15. Pythonで使える 機械学習・データ分析のツール • 汎用数値計算、科学技術計算:Numpy, Scipy • 機械学習:scikit-learn • 自然言語処理:nltk • データ分析:pandas • データ可視化:matplotlib • 統合分析環境:jupyter-notebook
  16. 16. Pythonで使える ディープラーニングのライブラリ • Pylearn2 • Caffe • TensorFlow • Chainer
  17. 17. これらのライブラリの使い方を習得す るためには… 公式ドキュメントを読む(当たり前!)
  18. 18. ドキュメント読むときのハマりどころ (私が初心者だった時にハマったところ) • APIの説明はわかるんだけど、サンプルコード が何やってるかよくわからない • サンプルコードに出てくる数々の謎関数
  19. 19. 例:scikit-learnのSVCクラス Scikit-learnドキュメントより サポートベクターマシンを使ったあやめデータの分類 http://scikit-learn.org/stable/auto_examples/svm/plot_custom_kernel.html
  20. 20. サンプルコード(抜粋)
  21. 21. svm.SVCをインスタンス化してfitしてpredictするという流れは分かる。 でもnp.meshgridってなに?ravalってなに?np.c_ってなに? よくある疑問:
  22. 22. >>> import numpy as np >>> x=np.array([1,2,3]) >>> y=np.array([4,5,6]) >>> xx,yy=np.meshgrid(x,y) >>> xx array([[1, 2, 3], [1, 2, 3], [1, 2, 3]]) >>> yy array([[4, 4, 4], [5, 5, 5], [6, 6, 6]]) >>> xx.ravel() array([1, 2, 3, 1, 2, 3, 1, 2, 3]) >>> yy.ravel() array([4, 4, 4, 5, 5, 5, 6, 6, 6]) >>> np.c_[xx.ravel(),yy.ravel()] array([[1, 4], [2, 4], [3, 4], [1, 5], [2, 5], [3, 5], [1, 6], [2, 6], [3, 6]]) (1, 4) (2, 4) (3, 4) (1, 5) (2, 5) (3, 5) (1, 6) (2, 6) (3, 6) x=np.array([1,2,3]) y=np.array([4,5,6]) array([[1, 2, 3], [1, 2, 3], [1, 2, 3]]) array([[4, 4, 4], [5, 5, 5], [6, 6, 6]]) meshgrid array([1, 2, 3, 1, 2, 3, 1, 2, 3]) array([4, 4, 4, 5, 5, 5, 6, 6, 6]) ravel (二次元配列を一次元に) C_ (列ベクトルだと思って横につなげる)
  23. 23. メッシュを細かく切って格子点で予測して色分け
  24. 24. つまり… • Pythonの機械学習ライブラリそのものの使い 方はそんなに難しくない • でもその説明のサンプルコードにあまり見慣 れないNumpyの機能が出てくることがしばし ば • 可視化の過程で出てくることが多いので、き れいな絵を描く目的でなければ、そのサンプ ルコードは無視してほかを見たほうがいい場 合も
  25. 25. 参考: scikit-learnの使い方テンプレート model = SomeAlogrithm(hyperparameters) model.fit(x,y) prediction = model.predict(z) model = SomeAlogrithm(hyperparameters) model.fit(x) prediction_x = model.labels_ prediction_z = model.predict(z) model = SomeAlogrithm(hyperparameters) model.fit(x,y) transformed = model.transform(z) 教師あり学習 教師なし学習 変換系 わかりやすい!直感的!
  26. 26. 他の例: Caffeによる画像分類 http://nbviewer.jupyter.org/github/BVLC/caffe/blob/master/examples/00-classification.ipynb ディープラーニングによる画像データの学習の後の、中間ノードの可視化のサンプルコード Classification: Instant Recognition with Caffe
  27. 27. np.pad?? transpose?? なんじゃこりゃあ!
  28. 28. >>> a=np.array([[1,2],[3,4]]) >>> a array([[1, 2], [3, 4]]) >>> np.pad(a,((2,3),(1,4)),"constant",constant_values=9) array([[9, 9, 9, 9, 9, 9, 9], [9, 9, 9, 9, 9, 9, 9], [9, 1, 2, 9, 9, 9, 9], [9, 3, 4, 9, 9, 9, 9], [9, 9, 9, 9, 9, 9, 9], [9, 9, 9, 9, 9, 9, 9], [9, 9, 9, 9, 9, 9, 9]]) >>> a=np.arange(8).reshape(2,2,2) >>> a array([[[0, 1], [2, 3]], [[4, 5], [6, 7]]]) >>> b=a.transpose(1,0,2) # b[i,j,k]=a[j,i,k] >>> b array([[[0, 1], [4, 5]], [[2, 3], [6, 7]]]) >>> b=a.transpose(2,1,0) # b[i,j,k]=a[k,j,i] >>> b array([[[0, 4], [2, 6]], [[1, 5], [3, 7]]]) pad: 行列の前後に数値を埋める transpose: 多次元配列(数学的にはテ ンソル)の添字の入れ替えをする Caffeのサンプルコードではpadで画像 の間に余白を入れて、trasposeでメモリ 上のアライメントを変えて可視化してい る 使い方の例
  29. 29. 問題点 • Numpyでは、For文をできるだけ避けることが できるように、内部的に繰り返し構造を持った 関数(クラス)が多くある • そういう機能をうまく使いこなして実行効率の よいコード描くのがPython的(Pythonic)だと 思われている • しかし、それは時にトリッキーなコードになり 初心者を戸惑わせる
  30. 30. まとめ • For文はできるだけ避け、Numpy/Scipyの機能をうまく使っ たほうが高速なコードを書ける • Scikit-learnを始め機会学習のライブラリの使い方を学ぶに はまず公式ドキュメントを読みましょう • しかし、公式ドキュメントのサンプルコードで、多少トリッ キーだなと思われる部分は読み飛ばしてもあまり影響は ない – そういうのはほとんどは可視化の部分なので、予測だけをした いなら影響はない • トリッキーな部分の意味を理解するのはそれはそれで楽し い – Python脳を育てるために – しかし本来の目的を忘れない範囲で

×