Skip to content

Instantly share code, notes, and snippets.

@serima
Created June 18, 2017 07:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save serima/61f78de5db72d223570513a626a332ec to your computer and use it in GitHub Desktop.
Save serima/61f78de5db72d223570513a626a332ec to your computer and use it in GitHub Desktop.
PHPカンファレンス福岡2017での発表資料 created by Marp

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

@serima / 柴山 嶺

PHP カンファレンス福岡 2017


はじめにおことわり

機械学習まわりのビギナーむけのお話になります

数式などを出しての、アルゴリズムの説明などはしません

中級者ラベルがついていますが、それは私の設定ミスです 🙇

Python のライブラリなどをつかってすでに機械学習を試してみている方などには退屈な話になってしまうことをご了承ください...


気を取り直して、自己紹介

image

サーバサイドエンジニア Twitter / GitHub : @serima

  • ウェブサービスを開発しています
  • ひたすら PHP と戯れる日々を過ごしてきました
    • かれこれ 10 年弱
  • 東京の西のほう在住
    • 福岡には初めて来ました! 👍

普段の commit 状況

image

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

いままで作ってきたもの

  • ガラケー向けウェブアプリ(GPS を絡めた位置情報系)
  • ウェブソーシャルゲーム
  • ホテル予約アプリ
  • 占い・キュレーションアプリ
  • ポータル的なサイト

何が言いたいかといいうと、いままで機械学習的な要素を何も触ってきていない

  • 強いて言うなら、ソーシャルゲームのデータ分析(気合)

AI?機械学習?ディープラーニング?

image

  • ネットでひととおり話題となる記事は読んでるものの、トレンドについていけていないコンプレックス

AI と機械学習とディープラーニング

機械学習とは データ解析の結果をもとに反復パタンなどから判断や予測を行う技術

80%

出典:NVIDIA Official Blog

ある日

GitHub Trending に php-ai/php-ml というリポジトリが現れ、スターを稼いでいるのを見かける

Machine Learning library for PHP だと?

image

⭐ 3499 stars (2017/06/10 現在)

機械学習といえば Python?

ライブラリが非常に充実している

  • scikit-learn (機械学習ライブラリ)
  • NumPy (計算ライブラリ)
  • SciPy (計算ライブラリ)
  • Pandas (統計データ処理ライブラリ)
機械学習のライブラリの充実度合いといえば Python 一択という認識
PHP にもこういうものがついに出てきたのか!

実際に触ったことはありませんでした 🙇


なにはともあれ README を読んでみる

やけに簡単そうに見えませんか

require_once 'vendor/autoload.php';

use Phpml\Classification\KNearestNeighbors;

$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

image

50%


デモを使ってみる

$classifier = new \Phpml\Classification\NaiveBayes();
$iris_dataset = new \Phpml\Dataset\Demo\IrisDataset();

$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

80%


データのプロットはできるの?

  • Python には matplotlib という強力なグラフ描画ライブラリがある

20%

  • PHP にはなさそう 😢
    • PHP から Python を外部実行しているケースが見られる

それなりの頻度で PR はマージされている模様

40%

今後、他のアルゴリズムが実装されていくといいですね


まとめ

重い腰をあげて Python 使うほどでもない 😇 けれども、ちょっと触ってみたい

そんなときに導入としてぜひ使ってみるとよいのでは?

(でも、やっぱり本格的にやるなら Python を選んだほうが良いよ)

ライブラリを使うこと自体は実はすごく簡単 高い精度の結果を出すには、教師データとパラメータチューニングが肝要 大事なことなので二回言いま(す|した)


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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment