pythonによる機械学習

30
Pythonによる機械学習 計算機統計学会第30会大会 2016/5/20 シルバーエッグ・テクノロジー(株) 加藤公一

Upload: kimikazu-kato

Post on 16-Apr-2017

11.007 views

Category:

Technology


0 download

TRANSCRIPT

Pythonによる機械学習

計算機統計学会第30会大会 2016/5/20

シルバーエッグ・テクノロジー(株)

加藤公一

自己紹介

加藤公一(かとうきみかず) シルバーエッグ・テクノロジー(株) チーフサイエンティスト

博士(情報理工学) (修士は数理科学)

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のパフォーマンス特性について

• 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秒

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

Pythonで使える ディープラーニングのライブラリ

• Pylearn2

• Caffe

• TensorFlow

• Chainer

これらのライブラリの使い方を習得するためには…

公式ドキュメントを読む(当たり前!)

ドキュメント読むときのハマりどころ (私が初心者だった時にハマったところ)

• APIの説明はわかるんだけど、サンプルコードが何やってるかよくわからない

• サンプルコードに出てくる数々の謎関数

例:scikit-learnのSVCクラス

Scikit-learnドキュメントより

サポートベクターマシンを使ったあやめデータの分類

http://scikit-learn.org/stable/auto_examples/svm/plot_custom_kernel.html

サンプルコード(抜粋)

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], [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

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([[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)だと思われている

• しかし、それは時にトリッキーなコードになり初心者を戸惑わせる

まとめ

• For文はできるだけ避け、Numpy/Scipyの機能をうまく使ったほうが高速なコードを書ける

• Scikit-learnを始め機会学習のライブラリの使い方を学ぶにはまず公式ドキュメントを読みましょう

• しかし、公式ドキュメントのサンプルコードで、多少トリッキーだなと思われる部分は読み飛ばしてもあまり影響はない – そういうのはほとんどは可視化の部分なので、予測だけをしたいなら影響はない

• トリッキーな部分の意味を理解するのはそれはそれで楽しい – Python脳を育てるために – しかし本来の目的を忘れない範囲で