Slide 1

Slide 1 text

PHP‑ML を使用して 手軽に機械学習にトライしてみる @serima / 柴山 嶺 PHP カンファレンス福岡 2017

Slide 2

Slide 2 text

はじめにおことわり 機械学習まわりのビギナー むけのお話になります 数式などを出しての、 アルゴリズムの説明などはしません 中級者ラベルがついていますが、 それは私の設定ミスです Python のライブラリなどをつかってすでに機械学習を試してみている方 などには退屈な話になってしまうことをご了承ください...

Slide 3

Slide 3 text

気を取り直して、 自己紹介 サー バサイドエンジニア Twitter / GitHub : @serima ウェブサー ビスを開発しています ひたすら PHP と戯れる日々 を過ごしてきました かれこれ 10 年弱 東京の西のほう在住 福岡には初めて来ました!

Slide 4

Slide 4 text

普段の commit 状況 最近はコー ドを結構書いています( ほとんど会社でですが ) 割合的にはこんな感じ PHP 70 % JavaScript 20 % Go 5 % Python 5 %

Slide 5

Slide 5 text

いままで作ってきたもの ガラケー 向けウェブアプリ(GPS を絡めた位置情報系) ウェブソー シャルゲー ム ホテル予約アプリ 占い・ キュレー ションアプリ ポー タル的なサイト 何が言いたいかといいうと、 いままで機械学習的な要素を何も触っ てきていない 強いて言うなら、 ソー シャルゲー ムのデー タ分析( 気合)

Slide 6

Slide 6 text

AI? 機械学習? ディー プラー ニング? ネットでひととおり話題となる記事は読んでるものの、 トレンドに ついていけていないコンプレックス

Slide 7

Slide 7 text

AI と機械学習とディー プラー ニング 機械学習とは デー タ解析の結果をもとに反復パタンなどから判断や予測を行う技術 出典:NVIDIA Official Blog

Slide 8

Slide 8 text

ある日 GitHub Trending に p h p - a i / p h p - m l というリポジトリが現れ、 ス ター を稼いでいるのを見かける Machine Learning library for PHP だと? 3499 stars (2017/06/10 現在)

Slide 9

Slide 9 text

機械学習といえば Python? ライブラリが非常に充実している scikit‑learn ( 機械学習ライブラリ) NumPy ( 計算ライブラリ) SciPy ( 計算ライブラリ) Pandas ( 統計デー タ処理ライブラリ) 機械学習のライブラリの充実度合いといえば Python 一択という認識 PHP にもこういうものがついに出てきたのか! 実際に触ったことはありませんでした

Slide 10

Slide 10 text

なにはともあれ README を読んでみる やけに簡単そうに見えませんか r e q u i r e _ o n c e ' v e n d o r / a u t o l o a d . p h p ' ; u s e P h p m l \ C l a s s i f i c a t i o n \ K N e a r e s t N e i g h b o r s ; $ s a m p l e s = [ [ 1 , 3 ] , [ 1 , 4 ] , [ 2 , 4 ] , [ 3 , 1 ] , [ 4 , 1 ] , [ 4 , 2 ] ] ; $ l a b e l s = [ ' a ' , ' a ' , ' a ' , ' b ' , ' b ' , ' b ' ] ; $ c l a s s i f i e r = n e w K N e a r e s t N e i g h b o r s ( ) ; $ c l a s s i f i e r - > t r a i n ( $ s a m p l e s , $ l a b e l s ) ; e c h o $ c l a s s i f i e r - > p r e d i c t ( [ 3 , 2 ] ) ; / / r e t u r n ' b '

Slide 11

Slide 11 text

k 近傍法 教師あり学習 分類問題を解くときに使用されるアルゴリズムのひとつ 先程の例でやっていること [ 1 , 3 ] , [ 1 , 4 ] , [ 2 , 4 ] に a というラベル、 [ 3 , 1 ] , [ 4 , 1 ] , [ 4 , 2 ] に b というラベルをつけておき [ 3 , 2 ] というデー タがあった場合、 どちらのラベルがつきますか? というのを分類する → この場合、 b が返ってくる

Slide 12

Slide 12 text

サンプルデー タってないの? デモ用にすぐ使えるデー タセットが 3 種類あります。 Iris( あやめ) Wine( ワイン) Glass( ガラス) 種類数 3 3 6 総サンプル数 150 178 214 特徴量次元数 4 13 9 R 言語や scikit‑learn でも定番のデモデー タセットらしい

Slide 13

Slide 13 text

Iris Dataset サンプル例 s e p a l l e n g t h , s e p a l w i d t h , p e t a l l e n g t h , p e t a l w i d t h , c l a s s 5 . 1 , 3 . 5 , 1 . 4 , 0 . 2 , I r i s - s e t o s a 4 . 9 , 3 . 0 , 1 . 4 , 0 . 2 , I r i s - s e t o s a 4 . 7 , 3 . 2 , 1 . 3 , 0 . 2 , I r i s - s e t o s a 7 . 0 , 3 . 2 , 4 . 7 , 1 . 4 , I r i s - v e r s i c o l o r 6 . 4 , 3 . 2 , 4 . 5 , 1 . 5 , I r i s - v e r s i c o l o r 6 . 9 , 3 . 1 , 4 . 9 , 1 . 5 , I r i s - v e r s i c o l o r 6 . 3 , 3 . 3 , 6 . 0 , 2 . 5 , I r i s - v i r g i n i c a 5 . 8 , 2 . 7 , 5 . 1 , 1 . 9 , I r i s - v i r g i n i c a 7 . 1 , 3 . 0 , 5 . 9 , 2 . 1 , I r i s - v i r g i n i c a 6 . 3 , 2 . 9 , 5 . 6 , 1 . 8 , I r i s - v i r g i n i c a c s がく(sepal)・ 花弁(petal) の幅と高さを特徴量としている

Slide 14

Slide 14 text

Iris Dataset ( 出典:https://github.com/haruosuz/books/tree/master/bbs)

Slide 15

Slide 15 text

デモを使ってみる $ c l a s s i f i e r = n e w \ P h p m l \ C l a s s i f i c a t i o n \ N a i v e B a y e s ( ) ; $ i r i s _ d a t a s e t = n e w \ P h p m l \ D a t a s e t \ D e m o \ I r i s D a t a s e t ( ) ; $ c l a s s i f i e r - > t r a i n ( $ i r i s _ d a t a s e t - > g e t S a m p l e s ( ) , $ i r i s _ d a t a s e t - > g e t T a r g e t s ( ) ) ; / / 試しに適当な s e p a l , p e t a l を入れて p r e d i c t させてみる e c h o $ c l a s s i f i e r - > p r e d i c t ( [ 1 . 0 , 2 . 0 , 2 . 1 , 2 . 5 ] ) ; / / v i r g i n i c a

Slide 16

Slide 16 text

Dataset Class デー タソー スを読み込みやすくするために、 デー タセット用のヘルパー クラスが用意されている ArrayDataset CsvDataset カンマ区切りで特徴量、 行の最後にラベル FileDataset 階層構造になっているファイル群をひとつのメソッドでロー ド g e t S a m p l e s ( ) 、 g e t T a r g e t s ( ) などのメソッドが定義されている

Slide 17

Slide 17 text

なにか自分のデー タを入れてみたいよね 都道府県・ 市区町村デー タを手に入れた 「 この市名って○○ 県っぽい」 を実現できないか? たとえば、「 浅口市」 ってどこの県にありそうですか?

Slide 18

Slide 18 text

正解は 岡山県 全く知らない人には、 想像もつかない なぜなら、 どこの県にあってもおかしくなさそう 人間は、 経験的に市区町村と都道府県のラベリングを知ってい る train メソッドで特徴量を学習させる必要がある 「 それっぽさ」=「 尤もらしさ」 がデー タとして偏りが出ることが 重要

Slide 19

Slide 19 text

特徴量抽出の難しさ 都道府県でいうと、 沖縄県の市区町村って特徴的だと思いませんか? 那覇市 宜野湾市 石垣市 浦添市 名護市 糸満市 沖縄市 豊見城市 . . . それを、 どうして特徴的だと思うのか? どのような関数を通せばそれが表せるか? 例) 常用漢字で使われない文字数の割合・ 訓読みの一致率

Slide 20

Slide 20 text

特徴量抽出の難しさ なんでもかんでも特徴量にすれば良いというものではない 有用な組み合わせを見つける必要がある

Slide 21

Slide 21 text

Preprocessing デー タの前処理を行う Normalization デー タを 0 ~ 1 の間に rescaling する Imputer 現実のデー タはそううまくすべて揃っていることがない いわば null みたいな値をなんらかのデー タとして埋める

Slide 22

Slide 22 text

語句解析 Token Count Vectorizer ある文書集合における、 その単語の出現頻度に応じて重み付け を行う 文書検索に有用

Slide 23

Slide 23 text

Math ライブラリ 行列計算 距離 ユー クリッド距離 マンハッタン距離 チェビシェフ距離 ミンコフスキー 距離 集合 統計 ピアソン分布

Slide 24

Slide 24 text

現時点で、 実装されているアルゴリズム 相関ルー ルマイニング Apiori アルゴリズム 分類 SVC( サポー トベクトル分類)・k 近傍法・ ナイー ブベイズ 回帰 最小二乗法・ サポー トベクトル回帰 クラスタリング k‑means 法・DBSCAN ニュー ラルネットワー ク MLPClassifier scikit‑learn には及ばないもののニュー ラルネットワー クも実装されてい る

Slide 25

Slide 25 text

scikit‑learn cheat sheet

Slide 26

Slide 26 text

デー タのプロットはできるの? Python には matplotlib という強力なグラフ描画ライブラリがある PHP にはなさそう PHP から Python を外部実行しているケー スが見られる

Slide 27

Slide 27 text

それなりの頻度で PR はマー ジされている模様 今後、 他のアルゴリズムが実装されていくといいですね

Slide 28

Slide 28 text

まとめ 重い腰をあげて Python 使うほどでもない けれども、 ちょっと触ってみたい そんなときに導入としてぜひ使ってみるとよいのでは? ( でも、 やっぱり本格的にやるなら Python を選んだほうが良いよ) ライブラリを使うこと自体は実はすごく簡単 高い精度の結果を出すには、 教師デー タとパラメー タチュー ニングが肝要 大事なことなので二回言いま( す| した)

Slide 29

Slide 29 text

ご清聴ありがとうございました!