はじめに
Rubyの機械学習ライブラリであるRumaleに、投票(voting)によるアンサンブル法を利用した分類器・回帰分析を追加して、ver. 0.22.4としてリリースした。
https://rubygems.org/gems/rumale/versions/0.22.4
使い方
Rumaleはgemコマンドでインストールできる。
$ gem install rumale
投票は、複数の推定器の推定結果を、多数決によって結合し、最終的な推定結果を得る。回帰分析を例に示す。まずは、線形回帰とランダム森による回帰分析を試す。データセットにはLIBSVM Dataのabaloneを用いた。
$ wget https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/regression/abalone_scale
require 'rumale' # データセットを読み込む. 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: 1) # ランダム森を学習する. reg = Rumale::Ensemble::RandomForestRegressor.new(random_seed: 1) reg.fit(x_train, y_train) # 決定係数 (1に近づくほどよい) により回帰の精度を評価する. puts(format("R2-Score: %.4f", reg.score(x_test, y_test))) # 同様に線形回帰を用いる. reg = Rumale::LinearModel::LinearRegression.new(solver: 'lbfgs', random_seed: 1) reg.fit(x_train, y_train) puts(format("R2-Score: %.4f", reg.score(x_test, y_test)))
これを実行すると以下のようになる。
$ ruby regression.rb R2-Score: 0.5209 R2-Score: 0.5353
意外なことに線形回帰のほうがスコアが高い。この二つを投票により組み合わせる。
# 新たに投票を加える. 組み合わせる推定器はestimatorsパラメータにHashで与える. reg = Rumale::Ensemble::VotingRegressor.new( estimators: { rnd: Rumale::Ensemble::RandomForestRegressor.new(random_seed: 1), lin: Rumale::LinearModel::LinearRegression.new(solver: 'lbfgs', random_seed: 1) } ) reg.fit(x_train, y_train) puts('---') puts(format("R2-Score: %.4f", reg.score(x_test, y_test)))
これを実行すると以下のようになる。
$ ruby regression.rb R2-Score: 0.5209 R2-Score: 0.5353 --- R2-Score: 0.5664
組み合わせることで、スコアが大きく向上していることがわかる。 weightsパラメータで重みを与えることによる重み付き投票や、分類器(VotingClassifier)では、クラス確率によるソフト投票にも対応している。
Class: Rumale::Ensemble::VotingRegressor — Documentation by YARD 0.9.26
おわりに
投票による推定器の結合は、直感的にはたくさん推定器を用意すれば上手くいく気がするが、実際には、同じ問題を解いていることから推定器間に相関があり限界がある。しかし、ロジスティック回帰と決定木など、異なる仕組みの手法を組み合わせると効果が得られることがある。スタッキングと同様に、性能に伸び悩んでいる場合に試してみると良いと思う。投票(に限らずアンサンブル手法全般)については以下の書籍が詳しい。Rumaleのアンサンブル手法の実装でも参考にしている。
- 作者:Zhou,Zhi‐Hua
- 発売日: 2017/07/04
- メディア: 単行本