洋食の日記

「だ・である」調ではなく「です・ます」調で書きはじめれば良かったなと後悔してる人のブログです

Rumaleに投票によるアンサンブル法を追加した

はじめに

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のアンサンブル手法の実装でも参考にしている。