Python のライブラリなどをつかってすでに機械学習を試してみている方などには退屈な話になってしまうことをご了承ください...
サーバサイドエンジニア Twitter / GitHub : @serima
- ウェブサービスを開発しています
- ひたすら PHP と戯れる日々を過ごしてきました
- かれこれ 10 年弱
- 東京の西のほう在住
- 福岡には初めて来ました! 👍
- PHP 70 %
- JavaScript 20 %
- Go 5 %
- Python 5 %
- ガラケー向けウェブアプリ(GPS を絡めた位置情報系)
- ウェブソーシャルゲーム
- ホテル予約アプリ
- 占い・キュレーションアプリ
- ポータル的なサイト
- 強いて言うなら、ソーシャルゲームのデータ分析(気合)
- ネットでひととおり話題となる記事は読んでるものの、トレンドについていけていないコンプレックス
機械学習とは データ解析の結果をもとに反復パタンなどから判断や予測を行う技術
ライブラリが非常に充実している
- scikit-learn (機械学習ライブラリ)
- NumPy (計算ライブラリ)
- SciPy (計算ライブラリ)
- Pandas (統計データ処理ライブラリ)
実際に触ったことはありませんでした 🙇
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'
- 教師あり学習
- 分類問題を解くときに使用されるアルゴリズムのひとつ
[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 でも定番のデモデータセットらしい
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)の幅と高さを特徴量としている
$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
データソースを読み込みやすくするために、データセット用のヘルパークラスが用意されている
- ArrayDataset
- CsvDataset
- カンマ区切りで特徴量、行の最後にラベル
- FileDataset
- 階層構造になっているファイル群をひとつのメソッドでロード
getSamples()
、getTargets()
などのメソッドが定義されている
都道府県・市区町村データを手に入れた
たとえば、「浅口市」ってどこの県にありそうですか?
- 全く知らない人には、想像もつかない
- なぜなら、どこの県にあってもおかしくなさそう
- 人間は、経験的に市区町村と都道府県のラベリングを知っている
- train メソッドで特徴量を学習させる必要がある
- 「それっぽさ」=「尤もらしさ」がデータとして偏りが出ることが重要
都道府県でいうと、沖縄県の市区町村って特徴的だと思いませんか?
那覇市
宜野湾市
石垣市
浦添市
名護市
糸満市
沖縄市
豊見城市
...
- それを、どうして特徴的だと思うのか?
- どのような関数を通せばそれが表せるか?
- 例) 常用漢字で使われない文字数の割合・訓読みの一致率
- なんでもかんでも特徴量にすれば良いというものではない
- 有用な組み合わせを見つける必要がある
- Normalization
- データを 0 〜 1 の間に rescaling する
- Imputer
- 現実のデータはそううまくすべて揃っていることがない
- いわば null みたいな値をなんらかのデータとして埋める
- Token Count Vectorizer
- ある文書集合における、その単語の出現頻度に応じて重み付けを行う
- 文書検索に有用
- 行列計算
- 距離
- ユークリッド距離
- マンハッタン距離
- チェビシェフ距離
- ミンコフスキー距離
- 集合
- 統計
- ピアソン分布
- 相関ルールマイニング
- Apiori アルゴリズム
- 分類
- SVC(サポートベクトル分類)・k 近傍法・ナイーブベイズ
- 回帰
- 最小二乗法・サポートベクトル回帰
- クラスタリング
- k-means 法・DBSCAN
- ニューラルネットワーク
- MLPClassifier
scikit-learn には及ばないもののニューラルネットワークも実装されている 😄
- Python には matplotlib という強力なグラフ描画ライブラリがある
- PHP にはなさそう 😢
- PHP から Python を外部実行しているケースが見られる
今後、他のアルゴリズムが実装されていくといいですね
重い腰をあげて Python 使うほどでもない 😇
けれども、ちょっと触ってみたい
そんなときに導入としてぜひ使ってみるとよいのでは?
(でも、やっぱり本格的にやるなら Python を選んだほうが良いよ)
ライブラリを使うこと自体は実はすごく簡単 高い精度の結果を出すには、教師データとパラメータチューニングが肝要 大事なことなので二回言いま(す|した)