O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.
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を始め機会学習のライブラリの使い方を学ぶに
はまず公式ドキュメントを読みましょう
• しかし、公式ドキュメ...
Próximos SlideShares
Carregando em…5
×

Pythonによる機械学習

12.791 visualizações

Publicada em

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

Publicada em: Tecnologia
  • Seja o primeiro a comentar

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脳を育てるために – しかし本来の目的を忘れない範囲で

×