糞糞糞ネット弁慶

読んだ論文についてメモを書きます.趣味の話は http://repose.hatenablog.com

Rubyで決定木とか使うならai4rがいいらしいけど苦しんだので別の方法を考える

Ruby機械学習する必要が生じてai4rの導入を検討した.
http://ai4r.rubyforge.org/
だいたいこんな感じで書ける.データはUCI Machine Learning Repository: Wine Data Set

# -*- coding: utf-8 -*-
require "ai4r"

# 学習
train_data = Ai4r::Data::DataSet.new.load_csv_with_labels("./train_wine.csv")
tree_id3 = Ai4r::Classifiers::ID3.new.build(train_data)

# get_rules でstringで木の内容を返してくれる
# puts tree_id3.get_rules

# 予測
p tree_id3.eval(["14.3","1.92","2.72","20","120","2.8","3.14","0.33","1.97","6.2","1.07","2.65","1280"])

作ったモデルもMarshal.dump/loadできるので楽で良いと思っていたが,

/Users/y_benjo/.rvm/gems/ruby-1.9.2-p290/gems/ai4r-1.9/lib/ai4r/classifiers/id3.rb:283:in 
`value': undefined local variable or method `rule_not_found' for #<Ai4r::Classifiers::EvaluationNode:0x007f8aea895068> (NameError)

こんな感じでrule_not_foundなる変数を返そうとして落ちる事がある.
id3.rbを開いてみると

      def value(data)
        value = data[@index]
        return rule_not_found if !@values.include?(value)
        return nodes[@values.index(value)].value(data)
      end

宣言されてないrule_not_foundを返そうとしてる.
あとexampleとか見たら数値データもカテゴリ化しなきゃならないっぽいようなので諦めてRとか叩く.