SlideShare a Scribd company logo
PHP‑ML を使用して
手軽に機械学習にトライしてみる
@serima / 柴山嶺
PHP カンファレンス福岡2017
はじめにおことわり
機械学習まわりのビギナーむけのお話になります
数式などを出しての、アルゴリズムの説明などはしません
中級者ラベルがついていますが、それは私の設定ミスです
Python のライブラリなどをつかってすでに機械学習を試してみている方
などには退屈な話になってしまうことをご了承ください...
気を取り直して、自己紹介
サーバサイドエンジニア
Twitter / GitHub : @serima
ウェブサービスを開発しています
ひたすらPHP と戯れる日々を過ごしてきました
かれこれ10 年弱
東京の西のほう在住
福岡には初めて来ました!
普段のcommit 状況
最近はコードを結構書いています(ほとんど会社でですが )
割合的にはこんな感じ
PHP 70 %
JavaScript 20 %
Go 5 %
Python 5 %
いままで作ってきたもの
ガラケー向けウェブアプリ(GPS を絡めた位置情報系)
ウェブソーシャルゲーム
ホテル予約アプリ
占い・キュレーションアプリ
ポータル的なサイト
何が言いたいかといいうと、いままで機械学習的な要素を何も触っ
てきていない
強いて言うなら、ソーシャルゲームのデータ分析(気合)
AI?機械学習?ディープラーニング?
ネットでひととおり話題となる記事は読んでるものの、トレンドに
ついていけていないコンプレックス
AI と機械学習とディープラーニング
機械学習とは
データ解析の結果をもとに反復パタンなどから判断や予測を行う技術
出典:NVIDIA Official Blog
ある日
GitHub Trending に php-ai/php-ml というリポジトリが現れ、ス
ターを稼いでいるのを見かける
Machine Learning library for PHP だと?
3499 stars (2017/06/10 現在)
機械学習といえばPython?
ライブラリが非常に充実している
scikit‑learn (機械学習ライブラリ)
NumPy (計算ライブラリ)
SciPy (計算ライブラリ)
Pandas (統計データ処理ライブラリ)
機械学習のライブラリの充実度合いといえばPython 一択という認識
PHP にもこういうものがついに出てきたのか!
実際に触ったことはありませんでした
なにはともあれREADME を読んでみる
やけに簡単そうに見えませんか
require_once 'vendor/autoload.php';
use PhpmlClassificationKNearestNeighbors;
$samples = [[1, 3],[1, 4],[2, 4],[3, 1],[4, 1],[4, 2]];
$labels = ['a', 'a', 'a', 'b', 'b', 'b'];
$classifier = new KNearestNeighbors();
$classifier->train($samples, $labels);
echo $classifier->predict([3, 2]);
// return 'b'
k 近傍法
教師あり学習
分類問題を解くときに使用されるアルゴリズムのひとつ
先程の例でやっていること
 [1, 3] ,  [1, 4] ,  [2, 4] に a というラベル、
 [3, 1] ,  [4, 1] ,  [4, 2] に b というラベルをつけておき
 [3, 2] というデータがあった場合、
