はじめに
これまでSVMKitでは、分類とそれに関連する手法の実装を進めていたが、回帰の実装をはじめた。手始めに線形サポートベクター回帰とk-近傍法による回帰を実装した。
svmkit | RubyGems.org | your community gem host
これにあわせて、交差検定を回帰にも対応させたり、決定係数を計算するクラスを追加したりした。
使い方
LIBSVM Dataにあるabaloneという回帰問題のデータセットを使って、
$ wget https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/regression/abalone
線形サポートベクター回帰の5交差検定を行う。
require 'svmkit' # libsvm形式のデータセットを読み込む. # 説明変数と目的変数どちらも,整数値で構成される場合は,Numo::Int32を使う実装にしているので、 # 念のためNumo::DFloatに型変換している. samples, values = SVMKit::Dataset.load_libsvm_file('abalone_scale') samples = Numo::DFloat.cast(samples) values = Numo::DFloat.cast(values) # 線形サポートベクター回帰を定義する. svr = SVMKit::LinearModel::SVR.new(reg_param: 0.005, epsilon: 0.1, max_iter: 1000, batch_size: 50, random_seed: 1) # 評価尺度には平均絶対誤差を用いる. ev = SVMKit::EvaluationMeasure::MeanAbsoluteError.new # 5-交差検定を行う. kf = SVMKit::ModelSelection::KFold.new(n_splits: 5, shuffle: true, random_seed: 1) cv = SVMKit::ModelSelection::CrossValidation.new(estimator: svr, splitter: kf, evaluator: ev) report = cv.perform(samples, values) # 結果を表示する. mae = report[:test_score].inject(:+) / kf.n_splits puts(sprintf("MAE: %.4f", mae))
これを実行すると次のような感じ。
$ ruby svmkit_svr.rb MAE: 1.9211
おわりに
Ridge回帰を検討したが、ベーシックな実装だと逆行列の計算が必要となり、その場合numo-linalgとかに依存することになるので、今回は見送った。
0.3系では回帰の実装すすめていきます。 つまらないものですが、よろしくお願い致します。