2018年4月2日月曜日

Ruby でサクっとナイブベイズ

概要

ナイブベイズはベイズ定理が基になっている単純な分類器です
確率分布を出した上でどれになるか確率が一番高いところを正として判断する感じです
もう既にライブラリになっているのでそれを使います
https://github.com/oasic/nbayes

環境

  • macOS 10.13.2
  • Ruby 2.4.1p111
  • nbayes 1.15.4

準備

  • bundle init
  • vim Gemfile
gem "nbayes"

サンプルコード

例えば 2 教科の点数がそれぞれ 70 点と 80 点以上なら合格とデータを学習させます

  • vim test1.rb
require 'nbayes'

nbayes = NBayes::Base.new

# >= 70 and >= 80 -> OK
nbayes.train([70, 80], 'OK')
nbayes.train([75, 90], 'OK')
nbayes.train([80, 80], 'OK')
nbayes.train([90, 100], 'OK')
nbayes.train([100, 80], 'OK')
nbayes.train([72, 82], 'OK')
nbayes.train([71, 93], 'OK')
nbayes.train([89, 80], 'OK')
nbayes.train([70, 99], 'OK')
nbayes.train([80, 95], 'OK')
nbayes.train([30, 50], 'NG')
nbayes.train([0, 80], 'NG')
nbayes.train([100, 10], 'NG')
nbayes.train([20, 60], 'NG')
nbayes.train([10, 80], 'NG')
nbayes.train([50, 70], 'NG')
nbayes.train([13, 21], 'NG')
nbayes.train([69, 55], 'NG')
nbayes.train([100, 79], 'NG')
nbayes.train([69, 98], 'NG')

test1 = [0, 100] # NG
test2 = [90, 98] # OK
test3 = [69, 79] # NG
test4 = [71, 81] # OK
test5 = [99, 2]  # NG
puts nbayes.classify(test1).max_class
puts nbayes.classify(test2).max_class
puts nbayes.classify(test3).max_class
puts nbayes.classify(test4).max_class
puts nbayes.classify(test5).max_class
  • bundle exec ruby test1.rb

結果は以下の通り

NG
OK
NG
OK
OK

なんと 2 教科目が 2 点の子が OK になってしまっています
これは良くないということで再度学習させます
以下の行を追加しましょう

nbayes.train([99, 2], 'NG')

これで再度実行するとちゃんと最後も NG になると思います

最後に

Ruby で内部ベイズをサクッと試してみました
アプリケーションエンジニアとしてはこれだけ簡単に使えるようになっているとかなり嬉しいと思います
今回のデータは if 文でも簡単に書けるので機械学習させる必要は全く無いと思います
例えば今回のように「2」教科しか次元がないデータであれば if 文で問題ないですが 1000 やら 10000 次元やらデータがある場合には有効です

またナイブベイズは分類器になり代表的な使われ方にはスパム判定があります
今回は OK or NG の 2 値で行いましたが、複数の多値判定もできます

これだけサクッと使えるのであれば何かデータができたらとりあえず投げてみるのはありかなーと思うので使い方を覚えておいて損はないかと思います
ただ、中身のアルゴリズムはさっぱりなので勉強する必要はあるかと思いますが、まずは試せる環境があるっていうのは勉強するきっかけにもなり良いことかなと思います
とりあえず試して精度が良い学習方法を深く学習していくという方法もありだと思います

参考サイト

0 件のコメント:

コメントを投稿