どちらのラベルがつきますか?というのを分類する
→この場合、 b が返ってくる
サンプルデータってないの?
デモ用にすぐ使えるデータセットが3 種類あります。
Iris(あやめ) Wine(ワイン) Glass(ガラス)
種類数 3 3 6
総サンプル数 150 178 214
特徴量次元数 4 13 9
R 言語やscikit‑learn でも定番のデモデータセットらしい
Iris Dataset
サンプル例
sepal length,sepal width,petal length,petal width,class
5.1,3.5,1.4,0.2,Iris-setosa
4.9,3.0,1.4,0.2,Iris-setosa
4.7,3.2,1.3,0.2,Iris-setosa
7.0,3.2,4.7,1.4,Iris-versicolor
6.4,3.2,4.5,1.5,Iris-versicolor
6.9,3.1,4.9,1.5,Iris-versicolor
6.3,3.3,6.0,2.5,Iris-virginica
5.8,2.7,5.1,1.9,Iris-virginica
7.1,3.0,5.9,2.1,Iris-virginica
6.3,2.9,5.6,1.8,Iris-virginicacs
がく(sepal)・花弁(petal)の幅と高さを特徴量としている
Iris Dataset
(出典:https://github.com/haruosuz/books/tree/master/bbs)
デモを使ってみる
$classifier = new PhpmlClassificationNaiveBayes();
$iris_dataset = new PhpmlDatasetDemoIrisDataset();
$classifier->train(
$iris_dataset->getSamples(),
$iris_dataset->getTargets()
);
// 試しに適当な sepal, petal を入れて predict させてみる
echo $classifier->predict([1.0, 2.0, 2.1, 2.5]);
// virginica
Dataset Class
データソースを読み込みやすくするために、データセット用のヘルパー
クラスが用意されている
ArrayDataset
CsvDataset
カンマ区切りで特徴量、行の最後にラベル
FileDataset
階層構造になっているファイル群をひとつのメソッドでロード
 getSamples() 、 getTargets() などのメソッドが定義されている
なにか自分のデータを入れてみたいよね
都道府県・市区町村データを手に入れた
「この市名って○○県っぽい」を実現できないか?
たとえば、「浅口市」ってどこの県にありそうですか?
正解は
岡山県
全く知らない人には、想像もつかない
なぜなら、どこの県にあってもおかしくなさそう
人間は、経験的に市区町村と都道府県のラベリングを知ってい
る
train メソッドで特徴量を学習させる必要がある
「それっぽさ」=「尤もらしさ」がデータとして偏りが出ることが
重要
特徴量抽出の難しさ
都道府県でいうと、沖縄県の市区町村って特徴的だと思いませんか?
那覇市
宜野湾市
石垣市
浦添市
名護市
糸満市
沖縄市
豊見城市
...
それを、どうして特徴的だと思うのか?
どのような関数を通せばそれが表せるか?
例) 常用漢字で使われない文字数の割合・訓読みの一致率
特徴量抽出の難しさ
なんでもかんでも特徴量にすれば良いというものではない
有用な組み合わせを見つける必要がある
Preprocessing
データの前処理を行う
Normalization
データを0 ~ 1 の間にrescaling する
Imputer
現実のデータはそううまくすべて揃っていることがない
いわばnull みたいな値をなんらかのデータとして埋める
語句解析
Token Count Vectorizer
ある文書集合における、その単語の出現頻度に応じて重み付け
を行う
文書検索に有用
Math ライブラリ
行列計算
距離
ユークリッド距離
マンハッタン距離
チェビシェフ距離
ミンコフスキー距離
集合
統計
ピアソン分布
現時点で、実装されているアルゴリズム
相関ルールマイニング
Apiori アルゴリズム
分類
SVC(サポートベクトル分類)・k 近傍法・ナイーブベイズ
回帰
最小二乗法・サポートベクトル回帰
クラスタリング
k‑means 法・DBSCAN
ニューラルネットワーク
MLPClassifier
scikit‑learn には及ばないもののニューラルネットワークも実装されてい
る
scikit‑learn cheat sheet
データのプロットはできるの?
Python にはmatplotlib という強力なグラフ描画ライブラリがある
PHP にはなさそう
PHP からPython を外部実行しているケースが見られる
それなりの頻度でPR はマージされている模様
今後、他のアルゴリズムが実装されていくといいですね
まとめ
重い腰をあげてPython 使うほどでもない
けれども、ちょっと触ってみたい
そんなときに導入としてぜひ使ってみるとよいのでは?
(でも、やっぱり本格的にやるならPython を選んだほうが良いよ)
ライブラリを使うこと自体は実はすごく簡単
高い精度の結果を出すには、教師データとパラメータチューニングが肝要
大事なことなので二回言いま(す|した)
ご清聴ありがとうございました!

More Related Content

PHP-MLを使用して気軽に機械学習にトライしてみる