SlideShare a Scribd company logo
1 of 29
Download to read offline
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

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

俺 と 今年度 Civic Hack Night 運営
俺 と 今年度 Civic Hack Night 運営俺 と 今年度 Civic Hack Night 運営
俺 と 今年度 Civic Hack Night 運営Masayuki KaToH
 
PHP-ML で手書き数字認識
PHP-ML で手書き数字認識PHP-ML で手書き数字認識
PHP-ML で手書き数字認識y-uti
 
まだ技術ブログを始めてないPHPerのあなたへ。PHPカンファレンス関西2013 LT
まだ技術ブログを始めてないPHPerのあなたへ。PHPカンファレンス関西2013 LTまだ技術ブログを始めてないPHPerのあなたへ。PHPカンファレンス関西2013 LT
まだ技術ブログを始めてないPHPerのあなたへ。PHPカンファレンス関西2013 LT77web
 
自己紹介とWebサービスAPI勉強会について
自己紹介とWebサービスAPI勉強会について自己紹介とWebサービスAPI勉強会について
自己紹介とWebサービスAPI勉強会について脇村 隆
 
Laravelのeloquent だけ入れた話
Laravelのeloquent だけ入れた話Laravelのeloquent だけ入れた話
Laravelのeloquent だけ入れた話Masataka Kono
 
爆速フレームワークでREST APIを作った話
爆速フレームワークでREST APIを作った話爆速フレームワークでREST APIを作った話
爆速フレームワークでREST APIを作った話Shohei Tai
 
Phpstormちょっといい話
Phpstormちょっといい話Phpstormちょっといい話
Phpstormちょっといい話Hisateru Tanaka
 
PyPy 紹介
PyPy 紹介PyPy 紹介
PyPy 紹介shoma h
 
2009年のPHPフレームワーク
2009年のPHPフレームワーク2009年のPHPフレームワーク
2009年のPHPフレームワークTakuya Sato
 
Redmineで始めるチケット駆動開発
Redmineで始めるチケット駆動開発Redmineで始めるチケット駆動開発
Redmineで始めるチケット駆動開発Takuya Sato
 
初心者による初心者のためのRPA入門 ~Seleniumを使用したWebブラウザ操作の自動化~
初心者による初心者のためのRPA入門 ~Seleniumを使用したWebブラウザ操作の自動化~初心者による初心者のためのRPA入門 ~Seleniumを使用したWebブラウザ操作の自動化~
初心者による初心者のためのRPA入門 ~Seleniumを使用したWebブラウザ操作の自動化~ceres-inc
 
PHPerのための(不遇に負けない)Selenium入門 @ FuelPHP&CodeIgniter ユーザの集い #9
PHPerのための(不遇に負けない)Selenium入門 @ FuelPHP&CodeIgniter ユーザの集い #9PHPerのための(不遇に負けない)Selenium入門 @ FuelPHP&CodeIgniter ユーザの集い #9
PHPerのための(不遇に負けない)Selenium入門 @ FuelPHP&CodeIgniter ユーザの集い #9Hiroshi Toda
 
括弧を使わないLispプログラミング
括弧を使わないLispプログラミング括弧を使わないLispプログラミング
括弧を使わないLispプログラミングYuta Mizushima
 
PHPとJavaScriptの噺
PHPとJavaScriptの噺PHPとJavaScriptの噺
PHPとJavaScriptの噺Shogo Kawahara
 
Pythonスタートアップ勉強会201109 python入門
Pythonスタートアップ勉強会201109 python入門Pythonスタートアップ勉強会201109 python入門
Pythonスタートアップ勉強会201109 python入門Takayuki Shimizukawa
 
The tale of I and python / Python とのはなし
The tale of I and python / Python とのはなしThe tale of I and python / Python とのはなし
The tale of I and python / Python とのはなしTakanori Suzuki
 
10分でわかるPythonの開発環境
10分でわかるPythonの開発環境10分でわかるPythonの開発環境
10分でわかるPythonの開発環境Hisao Soyama
 
PHPerに覚えて欲しい日本語の重要性
PHPerに覚えて欲しい日本語の重要性PHPerに覚えて欲しい日本語の重要性
PHPerに覚えて欲しい日本語の重要性Rina Fukuda
 
フレームワークを使うべき 3 つの理由
フレームワークを使うべき 3 つの理由フレームワークを使うべき 3 つの理由
フレームワークを使うべき 3 つの理由Kenichi Mukai
 

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

俺 と 今年度 Civic Hack Night 運営
俺 と 今年度 Civic Hack Night 運営俺 と 今年度 Civic Hack Night 運営
俺 と 今年度 Civic Hack Night 運営
 
PHP-ML で手書き数字認識
PHP-ML で手書き数字認識PHP-ML で手書き数字認識
PHP-ML で手書き数字認識
 
まだ技術ブログを始めてないPHPerのあなたへ。PHPカンファレンス関西2013 LT
まだ技術ブログを始めてないPHPerのあなたへ。PHPカンファレンス関西2013 LTまだ技術ブログを始めてないPHPerのあなたへ。PHPカンファレンス関西2013 LT
まだ技術ブログを始めてないPHPerのあなたへ。PHPカンファレンス関西2013 LT
 
20090801phpstudy Sanemat
20090801phpstudy Sanemat20090801phpstudy Sanemat
20090801phpstudy Sanemat
 
自己紹介とWebサービスAPI勉強会について
自己紹介とWebサービスAPI勉強会について自己紹介とWebサービスAPI勉強会について
自己紹介とWebサービスAPI勉強会について
 
Laravelのeloquent だけ入れた話
Laravelのeloquent だけ入れた話Laravelのeloquent だけ入れた話
Laravelのeloquent だけ入れた話
 
爆速フレームワークでREST APIを作った話
爆速フレームワークでREST APIを作った話爆速フレームワークでREST APIを作った話
爆速フレームワークでREST APIを作った話
 
Phpstormちょっといい話
Phpstormちょっといい話Phpstormちょっといい話
Phpstormちょっといい話
 
PyPy 紹介
PyPy 紹介PyPy 紹介
PyPy 紹介
 
2009年のPHPフレームワーク
2009年のPHPフレームワーク2009年のPHPフレームワーク
2009年のPHPフレームワーク
 
Redmineで始めるチケット駆動開発
Redmineで始めるチケット駆動開発Redmineで始めるチケット駆動開発
Redmineで始めるチケット駆動開発
 
初心者による初心者のためのRPA入門 ~Seleniumを使用したWebブラウザ操作の自動化~
初心者による初心者のためのRPA入門 ~Seleniumを使用したWebブラウザ操作の自動化~初心者による初心者のためのRPA入門 ~Seleniumを使用したWebブラウザ操作の自動化~
初心者による初心者のためのRPA入門 ~Seleniumを使用したWebブラウザ操作の自動化~
 
PHPerのための(不遇に負けない)Selenium入門 @ FuelPHP&CodeIgniter ユーザの集い #9
PHPerのための(不遇に負けない)Selenium入門 @ FuelPHP&CodeIgniter ユーザの集い #9PHPerのための(不遇に負けない)Selenium入門 @ FuelPHP&CodeIgniter ユーザの集い #9
PHPerのための(不遇に負けない)Selenium入門 @ FuelPHP&CodeIgniter ユーザの集い #9
 
括弧を使わないLispプログラミング
括弧を使わないLispプログラミング括弧を使わないLispプログラミング
括弧を使わないLispプログラミング
 
PHPとJavaScriptの噺
PHPとJavaScriptの噺PHPとJavaScriptの噺
PHPとJavaScriptの噺
 
Pythonスタートアップ勉強会201109 python入門
Pythonスタートアップ勉強会201109 python入門Pythonスタートアップ勉強会201109 python入門
Pythonスタートアップ勉強会201109 python入門
 
The tale of I and python / Python とのはなし
The tale of I and python / Python とのはなしThe tale of I and python / Python とのはなし
The tale of I and python / Python とのはなし
 
10分でわかるPythonの開発環境
10分でわかるPythonの開発環境10分でわかるPythonの開発環境
10分でわかるPythonの開発環境
 
PHPerに覚えて欲しい日本語の重要性
PHPerに覚えて欲しい日本語の重要性PHPerに覚えて欲しい日本語の重要性
PHPerに覚えて欲しい日本語の重要性
 
フレームワークを使うべき 3 つの理由
フレームワークを使うべき 3 つの理由フレームワークを使うべき 3 つの理由
フレームワークを使うべき 3 つの理由
 

More from Ryo Shibayama

CircleCI 導入への入門
CircleCI 導入への入門CircleCI 導入への入門
CircleCI 導入への入門Ryo Shibayama
 
エンジニア採用と PHP #phpconfuk_rej
エンジニア採用と PHP #phpconfuk_rejエンジニア採用と PHP #phpconfuk_rej
エンジニア採用と PHP #phpconfuk_rejRyo Shibayama
 
Start OSS Contribution With What You Know / できることから始める OSS Contribution
Start OSS Contribution With What You Know / できることから始める OSS ContributionStart OSS Contribution With What You Know / できることから始める OSS Contribution
Start OSS Contribution With What You Know / できることから始める OSS ContributionRyo Shibayama
 
チームから気軽に始めるピアボーナス
チームから気軽に始めるピアボーナスチームから気軽に始めるピアボーナス
チームから気軽に始めるピアボーナスRyo Shibayama
 
ソフトウェアエンジニアとしてのワークアズライフ
ソフトウェアエンジニアとしてのワークアズライフソフトウェアエンジニアとしてのワークアズライフ
ソフトウェアエンジニアとしてのワークアズライフRyo Shibayama
 
Try to use chromeless on AWS Lambda
Try to use chromeless on AWS LambdaTry to use chromeless on AWS Lambda
Try to use chromeless on AWS LambdaRyo Shibayama
 
CircleCI 2.0 でビルド時間を大幅に短縮する
CircleCI 2.0 でビルド時間を大幅に短縮するCircleCI 2.0 でビルド時間を大幅に短縮する
CircleCI 2.0 でビルド時間を大幅に短縮するRyo Shibayama
 
