はじめに
RumaleにVariable-Random Trees(VR Trees)を実装して、バージョン1.0.0としてリリースした。本来であれば、0.30.0相当の変更なのだが、マイナーバージョンをひたすら大きくしていくのもアレだし、Rumaleも前身のSVMKitを含めると5年以上開発していることもあって、バージョン1.0.0とした。
VR Treesは、普通の決定木と、ランダムに分割を決定するランダム木を、混ぜ合わせるようなアンサンブル手法である。データやタスクによっては、Random ForestやExtremely Randomized Treesを超える性能が得られることから、実装してみた。
Liu, F. T., Ting, K. M., Yu, Y., and Zhou, Z. H., "Spectrum of Variable-Random Trees," Journal of Artificial Intelligence Research, vol. 32, pp. 355–384, 2008.
インストール
VR Treesは、Rumale::Ensembleに含まれる。VR Treesだけを試したい場合は、以下でインストールできる。
gem install rumale-ensemble
使い方
VR Trees特有の使い方はなく、fitで学習してpredictで予測する形になる。LIBSVM Dataのabaloneデータセットで回帰分析をしてみる。
wget https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/regression/abalone_scale
require 'rumale/ensemble/random_forest_regressor'
require 'rumale/ensemble/vr_trees_regressor'
require 'rumale/model_selection'
require 'rumale/dataset'
x, y = Rumale::Dataset.load_libsvm_file('abalone_scale')
x_train, x_test, y_train, y_test = Rumale::ModelSelection.train_test_split(x, y, test_size: 0.2, random_seed: 42)
reg = Rumale::Ensemble::RandomForestRegressor.new(random_seed: 42)
reg.fit(x_train, y_train)
puts('R2-Scores')
puts(format("Random Forest: %.4f", reg.score(x_test, y_test)))
reg = Rumale::Ensemble::VRTreesRegressor.new(random_seed: 42)
reg.fit(x_train, y_train)
puts(format("VR Trees: %.4f", reg.score(x_test, y_test)))
これを実行した結果は、次のようになる。わずかにVR Treesのほうがスコアが良い。
R2-Scores
Random Forest: 0.4775
VR Trees: 0.4881
単純なホールドアウト法なのと、ハイパーパラメータを調整していないのとで、コレをもってRandom ForestよりVR Treesが良いとはいえないが、試してみるのには良いんじゃないでしょうか。
おわりに
RumaleにVR Treesを追加して、バージョン1.0.0とした。このバージョンアップにともない、ZenodoのDOIを取得した。開発ガンバっていきます。
github.com