pythonによる機械学習
TRANSCRIPT
自己紹介
加藤公一(かとうきみかず) シルバーエッグ・テクノロジー(株) チーフサイエンティスト
博士(情報理工学) (修士は数理科学)
Twitter: @hamukazu 機械学習歴・Python歴ともに3年 今の仕事: 機械学習に関する研究開発
特にレコメンデーション(自動推薦)システム、自然言語処理、画像処理など 過去の仕事: データ分析ツールの開発、3次元CADの開発、幾何計算のアルゴリズム設計、偏微分方程式のソルバなど
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を商用化したレコメンドサービス専業企業です。
シルバーエッグテクノロジーについて
Pythonでの機械学習入門にお薦め データサイエンティスト養成講座機械学習入門編
第2部特集2「Pythonによる機械学習入門」
http://bit.ly/yoseiml
今日の話のターゲット
• Pythonを使って機械学習をやってみたいと思っている人
• 未経験者、あるいはやってみたけど、めんどくさくなって挫折した人
• 初心者のハマりどころを紹介したい
–私もつい最近まで初心者でした
Pythonを使った機械学習のやり方
• 論文を読んでゴリゴリ実装する
–必要なスキル:論文読解能力(Pythonと関係ないけど)、パフォーマンス・チューニング
• 既存のライブラリ(scikit-learnなど)を利用する
–必要なスキル:ドキュメントの読解能力
Pythonでやってはいけないこと
s = 0
for i in range(1, 100000001):
s += i
print(s)
1から1億までの和を計算する
これはPython的な書き方ではない
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秒
import numpy as np
a = np.arange(1, 100000001, dtype=np.int64)
print(a.sum())
問題点(?)
• Numpy版は1~100000000が入った配列をあらかじめ用意している
• つまりメモリが無駄
• メモリにデータを入れるコストも無駄
⇨Pythonistaはそんなこと気にしない!
ここまでのまとめ
• Pythonの数値計算系ライブラリはC言語等で書かれているので速い
• できるだけ計算はライブラリに任せたほうがいい
• ライブラリとのやり取りを大量にするより、一度ライブラリに仕事を投げたらしばらく返ってこないくらいの処理がよい – Numpyには高速化のための仕組みがたくさんある(indexing, slicing, broadcasting, etc…)
• そのためにメモリ量やメモリコピーコストがかかっても気にしない
参照
Numpy/Scipyの計算速度チューニングについては過去に色んな所で講演しています。
SlideShare参照:
http://bit.ly/kimikazu20140913
PyCon JP 2014 ソフトウェアジャパン(2016年2月)
http://bit.ly/kimikazu20160204
Pythonで使える 機械学習・データ分析のツール
• 汎用数値計算、科学技術計算:Numpy, Scipy
• 機械学習:scikit-learn
• 自然言語処理:nltk
• データ分析:pandas
• データ可視化:matplotlib
• 統合分析環境:jupyter-notebook
例:scikit-learnのSVCクラス
Scikit-learnドキュメントより
サポートベクターマシンを使ったあやめデータの分類
http://scikit-learn.org/stable/auto_examples/svm/plot_custom_kernel.html
>>> 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_ (列ベクトルだと思って横につなげる)
つまり…
• Pythonの機械学習ライブラリそのものの使い方はそんなに難しくない
• でもその説明のサンプルコードにあまり見慣れないNumpyの機能が出てくることがしばしば
• 可視化の過程で出てくることが多いので、きれいな絵を描く目的でなければ、そのサンプルコードは無視してほかを見たほうがいい場合も
参考: 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)
教師あり学習
教師なし学習
変換系
わかりやすい!直感的!
他の例: Caffeによる画像分類
http://nbviewer.jupyter.org/github/BVLC/caffe/blob/master/examples/00-classification.ipynb
ディープラーニングによる画像データの学習の後の、中間ノードの可視化のサンプルコード
Classification: Instant Recognition with Caffe
>>> 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でメモリ
上のアライメントを変えて可視化している
使い方の例
問題点
• Numpyでは、For文をできるだけ避けることが
できるように、内部的に繰り返し構造を持った関数(クラス)が多くある
• そういう機能をうまく使いこなして実行効率のよいコード描くのがPython的(Pythonic)だと思われている
• しかし、それは時にトリッキーなコードになり初心者を戸惑わせる