OSS Contribution through CircleCI 2.0
OSS Contribution through CircleCI 2.0OSS Contribution through CircleCI 2.0
OSS Contribution through CircleCI 2.0Ryo Shibayama
 
Carbon と Chronos から見る OSS 運営
Carbon と Chronos から見る OSS 運営Carbon と Chronos から見る OSS 運営
Carbon と Chronos から見る OSS 運営Ryo Shibayama
 
ElasticBeanstalk で新規事業を爆速ローンチする
ElasticBeanstalk で新規事業を爆速ローンチするElasticBeanstalk で新規事業を爆速ローンチする
ElasticBeanstalk で新規事業を爆速ローンチするRyo Shibayama
 
Amazon inspector で自動セキュリティ診断
Amazon inspector で自動セキュリティ診断Amazon inspector で自動セキュリティ診断
Amazon inspector で自動セキュリティ診断Ryo Shibayama
 
WordPress on PHP7 on CentOS7 on Saraku-VPS
WordPress on PHP7 on CentOS7 on Saraku-VPSWordPress on PHP7 on CentOS7 on Saraku-VPS
WordPress on PHP7 on CentOS7 on Saraku-VPSRyo Shibayama
 
Security Advisories Checker on Travis/Circle CI
Security Advisories Checker on Travis/Circle CISecurity Advisories Checker on Travis/Circle CI
Security Advisories Checker on Travis/Circle CIRyo Shibayama
 
第87回PHP勉強会 LT 知って得するかもしれないテキスト処理コマンドのお話
第87回PHP勉強会 LT 知って得するかもしれないテキスト処理コマンドのお話第87回PHP勉強会 LT 知って得するかもしれないテキスト処理コマンドのお話
第87回PHP勉強会 LT 知って得するかもしれないテキスト処理コマンドのお話Ryo Shibayama
 

More from Ryo Shibayama (15)

倒れても進捗
倒れても進捗倒れても進捗
倒れても進捗
 
CircleCI 導入への入門
CircleCI 導入への入門CircleCI 導入への入門
CircleCI 導入への入門
 
エンジニア採用と PHP #phpconfuk_rej
エンジニア採用と PHP #phpconfuk_rejエンジニア採用と PHP #phpconfuk_rej
エンジニア採用と PHP #phpconfuk_rej
 
Start OSS Contribution With What You Know / できることから始める OSS Contribution
Start OSS Contribution With What You Know / できることから始める OSS ContributionStart OSS Contribution With What You Know / できることから始める OSS Contribution
Start OSS Contribution With What You Know / できることから始める OSS Contribution
 
チームから気軽に始めるピアボーナス
チームから気軽に始めるピアボーナスチームから気軽に始めるピアボーナス
チームから気軽に始めるピアボーナス
 
ソフトウェアエンジニアとしてのワークアズライフ
ソフトウェアエンジニアとしてのワークアズライフソフトウェアエンジニアとしてのワークアズライフ
ソフトウェアエンジニアとしてのワークアズライフ
 
Try to use chromeless on AWS Lambda
Try to use chromeless on AWS LambdaTry to use chromeless on AWS Lambda
Try to use chromeless on AWS Lambda
 
CircleCI 2.0 でビルド時間を大幅に短縮する
CircleCI 2.0 でビルド時間を大幅に短縮するCircleCI 2.0 でビルド時間を大幅に短縮する
CircleCI 2.0 でビルド時間を大幅に短縮する
 
OSS Contribution through CircleCI 2.0
OSS Contribution through CircleCI 2.0OSS Contribution through CircleCI 2.0
OSS Contribution through CircleCI 2.0
 
Carbon と Chronos から見る OSS 運営
Carbon と Chronos から見る OSS 運営Carbon と Chronos から見る OSS 運営
Carbon と Chronos から見る OSS 運営
 
ElasticBeanstalk で新規事業を爆速ローンチする
ElasticBeanstalk で新規事業を爆速ローンチするElasticBeanstalk で新規事業を爆速ローンチする
ElasticBeanstalk で新規事業を爆速ローンチする
 
Amazon inspector で自動セキュリティ診断
Amazon inspector で自動セキュリティ診断Amazon inspector で自動セキュリティ診断
Amazon inspector で自動セキュリティ診断
 
WordPress on PHP7 on CentOS7 on Saraku-VPS
WordPress on PHP7 on CentOS7 on Saraku-VPSWordPress on PHP7 on CentOS7 on Saraku-VPS
WordPress on PHP7 on CentOS7 on Saraku-VPS
 
Security Advisories Checker on Travis/Circle CI
Security Advisories Checker on Travis/Circle CISecurity Advisories Checker on Travis/Circle CI
Security Advisories Checker on Travis/Circle CI
 
第87回PHP勉強会 LT 知って得するかもしれないテキスト処理コマンドのお話
第87回PHP勉強会 LT 知って得するかもしれないテキスト処理コマンドのお話第87回PHP勉強会 LT 知って得するかもしれないテキスト処理コマンドのお話
第87回PHP勉強会 LT 知って得するかもしれないテキスト処理コマンドのお話
 

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