rumale 0.16.1 → 0.17.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +2 -2
- data/CHANGELOG.md +22 -0
- data/README.md +11 -7
- data/lib/rumale/linear_model/base_linear_model.rb +7 -0
- data/lib/rumale/linear_model/base_sgd.rb +55 -0
- data/lib/rumale/linear_model/elastic_net.rb +2 -2
- data/lib/rumale/linear_model/lasso.rb +32 -61
- data/lib/rumale/linear_model/linear_regression.rb +54 -43
- data/lib/rumale/linear_model/logistic_regression.rb +43 -39
- data/lib/rumale/linear_model/ridge.rb +51 -39
- data/lib/rumale/linear_model/svc.rb +45 -48
- data/lib/rumale/linear_model/svr.rb +44 -47
- data/lib/rumale/polynomial_model/base_factorization_machine.rb +20 -17
- data/lib/rumale/polynomial_model/factorization_machine_classifier.rb +4 -3
- data/lib/rumale/polynomial_model/factorization_machine_regressor.rb +4 -3
- data/lib/rumale/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d1071dfdccfc177ea5902e5e1b09fce084fd4b6ce403fae6797e6b93c3f826ad
|
4
|
+
data.tar.gz: 30768881f5c826f59dbcca0b17a1192dbdc17ca835c8bcc626e874391131bf92
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e748eedf78b040a7dbe1a1b744f87f1c1e9c3ae751417711eccd5f69dca68335f1a206b9258503da70a8486c3d8588d61ae78081ebdecc6a8ee40f85383a319f
|
7
|
+
data.tar.gz: 2abae603660179e05f8341ab5351fb9e028549674bb13901e4cae4dfd13c99995de0de3c63f8c75182acd155a1d2171b02e4db74fcaa08c1108a1a0e92ad3eee
|
data/.rubocop.yml
CHANGED
@@ -15,7 +15,7 @@ AllCops:
|
|
15
15
|
Style/Documentation:
|
16
16
|
Enabled: false
|
17
17
|
|
18
|
-
|
18
|
+
Layout/LineLength:
|
19
19
|
Max: 145
|
20
20
|
IgnoredPatterns: ['(\A|\s)#']
|
21
21
|
|
@@ -43,7 +43,7 @@ Metrics/BlockLength:
|
|
43
43
|
- 'spec/**/*'
|
44
44
|
|
45
45
|
Metrics/ParameterLists:
|
46
|
-
Max:
|
46
|
+
Max: 15
|
47
47
|
|
48
48
|
Security/MarshalLoad:
|
49
49
|
Enabled: false
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,25 @@
|
|
1
|
+
# 0.17.0
|
2
|
+
## Breaking changes
|
3
|
+
- Fix all linear model estimators to use the new abstract class ([BaseSGD](https://yoshoku.github.io/rumale/doc/Rumale/LinearModel/BaseSGD.html)) introduced in version 0.16.1.
|
4
|
+
The major differences from the old abstract class are that
|
5
|
+
the optimizer of LinearModel estimators is fixed to mini-batch SGD with momentum term,
|
6
|
+
the max_iter parameter indicates the number of epochs instead of the maximum number of iterations,
|
7
|
+
the fit_bias parameter is true by default, and elastic-net style regularization can be used.
|
8
|
+
Note that there are additions and changes to hyperparameters.
|
9
|
+
Existing trained linear models may need to re-train the model and adjust the hyperparameters.
|
10
|
+
- [LogisticRegression](https://yoshoku.github.io/rumale/doc/Rumale/LinearModel/LogisticRegression.html)
|
11
|
+
- [SVC](https://yoshoku.github.io/rumale/doc/Rumale/LinearModel/SVC.html)
|
12
|
+
- [LinearRegression](https://yoshoku.github.io/rumale/doc/Rumale/LinearModel/LinearRegression.html)
|
13
|
+
- [Rdige](https://yoshoku.github.io/rumale/doc/Rumale/LinearModel/Ridge.html)
|
14
|
+
- [Lasso](https://yoshoku.github.io/rumale/doc/Rumale/LinearModel/Lasso.html)
|
15
|
+
- [SVR](https://yoshoku.github.io/rumale/doc/Rumale/LinearModel/SVR.html)
|
16
|
+
- Change the default value of solver parameter on LinearRegression and Ridge to 'auto'.
|
17
|
+
If Numo::Linalg is loaded, 'svd' is selected for the solver, otherwise 'sgd' is selected.
|
18
|
+
- The meaning of the `max_iter` parameter of the factorization machine estimators
|
19
|
+
has been changed from the maximum number of iterations to the number of epochs.
|
20
|
+
- [FactorizationMachineClassifier](https://yoshoku.github.io/rumale/doc/Rumale/PolynomialModel/FactorizationMachineClassifier.html)
|
21
|
+
- [FactorizationMachineRegressor](https://yoshoku.github.io/rumale/doc/Rumale/PolynomialModel/FactorizationMachineRegressor.html)
|
22
|
+
|
1
23
|
# 0.16.1
|
2
24
|
- Add regressor class for [ElasticNet](https://yoshoku.github.io/rumale/doc/Rumale/LinearModel/ElasticNet.html).
|
3
25
|
- Add new linear model abstract class.
|
data/README.md
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
[![Coverage Status](https://coveralls.io/repos/github/yoshoku/rumale/badge.svg?branch=master)](https://coveralls.io/github/yoshoku/rumale?branch=master)
|
7
7
|
[![Gem Version](https://badge.fury.io/rb/rumale.svg)](https://badge.fury.io/rb/rumale)
|
8
8
|
[![BSD 2-Clause License](https://img.shields.io/badge/License-BSD%202--Clause-orange.svg)](https://github.com/yoshoku/rumale/blob/master/LICENSE.txt)
|
9
|
-
[![Documentation](
|
9
|
+
[![Documentation](https://img.shields.io/badge/api-reference-blue.svg)](https://yoshoku.github.io/rumale/doc/)
|
10
10
|
|
11
11
|
Rumale (**Ru**by **ma**chine **le**arning) is a machine learning library in Ruby.
|
12
12
|
Rumale provides machine learning algorithms with interfaces similar to Scikit-Learn in Python.
|
@@ -37,6 +37,10 @@ Or install it yourself as:
|
|
37
37
|
|
38
38
|
$ gem install rumale
|
39
39
|
|
40
|
+
## Documentation
|
41
|
+
|
42
|
+
- [Rumale API Documentation](https://yoshoku.github.io/rumale/doc/)
|
43
|
+
|
40
44
|
## Usage
|
41
45
|
|
42
46
|
### Example 1. XOR data
|
@@ -95,7 +99,7 @@ transformer = Rumale::KernelApproximation::RBF.new(gamma: 0.0001, n_components:
|
|
95
99
|
transformed = transformer.fit_transform(samples)
|
96
100
|
|
97
101
|
# Train linear SVM classifier.
|
98
|
-
classifier = Rumale::LinearModel::SVC.new(reg_param: 0.0001,
|
102
|
+
classifier = Rumale::LinearModel::SVC.new(reg_param: 0.0001, random_seed: 1)
|
99
103
|
classifier.fit(transformed, labels)
|
100
104
|
|
101
105
|
# Save the model.
|
@@ -132,7 +136,7 @@ Execution of the above scripts result in the following.
|
|
132
136
|
```bash
|
133
137
|
$ ruby train.rb
|
134
138
|
$ ruby test.rb
|
135
|
-
Accuracy: 98.
|
139
|
+
Accuracy: 98.7%
|
136
140
|
```
|
137
141
|
|
138
142
|
### Example 3. Cross-validation
|
@@ -144,7 +148,7 @@ require 'rumale'
|
|
144
148
|
samples, labels = Rumale::Dataset.load_libsvm_file('pendigits')
|
145
149
|
|
146
150
|
# Define the estimator to be evaluated.
|
147
|
-
lr = Rumale::LinearModel::LogisticRegression.new(reg_param: 0.0001, random_seed: 1)
|
151
|
+
lr = Rumale::LinearModel::LogisticRegression.new(learning_rate: 0.00001, reg_param: 0.0001, random_seed: 1)
|
148
152
|
|
149
153
|
# Define the evaluation measure, splitting strategy, and cross validation.
|
150
154
|
ev = Rumale::EvaluationMeasure::LogLoss.new
|
@@ -163,7 +167,7 @@ Execution of the above scripts result in the following.
|
|
163
167
|
|
164
168
|
```bash
|
165
169
|
$ ruby cross_validation.rb
|
166
|
-
5-CV mean log-loss: 0.
|
170
|
+
5-CV mean log-loss: 0.355
|
167
171
|
```
|
168
172
|
|
169
173
|
### Example 4. Pipeline
|
@@ -176,7 +180,7 @@ samples, labels = Rumale::Dataset.load_libsvm_file('pendigits')
|
|
176
180
|
|
177
181
|
# Construct pipeline with kernel approximation and SVC.
|
178
182
|
rbf = Rumale::KernelApproximation::RBF.new(gamma: 0.0001, n_components: 800, random_seed: 1)
|
179
|
-
svc = Rumale::LinearModel::SVC.new(reg_param: 0.0001,
|
183
|
+
svc = Rumale::LinearModel::SVC.new(reg_param: 0.0001, random_seed: 1)
|
180
184
|
pipeline = Rumale::Pipeline::Pipeline.new(steps: { trns: rbf, clsf: svc })
|
181
185
|
|
182
186
|
# Define the splitting strategy and cross validation.
|
@@ -195,7 +199,7 @@ Execution of the above scripts result in the following.
|
|
195
199
|
|
196
200
|
```bash
|
197
201
|
$ ruby pipeline.rb
|
198
|
-
5-CV mean accuracy: 99.
|
202
|
+
5-CV mean accuracy: 99.6 %
|
199
203
|
```
|
200
204
|
|
201
205
|
## Speeding up
|
@@ -5,10 +5,15 @@ require 'rumale/optimizer/nadam'
|
|
5
5
|
|
6
6
|
module Rumale
|
7
7
|
module LinearModel
|
8
|
+
# @note
|
9
|
+
# In version 0.17.0, a new linear model abstract class called BaseSGD is introduced.
|
10
|
+
# BaseLienarModel is deprecated and will be removed in the future.
|
11
|
+
#
|
8
12
|
# BaseLinearModel is an abstract class for implementation of linear estimator
|
9
13
|
# with mini-batch stochastic gradient descent optimization.
|
10
14
|
# This class is used for internal process.
|
11
15
|
class BaseLinearModel
|
16
|
+
# :nocov:
|
12
17
|
include Base::BaseEstimator
|
13
18
|
|
14
19
|
# Initialize a linear estimator.
|
@@ -26,6 +31,7 @@ module Rumale
|
|
26
31
|
# @param random_seed [Integer] The seed value using to initialize the random generator.
|
27
32
|
def initialize(reg_param: 1.0, fit_bias: false, bias_scale: 1.0,
|
28
33
|
max_iter: 1000, batch_size: 10, optimizer: nil, n_jobs: nil, random_seed: nil)
|
34
|
+
warn 'warning: BaseLinearModel is deprecated. Use BaseSGD instead.'
|
29
35
|
@params = {}
|
30
36
|
@params[:reg_param] = reg_param
|
31
37
|
@params[:fit_bias] = fit_bias
|
@@ -88,6 +94,7 @@ module Rumale
|
|
88
94
|
[weight, 0.0]
|
89
95
|
end
|
90
96
|
end
|
97
|
+
# :nocov:
|
91
98
|
end
|
92
99
|
end
|
93
100
|
end
|
@@ -99,6 +99,61 @@ module Rumale
|
|
99
99
|
2.fdiv(y.shape[0]) * (out - y)
|
100
100
|
end
|
101
101
|
end
|
102
|
+
|
103
|
+
# @!visibility private
|
104
|
+
# LogLoss is a class that calculates logistic loss for logistic regression.
|
105
|
+
class LogLoss
|
106
|
+
# @!visibility private
|
107
|
+
def loss(out, y)
|
108
|
+
Numo::NMath.log(1 + Numo::NMath.exp(-y * out)).sum.fdiv(y.shape[0])
|
109
|
+
end
|
110
|
+
|
111
|
+
# @!visibility private
|
112
|
+
def dloss(out, y)
|
113
|
+
y / (1 + Numo::NMath.exp(-y * out)) - y
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
# @!visibility private
|
118
|
+
# HingeLoss is a class that calculates hinge loss for support vector classifier.
|
119
|
+
class HingeLoss
|
120
|
+
# @!visibility private
|
121
|
+
def loss(out, y)
|
122
|
+
out.class.maximum(0.0, 1 - y * out).sum.fdiv(y.shape[0])
|
123
|
+
end
|
124
|
+
|
125
|
+
# @!visibility private
|
126
|
+
def dloss(out, y)
|
127
|
+
tids = (y * out).lt(1)
|
128
|
+
d = Numo::DFloat.zeros(y.shape[0])
|
129
|
+
d[tids] = -y[tids] if tids.count.positive?
|
130
|
+
d
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
# @!visibility private
|
135
|
+
# EpsilonInsensitive is a class that calculates epsilon insensitive for support vector regressor.
|
136
|
+
class EpsilonInsensitive
|
137
|
+
# @!visibility private
|
138
|
+
def initialize(epsilon: 0.1)
|
139
|
+
@epsilon = epsilon
|
140
|
+
end
|
141
|
+
|
142
|
+
# @!visibility private
|
143
|
+
def loss(out, y)
|
144
|
+
out.class.maximum(0.0, (y - out).abs - @epsilon).sum.fdiv(y.shape[0])
|
145
|
+
end
|
146
|
+
|
147
|
+
# @!visibility private
|
148
|
+
def dloss(out, y)
|
149
|
+
d = Numo::DFloat.zeros(y.shape[0])
|
150
|
+
tids = (out - y).gt(@epsilon)
|
151
|
+
d[tids] = 1 if tids.count.positive?
|
152
|
+
tids = (y - out).gt(@epsilon)
|
153
|
+
d[tids] = -1 if tids.count.positive?
|
154
|
+
d
|
155
|
+
end
|
156
|
+
end
|
102
157
|
end
|
103
158
|
|
104
159
|
# BaseSGD is an abstract class for implementation of linear model with mini-batch stochastic gradient descent (SGD) optimization.
|
@@ -59,13 +59,13 @@ module Rumale
|
|
59
59
|
# @param random_seed [Integer] The seed value using to initialize the random generator.
|
60
60
|
def initialize(learning_rate: 0.01, decay: nil, momentum: 0.9,
|
61
61
|
reg_param: 1.0, l1_ratio: 0.5, fit_bias: true, bias_scale: 1.0,
|
62
|
-
max_iter:
|
62
|
+
max_iter: 200, batch_size: 50, tol: 1e-4,
|
63
63
|
n_jobs: nil, verbose: false, random_seed: nil)
|
64
64
|
check_params_numeric(learning_rate: learning_rate, momentum: momentum,
|
65
65
|
reg_param: reg_param, l1_ratio: l1_ratio, bias_scale: bias_scale,
|
66
66
|
max_iter: max_iter, batch_size: batch_size, tol: tol)
|
67
67
|
check_params_boolean(fit_bias: fit_bias, verbose: verbose)
|
68
|
-
check_params_numeric_or_nil(decay:
|
68
|
+
check_params_numeric_or_nil(decay: decay, n_jobs: n_jobs, random_seed: random_seed)
|
69
69
|
check_params_positive(learning_rate: learning_rate, reg_param: reg_param, max_iter: max_iter, batch_size: batch_size)
|
70
70
|
super()
|
71
71
|
@params.merge!(method(:initialize).parameters.map { |_t, arg| [arg, binding.local_variable_get(arg)] }.to_h)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'rumale/linear_model/
|
3
|
+
require 'rumale/linear_model/base_sgd'
|
4
4
|
require 'rumale/base/regressor'
|
5
5
|
|
6
6
|
module Rumale
|
@@ -10,14 +10,15 @@ module Rumale
|
|
10
10
|
#
|
11
11
|
# @example
|
12
12
|
# estimator =
|
13
|
-
# Rumale::LinearModel::Lasso.new(reg_param: 0.1, max_iter:
|
13
|
+
# Rumale::LinearModel::Lasso.new(reg_param: 0.1, max_iter: 500, batch_size: 20, random_seed: 1)
|
14
14
|
# estimator.fit(training_samples, traininig_values)
|
15
15
|
# results = estimator.predict(testing_samples)
|
16
16
|
#
|
17
17
|
# *Reference*
|
18
18
|
# - S. Shalev-Shwartz and Y. Singer, "Pegasos: Primal Estimated sub-GrAdient SOlver for SVM," Proc. ICML'07, pp. 807--814, 2007.
|
19
|
+
# - Y. Tsuruoka, J. Tsujii, and S. Ananiadou, "Stochastic Gradient Descent Training for L1-regularized Log-linear Models with Cumulative Penalty," Proc. ACL'09, pp. 477--485, 2009.
|
19
20
|
# - L. Bottou, "Large-Scale Machine Learning with Stochastic Gradient Descent," Proc. COMPSTAT'10, pp. 177--186, 2010.
|
20
|
-
class Lasso <
|
21
|
+
class Lasso < BaseSGD
|
21
22
|
include Base::Regressor
|
22
23
|
|
23
24
|
# Return the weight vector.
|
@@ -34,25 +35,43 @@ module Rumale
|
|
34
35
|
|
35
36
|
# Create a new Lasso regressor.
|
36
37
|
#
|
38
|
+
# @param learning_rate [Float] The initial value of learning rate.
|
39
|
+
# The learning rate decreases as the iteration proceeds according to the equation: learning_rate / (1 + decay * t).
|
40
|
+
# @param decay [Float] The smoothing parameter for decreasing learning rate as the iteration proceeds.
|
41
|
+
# If nil is given, the decay sets to 'reg_param * learning_rate'.
|
42
|
+
# @param momentum [Float] The momentum factor.
|
37
43
|
# @param reg_param [Float] The regularization parameter.
|
38
44
|
# @param fit_bias [Boolean] The flag indicating whether to fit the bias term.
|
39
45
|
# @param bias_scale [Float] The scale of the bias term.
|
40
|
-
# @param max_iter [Integer] The maximum number of
|
46
|
+
# @param max_iter [Integer] The maximum number of epochs that indicates
|
47
|
+
# how many times the whole data is given to the training process.
|
41
48
|
# @param batch_size [Integer] The size of the mini batches.
|
42
|
-
# @param
|
43
|
-
# If nil is given, Nadam is used.
|
49
|
+
# @param tol [Float] The tolerance of loss for terminating optimization.
|
44
50
|
# @param n_jobs [Integer] The number of jobs for running the fit method in parallel.
|
45
51
|
# If nil is given, the method does not execute in parallel.
|
46
52
|
# If zero or less is given, it becomes equal to the number of processors.
|
47
53
|
# This parameter is ignored if the Parallel gem is not loaded.
|
54
|
+
# @param verbose [Boolean] The flag indicating whether to output loss during iteration.
|
48
55
|
# @param random_seed [Integer] The seed value using to initialize the random generator.
|
49
|
-
def initialize(
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
+
def initialize(learning_rate: 0.01, decay: nil, momentum: 0.9,
|
57
|
+
reg_param: 1.0, fit_bias: true, bias_scale: 1.0,
|
58
|
+
max_iter: 200, batch_size: 50, tol: 1e-4,
|
59
|
+
n_jobs: nil, verbose: false, random_seed: nil)
|
60
|
+
check_params_numeric(learning_rate: learning_rate, momentum: momentum,
|
61
|
+
reg_param: reg_param, bias_scale: bias_scale,
|
62
|
+
max_iter: max_iter, batch_size: batch_size, tol: tol)
|
63
|
+
check_params_boolean(fit_bias: fit_bias, verbose: verbose)
|
64
|
+
check_params_numeric_or_nil(decay: decay, n_jobs: n_jobs, random_seed: random_seed)
|
65
|
+
check_params_positive(learning_rate: learning_rate, reg_param: reg_param, max_iter: max_iter, batch_size: batch_size)
|
66
|
+
super()
|
67
|
+
@params.merge!(method(:initialize).parameters.map { |_t, arg| [arg, binding.local_variable_get(arg)] }.to_h)
|
68
|
+
@params[:decay] ||= @params[:reg_param] * @params[:learning_rate]
|
69
|
+
@params[:random_seed] ||= srand
|
70
|
+
@rng = Random.new(@params[:random_seed])
|
71
|
+
@penalty_type = L1_PENALTY
|
72
|
+
@loss_func = LinearModel::Loss::MeanSquaredError.new
|
73
|
+
@weight_vec = nil
|
74
|
+
@bias_term = nil
|
56
75
|
end
|
57
76
|
|
58
77
|
# Fit the model with given training data.
|
@@ -91,54 +110,6 @@ module Rumale
|
|
91
110
|
x = check_convert_sample_array(x)
|
92
111
|
x.dot(@weight_vec.transpose) + @bias_term
|
93
112
|
end
|
94
|
-
|
95
|
-
# Dump marshal data.
|
96
|
-
# @return [Hash] The marshal data about Lasso.
|
97
|
-
def marshal_dump
|
98
|
-
{ params: @params,
|
99
|
-
weight_vec: @weight_vec,
|
100
|
-
bias_term: @bias_term,
|
101
|
-
rng: @rng }
|
102
|
-
end
|
103
|
-
|
104
|
-
# Load marshal data.
|
105
|
-
# @return [nil]
|
106
|
-
def marshal_load(obj)
|
107
|
-
@params = obj[:params]
|
108
|
-
@weight_vec = obj[:weight_vec]
|
109
|
-
@bias_term = obj[:bias_term]
|
110
|
-
@rng = obj[:rng]
|
111
|
-
nil
|
112
|
-
end
|
113
|
-
|
114
|
-
private
|
115
|
-
|
116
|
-
def partial_fit(x, y)
|
117
|
-
n_features = @params[:fit_bias] ? x.shape[1] + 1 : x.shape[1]
|
118
|
-
@left_weight = Numo::DFloat.zeros(n_features)
|
119
|
-
@right_weight = Numo::DFloat.zeros(n_features)
|
120
|
-
@left_optimizer = @params[:optimizer].dup
|
121
|
-
@right_optimizer = @params[:optimizer].dup
|
122
|
-
super
|
123
|
-
end
|
124
|
-
|
125
|
-
def calc_loss_gradient(x, y, weight)
|
126
|
-
2.0 * (x.dot(weight) - y)
|
127
|
-
end
|
128
|
-
|
129
|
-
def calc_new_weight(_optimizer, x, _weight, loss_gradient)
|
130
|
-
@left_weight = round_weight(@left_optimizer.call(@left_weight, calc_weight_gradient(loss_gradient, x)))
|
131
|
-
@right_weight = round_weight(@right_optimizer.call(@right_weight, calc_weight_gradient(-loss_gradient, x)))
|
132
|
-
@left_weight - @right_weight
|
133
|
-
end
|
134
|
-
|
135
|
-
def calc_weight_gradient(loss_gradient, data)
|
136
|
-
((@params[:reg_param] + loss_gradient).expand_dims(1) * data).mean(0)
|
137
|
-
end
|
138
|
-
|
139
|
-
def round_weight(weight)
|
140
|
-
0.5 * (weight + weight.abs)
|
141
|
-
end
|
142
113
|
end
|
143
114
|
end
|
144
115
|
end
|
@@ -1,16 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'rumale/linear_model/
|
3
|
+
require 'rumale/linear_model/base_sgd'
|
4
4
|
require 'rumale/base/regressor'
|
5
5
|
|
6
6
|
module Rumale
|
7
7
|
module LinearModel
|
8
8
|
# LinearRegression is a class that implements ordinary least square linear regression
|
9
|
-
# with
|
9
|
+
# with stochastic gradient descent (SGD) optimization or singular value decomposition (SVD).
|
10
10
|
#
|
11
11
|
# @example
|
12
12
|
# estimator =
|
13
|
-
# Rumale::LinearModel::LinearRegression.new(max_iter:
|
13
|
+
# Rumale::LinearModel::LinearRegression.new(max_iter: 500, batch_size: 20, random_seed: 1)
|
14
14
|
# estimator.fit(training_samples, traininig_values)
|
15
15
|
# results = estimator.predict(testing_samples)
|
16
16
|
#
|
@@ -19,7 +19,10 @@ module Rumale
|
|
19
19
|
# estimator = Rumale::LinearModel::LinearRegression.new(solver: 'svd')
|
20
20
|
# estimator.fit(training_samples, traininig_values)
|
21
21
|
# results = estimator.predict(testing_samples)
|
22
|
-
|
22
|
+
#
|
23
|
+
# *Reference*
|
24
|
+
# - L. Bottou, "Large-Scale Machine Learning with Stochastic Gradient Descent," Proc. COMPSTAT'10, pp. 177--186, 2010.
|
25
|
+
class LinearRegression < BaseSGD
|
23
26
|
include Base::Regressor
|
24
27
|
|
25
28
|
# Return the weight vector.
|
@@ -36,34 +39,57 @@ module Rumale
|
|
36
39
|
|
37
40
|
# Create a new ordinary least square linear regressor.
|
38
41
|
#
|
42
|
+
# @param learning_rate [Float] The initial value of learning rate.
|
43
|
+
# The learning rate decreases as the iteration proceeds according to the equation: learning_rate / (1 + decay * t).
|
44
|
+
# If solver = 'svd', this parameter is ignored.
|
45
|
+
# @param decay [Float] The smoothing parameter for decreasing learning rate as the iteration proceeds.
|
46
|
+
# If nil is given, the decay sets to 'learning_rate'.
|
47
|
+
# If solver = 'svd', this parameter is ignored.
|
48
|
+
# @param momentum [Float] The momentum factor.
|
49
|
+
# If solver = 'svd', this parameter is ignored.
|
39
50
|
# @param fit_bias [Boolean] The flag indicating whether to fit the bias term.
|
40
51
|
# @param bias_scale [Float] The scale of the bias term.
|
41
|
-
# @param max_iter [Integer] The maximum number of
|
52
|
+
# @param max_iter [Integer] The maximum number of epochs that indicates
|
53
|
+
# how many times the whole data is given to the training process.
|
42
54
|
# If solver = 'svd', this parameter is ignored.
|
43
55
|
# @param batch_size [Integer] The size of the mini batches.
|
44
56
|
# If solver = 'svd', this parameter is ignored.
|
45
|
-
# @param
|
46
|
-
# If nil is given, Nadam is used.
|
57
|
+
# @param tol [Float] The tolerance of loss for terminating optimization.
|
47
58
|
# If solver = 'svd', this parameter is ignored.
|
48
|
-
# @param solver [String] The algorithm to calculate weights. ('sgd' or 'svd').
|
59
|
+
# @param solver [String] The algorithm to calculate weights. ('auto', 'sgd' or 'svd').
|
60
|
+
# 'auto' chooses the 'svd' solver if Numo::Linalg is loaded. Otherwise, it chooses the 'sgd' solver.
|
49
61
|
# 'sgd' uses the stochastic gradient descent optimization.
|
50
62
|
# 'svd' performs singular value decomposition of samples.
|
51
63
|
# @param n_jobs [Integer] The number of jobs for running the fit method in parallel.
|
52
64
|
# If nil is given, the method does not execute in parallel.
|
53
65
|
# If zero or less is given, it becomes equal to the number of processors.
|
54
66
|
# This parameter is ignored if the Parallel gem is not loaded.
|
67
|
+
# @param verbose [Boolean] The flag indicating whether to output loss during iteration.
|
68
|
+
# If solver = 'svd', this parameter is ignored.
|
55
69
|
# @param random_seed [Integer] The seed value using to initialize the random generator.
|
56
|
-
def initialize(
|
57
|
-
|
58
|
-
|
59
|
-
|
70
|
+
def initialize(learning_rate: 0.01, decay: nil, momentum: 0.9,
|
71
|
+
fit_bias: true, bias_scale: 1.0, max_iter: 200, batch_size: 50, tol: 1e-4,
|
72
|
+
solver: 'auto',
|
73
|
+
n_jobs: nil, verbose: false, random_seed: nil)
|
74
|
+
check_params_numeric(learning_rate: learning_rate, momentum: momentum,
|
75
|
+
bias_scale: bias_scale, max_iter: max_iter, batch_size: batch_size)
|
76
|
+
check_params_boolean(fit_bias: fit_bias, verbose: verbose)
|
60
77
|
check_params_string(solver: solver)
|
61
|
-
check_params_numeric_or_nil(n_jobs: n_jobs, random_seed: random_seed)
|
62
|
-
check_params_positive(max_iter: max_iter, batch_size: batch_size)
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
78
|
+
check_params_numeric_or_nil(decay: decay, n_jobs: n_jobs, random_seed: random_seed)
|
79
|
+
check_params_positive(learning_rate: learning_rate, max_iter: max_iter, batch_size: batch_size)
|
80
|
+
super()
|
81
|
+
@params.merge!(method(:initialize).parameters.map { |_t, arg| [arg, binding.local_variable_get(arg)] }.to_h)
|
82
|
+
@params[:solver] = if solver == 'auto'
|
83
|
+
load_linalg? ? 'svd' : 'sgd'
|
84
|
+
else
|
85
|
+
solver != 'svd' ? 'sgd' : 'svd'
|
86
|
+
end
|
87
|
+
@params[:decay] ||= @params[:learning_rate]
|
88
|
+
@params[:random_seed] ||= srand
|
89
|
+
@rng = Random.new(@params[:random_seed])
|
90
|
+
@loss_func = LinearModel::Loss::MeanSquaredError.new
|
91
|
+
@weight_vec = nil
|
92
|
+
@bias_term = nil
|
67
93
|
end
|
68
94
|
|
69
95
|
# Fit the model with given training data.
|
@@ -94,33 +120,12 @@ module Rumale
|
|
94
120
|
x.dot(@weight_vec.transpose) + @bias_term
|
95
121
|
end
|
96
122
|
|
97
|
-
# Dump marshal data.
|
98
|
-
# @return [Hash] The marshal data about LinearRegression.
|
99
|
-
def marshal_dump
|
100
|
-
{ params: @params,
|
101
|
-
weight_vec: @weight_vec,
|
102
|
-
bias_term: @bias_term,
|
103
|
-
rng: @rng }
|
104
|
-
end
|
105
|
-
|
106
|
-
# Load marshal data.
|
107
|
-
# @return [nil]
|
108
|
-
def marshal_load(obj)
|
109
|
-
@params = obj[:params]
|
110
|
-
@weight_vec = obj[:weight_vec]
|
111
|
-
@bias_term = obj[:bias_term]
|
112
|
-
@rng = obj[:rng]
|
113
|
-
nil
|
114
|
-
end
|
115
|
-
|
116
123
|
private
|
117
124
|
|
118
125
|
def fit_svd(x, y)
|
119
|
-
|
126
|
+
x = expand_feature(x) if fit_bias?
|
120
127
|
|
121
|
-
|
122
|
-
d = (s / s**2).diag
|
123
|
-
w = vt.transpose.dot(d).dot(u.transpose).dot(y)
|
128
|
+
w = Numo::Linalg.pinv(x, driver: 'svd').dot(y)
|
124
129
|
|
125
130
|
is_single_target_vals = y.shape[1].nil?
|
126
131
|
if @params[:fit_bias]
|
@@ -150,8 +155,14 @@ module Rumale
|
|
150
155
|
end
|
151
156
|
end
|
152
157
|
|
153
|
-
def
|
154
|
-
|
158
|
+
def fit_bias?
|
159
|
+
@params[:fit_bias] == true
|
160
|
+
end
|
161
|
+
|
162
|
+
def load_linalg?
|
163
|
+
return false if defined?(Numo::Linalg).nil?
|
164
|
+
return false if Numo::Linalg::VERSION < '0.1.4'
|
165
|
+
true
|
155
166
|
end
|
156
167
|
end
|
157
168
|
end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'rumale/linear_model/
|
3
|
+
require 'rumale/linear_model/base_sgd'
|
4
4
|
require 'rumale/base/classifier'
|
5
5
|
|
6
6
|
module Rumale
|
7
7
|
module LinearModel
|
8
8
|
# LogisticRegression is a class that implements Logistic Regression
|
9
|
-
# with
|
9
|
+
# with stochastic gradient descent optimization.
|
10
10
|
# For multiclass classification problem, it uses one-vs-the-rest strategy.
|
11
11
|
#
|
12
12
|
# Rumale::SVM provides Logistic Regression based on LIBLINEAR.
|
@@ -15,13 +15,15 @@ module Rumale
|
|
15
15
|
#
|
16
16
|
# @example
|
17
17
|
# estimator =
|
18
|
-
# Rumale::LinearModel::LogisticRegression.new(reg_param: 1.0, max_iter:
|
18
|
+
# Rumale::LinearModel::LogisticRegression.new(reg_param: 1.0, max_iter: 200, batch_size: 50, random_seed: 1)
|
19
19
|
# estimator.fit(training_samples, traininig_labels)
|
20
20
|
# results = estimator.predict(testing_samples)
|
21
21
|
#
|
22
22
|
# *Reference*
|
23
23
|
# - S. Shalev-Shwartz, Y. Singer, N. Srebro, and A. Cotter, "Pegasos: Primal Estimated sub-GrAdient SOlver for SVM," Mathematical Programming, vol. 127 (1), pp. 3--30, 2011.
|
24
|
-
|
24
|
+
# - Y. Tsuruoka, J. Tsujii, and S. Ananiadou, "Stochastic Gradient Descent Training for L1-regularized Log-linear Models with Cumulative Penalty," Proc. ACL'09, pp. 477--485, 2009.
|
25
|
+
# - L. Bottou, "Large-Scale Machine Learning with Stochastic Gradient Descent," Proc. COMPSTAT'10, pp. 177--186, 2010.
|
26
|
+
class LogisticRegression < BaseSGD
|
25
27
|
include Base::Classifier
|
26
28
|
|
27
29
|
# Return the weight vector for Logistic Regression.
|
@@ -42,26 +44,53 @@ module Rumale
|
|
42
44
|
|
43
45
|
# Create a new classifier with Logisitc Regression by the SGD optimization.
|
44
46
|
#
|
47
|
+
# @param learning_rate [Float] The initial value of learning rate.
|
48
|
+
# The learning rate decreases as the iteration proceeds according to the equation: learning_rate / (1 + decay * t).
|
49
|
+
# @param decay [Float] The smoothing parameter for decreasing learning rate as the iteration proceeds.
|
50
|
+
# If nil is given, the decay sets to 'reg_param * learning_rate'.
|
51
|
+
# @param momentum [Float] The momentum factor.
|
52
|
+
# @param penalty [String] The regularization type to be used ('l1', 'l2', and 'elasticnet').
|
53
|
+
# @param l1_ratio [Float] The elastic-net type regularization mixing parameter.
|
54
|
+
# If penalty set to 'l2' or 'l1', this parameter is ignored.
|
55
|
+
# If l1_ratio = 1, the regularization is similar to Lasso.
|
56
|
+
# If l1_ratio = 0, the regularization is similar to Ridge.
|
57
|
+
# If 0 < l1_ratio < 1, the regularization is a combination of L1 and L2.
|
45
58
|
# @param reg_param [Float] The regularization parameter.
|
46
59
|
# @param fit_bias [Boolean] The flag indicating whether to fit the bias term.
|
47
60
|
# @param bias_scale [Float] The scale of the bias term.
|
48
61
|
# If fit_bias is true, the feature vector v becoms [v; bias_scale].
|
49
|
-
# @param max_iter [Integer] The maximum number of
|
62
|
+
# @param max_iter [Integer] The maximum number of epochs that indicates
|
63
|
+
# how many times the whole data is given to the training process.
|
50
64
|
# @param batch_size [Integer] The size of the mini batches.
|
51
|
-
# @param
|
52
|
-
# If nil is given, Nadam is used.
|
65
|
+
# @param tol [Float] The tolerance of loss for terminating optimization.
|
53
66
|
# @param n_jobs [Integer] The number of jobs for running the fit and predict methods in parallel.
|
54
67
|
# If nil is given, the methods do not execute in parallel.
|
55
68
|
# If zero or less is given, it becomes equal to the number of processors.
|
56
69
|
# This parameter is ignored if the Parallel gem is not loaded.
|
70
|
+
# @param verbose [Boolean] The flag indicating whether to output loss during iteration.
|
57
71
|
# @param random_seed [Integer] The seed value using to initialize the random generator.
|
58
|
-
def initialize(
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
72
|
+
def initialize(learning_rate: 0.01, decay: nil, momentum: 0.9,
|
73
|
+
penalty: 'l2', reg_param: 1.0, l1_ratio: 0.5,
|
74
|
+
fit_bias: true, bias_scale: 1.0,
|
75
|
+
max_iter: 200, batch_size: 50, tol: 1e-4,
|
76
|
+
n_jobs: nil, verbose: false, random_seed: nil)
|
77
|
+
check_params_numeric(learning_rate: learning_rate, momentum: momentum,
|
78
|
+
reg_param: reg_param, l1_ratio: l1_ratio, bias_scale: bias_scale,
|
79
|
+
max_iter: max_iter, batch_size: batch_size, tol: tol)
|
80
|
+
check_params_boolean(fit_bias: fit_bias, verbose: verbose)
|
81
|
+
check_params_string(penalty: penalty)
|
82
|
+
check_params_numeric_or_nil(decay: decay, n_jobs: n_jobs, random_seed: random_seed)
|
83
|
+
check_params_positive(learning_rate: learning_rate, reg_param: reg_param,
|
84
|
+
bias_scale: bias_scale, max_iter: max_iter, batch_size: batch_size)
|
85
|
+
super()
|
86
|
+
@params.merge!(method(:initialize).parameters.map { |_t, arg| [arg, binding.local_variable_get(arg)] }.to_h)
|
87
|
+
@params[:decay] ||= @params[:reg_param] * @params[:learning_rate]
|
88
|
+
@params[:random_seed] ||= srand
|
89
|
+
@rng = Random.new(@params[:random_seed])
|
90
|
+
@penalty_type = @params[:penalty]
|
91
|
+
@loss_func = LinearModel::Loss::LogLoss.new
|
92
|
+
@weight_vec = nil
|
93
|
+
@bias_term = nil
|
65
94
|
@classes = nil
|
66
95
|
end
|
67
96
|
|
@@ -148,33 +177,8 @@ module Rumale
|
|
148
177
|
probs
|
149
178
|
end
|
150
179
|
|
151
|
-
# Dump marshal data.
|
152
|
-
# @return [Hash] The marshal data about LogisticRegression.
|
153
|
-
def marshal_dump
|
154
|
-
{ params: @params,
|
155
|
-
weight_vec: @weight_vec,
|
156
|
-
bias_term: @bias_term,
|
157
|
-
classes: @classes,
|
158
|
-
rng: @rng }
|
159
|
-
end
|
160
|
-
|
161
|
-
# Load marshal data.
|
162
|
-
# @return [nil]
|
163
|
-
def marshal_load(obj)
|
164
|
-
@params = obj[:params]
|
165
|
-
@weight_vec = obj[:weight_vec]
|
166
|
-
@bias_term = obj[:bias_term]
|
167
|
-
@classes = obj[:classes]
|
168
|
-
@rng = obj[:rng]
|
169
|
-
nil
|
170
|
-
end
|
171
|
-
|
172
180
|
private
|
173
181
|
|
174
|
-
def calc_loss_gradient(x, y, weight)
|
175
|
-
y / (Numo::NMath.exp(-y * x.dot(weight)) + 1.0) - y
|
176
|
-
end
|
177
|
-
|
178
182
|
def multiclass_problem?
|
179
183
|
@classes.size > 2
|
180
184
|
end
|
@@ -1,16 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'rumale/linear_model/
|
3
|
+
require 'rumale/linear_model/base_sgd'
|
4
4
|
require 'rumale/base/regressor'
|
5
5
|
|
6
6
|
module Rumale
|
7
7
|
module LinearModel
|
8
8
|
# Ridge is a class that implements Ridge Regression
|
9
|
-
# with
|
9
|
+
# with stochastic gradient descent (SGD) optimization or singular value decomposition (SVD).
|
10
10
|
#
|
11
11
|
# @example
|
12
12
|
# estimator =
|
13
|
-
# Rumale::LinearModel::Ridge.new(reg_param: 0.1, max_iter:
|
13
|
+
# Rumale::LinearModel::Ridge.new(reg_param: 0.1, max_iter: 500, batch_size: 20, random_seed: 1)
|
14
14
|
# estimator.fit(training_samples, traininig_values)
|
15
15
|
# results = estimator.predict(testing_samples)
|
16
16
|
#
|
@@ -19,7 +19,10 @@ module Rumale
|
|
19
19
|
# estimator = Rumale::LinearModel::Ridge.new(reg_param: 0.1, solver: 'svd')
|
20
20
|
# estimator.fit(training_samples, traininig_values)
|
21
21
|
# results = estimator.predict(testing_samples)
|
22
|
-
|
22
|
+
#
|
23
|
+
# *Reference*
|
24
|
+
# - L. Bottou, "Large-Scale Machine Learning with Stochastic Gradient Descent," Proc. COMPSTAT'10, pp. 177--186, 2010.
|
25
|
+
class Ridge < BaseSGD
|
23
26
|
include Base::Regressor
|
24
27
|
|
25
28
|
# Return the weight vector.
|
@@ -36,35 +39,61 @@ module Rumale
|
|
36
39
|
|
37
40
|
# Create a new Ridge regressor.
|
38
41
|
#
|
42
|
+
# @param learning_rate [Float] The initial value of learning rate.
|
43
|
+
# The learning rate decreases as the iteration proceeds according to the equation: learning_rate / (1 + decay * t).
|
44
|
+
# If solver = 'svd', this parameter is ignored.
|
45
|
+
# @param decay [Float] The smoothing parameter for decreasing learning rate as the iteration proceeds.
|
46
|
+
# If nil is given, the decay sets to 'reg_param * learning_rate'.
|
47
|
+
# If solver = 'svd', this parameter is ignored.
|
48
|
+
# @param momentum [Float] The momentum factor.
|
49
|
+
# If solver = 'svd', this parameter is ignored.
|
39
50
|
# @param reg_param [Float] The regularization parameter.
|
40
51
|
# @param fit_bias [Boolean] The flag indicating whether to fit the bias term.
|
41
52
|
# @param bias_scale [Float] The scale of the bias term.
|
42
|
-
# @param max_iter [Integer] The maximum number of
|
53
|
+
# @param max_iter [Integer] The maximum number of epochs that indicates
|
54
|
+
# how many times the whole data is given to the training process.
|
43
55
|
# If solver = 'svd', this parameter is ignored.
|
44
56
|
# @param batch_size [Integer] The size of the mini batches.
|
45
57
|
# If solver = 'svd', this parameter is ignored.
|
46
|
-
# @param
|
47
|
-
# If nil is given, Nadam is used.
|
58
|
+
# @param tol [Float] The tolerance of loss for terminating optimization.
|
48
59
|
# If solver = 'svd', this parameter is ignored.
|
49
|
-
# @param solver [String] The algorithm to calculate weights. ('sgd' or 'svd').
|
60
|
+
# @param solver [String] The algorithm to calculate weights. ('auto', 'sgd' or 'svd').
|
61
|
+
# 'auto' chooses the 'svd' solver if Numo::Linalg is loaded. Otherwise, it chooses the 'sgd' solver.
|
50
62
|
# 'sgd' uses the stochastic gradient descent optimization.
|
51
63
|
# 'svd' performs singular value decomposition of samples.
|
52
64
|
# @param n_jobs [Integer] The number of jobs for running the fit method in parallel.
|
53
65
|
# If nil is given, the method does not execute in parallel.
|
54
66
|
# If zero or less is given, it becomes equal to the number of processors.
|
55
67
|
# This parameter is ignored if the Parallel gem is not loaded or the solver is 'svd'.
|
68
|
+
# @param verbose [Boolean] The flag indicating whether to output loss during iteration.
|
69
|
+
# If solver = 'svd', this parameter is ignored.
|
56
70
|
# @param random_seed [Integer] The seed value using to initialize the random generator.
|
57
|
-
def initialize(
|
58
|
-
|
59
|
-
|
60
|
-
|
71
|
+
def initialize(learning_rate: 0.01, decay: nil, momentum: 0.9,
|
72
|
+
reg_param: 1.0, fit_bias: true, bias_scale: 1.0,
|
73
|
+
max_iter: 200, batch_size: 50, tol: 1e-4,
|
74
|
+
solver: 'auto',
|
75
|
+
n_jobs: nil, verbose: false, random_seed: nil)
|
76
|
+
check_params_numeric(learning_rate: learning_rate, momentum: momentum,
|
77
|
+
reg_param: reg_param, bias_scale: bias_scale,
|
78
|
+
max_iter: max_iter, batch_size: batch_size, tol: tol)
|
79
|
+
check_params_boolean(fit_bias: fit_bias, verbose: verbose)
|
61
80
|
check_params_string(solver: solver)
|
62
|
-
check_params_numeric_or_nil(n_jobs: n_jobs, random_seed: random_seed)
|
63
|
-
check_params_positive(reg_param: reg_param, max_iter: max_iter, batch_size: batch_size)
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
81
|
+
check_params_numeric_or_nil(decay: decay, n_jobs: n_jobs, random_seed: random_seed)
|
82
|
+
check_params_positive(learning_rate: learning_rate, reg_param: reg_param, max_iter: max_iter, batch_size: batch_size)
|
83
|
+
super()
|
84
|
+
@params.merge!(method(:initialize).parameters.map { |_t, arg| [arg, binding.local_variable_get(arg)] }.to_h)
|
85
|
+
@params[:solver] = if solver == 'auto'
|
86
|
+
load_linalg? ? 'svd' : 'sgd'
|
87
|
+
else
|
88
|
+
solver != 'svd' ? 'sgd' : 'svd'
|
89
|
+
end
|
90
|
+
@params[:decay] ||= @params[:reg_param] * @params[:learning_rate]
|
91
|
+
@params[:random_seed] ||= srand
|
92
|
+
@rng = Random.new(@params[:random_seed])
|
93
|
+
@penalty_type = L2_PENALTY
|
94
|
+
@loss_func = LinearModel::Loss::MeanSquaredError.new
|
95
|
+
@weight_vec = nil
|
96
|
+
@bias_term = nil
|
68
97
|
end
|
69
98
|
|
70
99
|
# Fit the model with given training data.
|
@@ -95,25 +124,6 @@ module Rumale
|
|
95
124
|
x.dot(@weight_vec.transpose) + @bias_term
|
96
125
|
end
|
97
126
|
|
98
|
-
# Dump marshal data.
|
99
|
-
# @return [Hash] The marshal data about Ridge.
|
100
|
-
def marshal_dump
|
101
|
-
{ params: @params,
|
102
|
-
weight_vec: @weight_vec,
|
103
|
-
bias_term: @bias_term,
|
104
|
-
rng: @rng }
|
105
|
-
end
|
106
|
-
|
107
|
-
# Load marshal data.
|
108
|
-
# @return [nil]
|
109
|
-
def marshal_load(obj)
|
110
|
-
@params = obj[:params]
|
111
|
-
@weight_vec = obj[:weight_vec]
|
112
|
-
@bias_term = obj[:bias_term]
|
113
|
-
@rng = obj[:rng]
|
114
|
-
nil
|
115
|
-
end
|
116
|
-
|
117
127
|
private
|
118
128
|
|
119
129
|
def fit_svd(x, y)
|
@@ -151,8 +161,10 @@ module Rumale
|
|
151
161
|
end
|
152
162
|
end
|
153
163
|
|
154
|
-
def
|
155
|
-
|
164
|
+
def load_linalg?
|
165
|
+
return false if defined?(Numo::Linalg).nil?
|
166
|
+
return false if Numo::Linalg::VERSION < '0.1.4'
|
167
|
+
true
|
156
168
|
end
|
157
169
|
end
|
158
170
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'rumale/linear_model/
|
3
|
+
require 'rumale/linear_model/base_sgd'
|
4
4
|
require 'rumale/base/classifier'
|
5
5
|
require 'rumale/probabilistic_output'
|
6
6
|
|
@@ -8,7 +8,7 @@ module Rumale
|
|
8
8
|
# This module consists of the classes that implement generalized linear models.
|
9
9
|
module LinearModel
|
10
10
|
# SVC is a class that implements Support Vector Classifier
|
11
|
-
# with
|
11
|
+
# with stochastic gradient descent optimization.
|
12
12
|
# For multiclass classification problem, it uses one-vs-the-rest strategy.
|
13
13
|
#
|
14
14
|
# Rumale::SVM provides linear support vector classifier based on LIBLINEAR.
|
@@ -17,13 +17,15 @@ module Rumale
|
|
17
17
|
#
|
18
18
|
# @example
|
19
19
|
# estimator =
|
20
|
-
# Rumale::LinearModel::SVC.new(reg_param: 1.0, max_iter:
|
20
|
+
# Rumale::LinearModel::SVC.new(reg_param: 1.0, max_iter: 200, batch_size: 50, random_seed: 1)
|
21
21
|
# estimator.fit(training_samples, traininig_labels)
|
22
22
|
# results = estimator.predict(testing_samples)
|
23
23
|
#
|
24
24
|
# *Reference*
|
25
25
|
# - S. Shalev-Shwartz and Y. Singer, "Pegasos: Primal Estimated sub-GrAdient SOlver for SVM," Proc. ICML'07, pp. 807--814, 2007.
|
26
|
-
|
26
|
+
# - Y. Tsuruoka, J. Tsujii, and S. Ananiadou, "Stochastic Gradient Descent Training for L1-regularized Log-linear Models with Cumulative Penalty," Proc. ACL'09, pp. 477--485, 2009.
|
27
|
+
# - L. Bottou, "Large-Scale Machine Learning with Stochastic Gradient Descent," Proc. COMPSTAT'10, pp. 177--186, 2010.
|
28
|
+
class SVC < BaseSGD
|
27
29
|
include Base::Classifier
|
28
30
|
|
29
31
|
# Return the weight vector for SVC.
|
@@ -44,31 +46,56 @@ module Rumale
|
|
44
46
|
|
45
47
|
# Create a new classifier with Support Vector Machine by the SGD optimization.
|
46
48
|
#
|
49
|
+
# @param learning_rate [Float] The initial value of learning rate.
|
50
|
+
# The learning rate decreases as the iteration proceeds according to the equation: learning_rate / (1 + decay * t).
|
51
|
+
# @param decay [Float] The smoothing parameter for decreasing learning rate as the iteration proceeds.
|
52
|
+
# If nil is given, the decay sets to 'reg_param * learning_rate'.
|
53
|
+
# @param momentum [Float] The momentum factor.
|
54
|
+
# @param penalty [String] The regularization type to be used ('l1', 'l2', and 'elasticnet').
|
55
|
+
# @param l1_ratio [Float] The elastic-net type regularization mixing parameter.
|
56
|
+
# If penalty set to 'l2' or 'l1', this parameter is ignored.
|
57
|
+
# If l1_ratio = 1, the regularization is similar to Lasso.
|
58
|
+
# If l1_ratio = 0, the regularization is similar to Ridge.
|
59
|
+
# If 0 < l1_ratio < 1, the regularization is a combination of L1 and L2.
|
47
60
|
# @param reg_param [Float] The regularization parameter.
|
48
61
|
# @param fit_bias [Boolean] The flag indicating whether to fit the bias term.
|
49
62
|
# @param bias_scale [Float] The scale of the bias term.
|
50
|
-
# @param max_iter [Integer] The maximum number of
|
63
|
+
# @param max_iter [Integer] The maximum number of epochs that indicates
|
64
|
+
# how many times the whole data is given to the training process.
|
51
65
|
# @param batch_size [Integer] The size of the mini batches.
|
66
|
+
# @param tol [Float] The tolerance of loss for terminating optimization.
|
52
67
|
# @param probability [Boolean] The flag indicating whether to perform probability estimation.
|
53
|
-
# @param optimizer [Optimizer] The optimizer to calculate adaptive learning rate.
|
54
|
-
# If nil is given, Nadam is used.
|
55
68
|
# @param n_jobs [Integer] The number of jobs for running the fit and predict methods in parallel.
|
56
69
|
# If nil is given, the methods do not execute in parallel.
|
57
70
|
# If zero or less is given, it becomes equal to the number of processors.
|
58
71
|
# This parameter is ignored if the Parallel gem is not loaded.
|
72
|
+
# @param verbose [Boolean] The flag indicating whether to output loss during iteration.
|
59
73
|
# @param random_seed [Integer] The seed value using to initialize the random generator.
|
60
|
-
def initialize(
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
74
|
+
def initialize(learning_rate: 0.01, decay: nil, momentum: 0.9,
|
75
|
+
penalty: 'l2', reg_param: 1.0, l1_ratio: 0.5,
|
76
|
+
fit_bias: true, bias_scale: 1.0,
|
77
|
+
max_iter: 200, batch_size: 50, tol: 1e-4,
|
78
|
+
probability: false,
|
79
|
+
n_jobs: nil, verbose: false, random_seed: nil)
|
80
|
+
check_params_numeric(learning_rate: learning_rate, momentum: momentum,
|
81
|
+
reg_param: reg_param, l1_ratio: l1_ratio, bias_scale: bias_scale,
|
82
|
+
max_iter: max_iter, batch_size: batch_size, tol: tol)
|
83
|
+
check_params_boolean(fit_bias: fit_bias, verbose: verbose, probability: probability)
|
84
|
+
check_params_string(penalty: penalty)
|
85
|
+
check_params_numeric_or_nil(decay: decay, n_jobs: n_jobs, random_seed: random_seed)
|
86
|
+
check_params_positive(learning_rate: learning_rate, reg_param: reg_param,
|
87
|
+
bias_scale: bias_scale, max_iter: max_iter, batch_size: batch_size)
|
88
|
+
super()
|
89
|
+
@params.merge!(method(:initialize).parameters.map { |_t, arg| [arg, binding.local_variable_get(arg)] }.to_h)
|
90
|
+
@params[:decay] ||= @params[:reg_param] * @params[:learning_rate]
|
91
|
+
@params[:random_seed] ||= srand
|
92
|
+
@rng = Random.new(@params[:random_seed])
|
93
|
+
@penalty_type = @params[:penalty]
|
94
|
+
@loss_func = LinearModel::Loss::HingeLoss.new
|
95
|
+
@weight_vec = nil
|
96
|
+
@bias_term = nil
|
71
97
|
@classes = nil
|
98
|
+
@prob_param = nil
|
72
99
|
end
|
73
100
|
|
74
101
|
# Fit the model with given training data.
|
@@ -165,29 +192,6 @@ module Rumale
|
|
165
192
|
end
|
166
193
|
end
|
167
194
|
|
168
|
-
# Dump marshal data.
|
169
|
-
# @return [Hash] The marshal data about SVC.
|
170
|
-
def marshal_dump
|
171
|
-
{ params: @params,
|
172
|
-
weight_vec: @weight_vec,
|
173
|
-
bias_term: @bias_term,
|
174
|
-
prob_param: @prob_param,
|
175
|
-
classes: @classes,
|
176
|
-
rng: @rng }
|
177
|
-
end
|
178
|
-
|
179
|
-
# Load marshal data.
|
180
|
-
# @return [nil]
|
181
|
-
def marshal_load(obj)
|
182
|
-
@params = obj[:params]
|
183
|
-
@weight_vec = obj[:weight_vec]
|
184
|
-
@bias_term = obj[:bias_term]
|
185
|
-
@prob_param = obj[:prob_param]
|
186
|
-
@classes = obj[:classes]
|
187
|
-
@rng = obj[:rng]
|
188
|
-
nil
|
189
|
-
end
|
190
|
-
|
191
195
|
private
|
192
196
|
|
193
197
|
def partial_fit(x, bin_y)
|
@@ -200,13 +204,6 @@ module Rumale
|
|
200
204
|
[w, b, p]
|
201
205
|
end
|
202
206
|
|
203
|
-
def calc_loss_gradient(x, y, weight)
|
204
|
-
target_ids = (x.dot(weight) * y).lt(1.0).where
|
205
|
-
grad = Numo::DFloat.zeros(@params[:batch_size])
|
206
|
-
grad[target_ids] = -y[target_ids]
|
207
|
-
grad
|
208
|
-
end
|
209
|
-
|
210
207
|
def multiclass_problem?
|
211
208
|
@classes.size > 2
|
212
209
|
end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'rumale/linear_model/
|
3
|
+
require 'rumale/linear_model/base_sgd'
|
4
4
|
require 'rumale/base/regressor'
|
5
5
|
|
6
6
|
module Rumale
|
7
7
|
module LinearModel
|
8
8
|
# SVR is a class that implements Support Vector Regressor
|
9
|
-
# with
|
9
|
+
# with stochastic gradient descent optimization.
|
10
10
|
#
|
11
11
|
# Rumale::SVM provides linear and kernel support vector regressor based on LIBLINEAR and LIBSVM.
|
12
12
|
# If you prefer execution speed, you should use Rumale::SVM::LinearSVR.
|
@@ -14,13 +14,15 @@ module Rumale
|
|
14
14
|
#
|
15
15
|
# @example
|
16
16
|
# estimator =
|
17
|
-
# Rumale::LinearModel::SVR.new(reg_param: 1.0, epsilon: 0.1, max_iter:
|
17
|
+
# Rumale::LinearModel::SVR.new(reg_param: 1.0, epsilon: 0.1, max_iter: 200, batch_size: 50, random_seed: 1)
|
18
18
|
# estimator.fit(training_samples, traininig_target_values)
|
19
19
|
# results = estimator.predict(testing_samples)
|
20
20
|
#
|
21
21
|
# *Reference*
|
22
|
-
#
|
23
|
-
|
22
|
+
# - S. Shalev-Shwartz and Y. Singer, "Pegasos: Primal Estimated sub-GrAdient SOlver for SVM," Proc. ICML'07, pp. 807--814, 2007.
|
23
|
+
# - Y. Tsuruoka, J. Tsujii, and S. Ananiadou, "Stochastic Gradient Descent Training for L1-regularized Log-linear Models with Cumulative Penalty," Proc. ACL'09, pp. 477--485, 2009.
|
24
|
+
# - L. Bottou, "Large-Scale Machine Learning with Stochastic Gradient Descent," Proc. COMPSTAT'10, pp. 177--186, 2010.
|
25
|
+
class SVR < BaseSGD
|
24
26
|
include Base::Regressor
|
25
27
|
|
26
28
|
# Return the weight vector for SVR.
|
@@ -37,30 +39,54 @@ module Rumale
|
|
37
39
|
|
38
40
|
# Create a new regressor with Support Vector Machine by the SGD optimization.
|
39
41
|
#
|
42
|
+
# @param learning_rate [Float] The initial value of learning rate.
|
43
|
+
# The learning rate decreases as the iteration proceeds according to the equation: learning_rate / (1 + decay * t).
|
44
|
+
# @param decay [Float] The smoothing parameter for decreasing learning rate as the iteration proceeds.
|
45
|
+
# If nil is given, the decay sets to 'reg_param * learning_rate'.
|
46
|
+
# @param momentum [Float] The momentum factor.
|
47
|
+
# @param penalty [String] The regularization type to be used ('l1', 'l2', and 'elasticnet').
|
48
|
+
# @param l1_ratio [Float] The elastic-net type regularization mixing parameter.
|
49
|
+
# If penalty set to 'l2' or 'l1', this parameter is ignored.
|
50
|
+
# If l1_ratio = 1, the regularization is similar to Lasso.
|
51
|
+
# If l1_ratio = 0, the regularization is similar to Ridge.
|
52
|
+
# If 0 < l1_ratio < 1, the regularization is a combination of L1 and L2.
|
40
53
|
# @param reg_param [Float] The regularization parameter.
|
41
54
|
# @param fit_bias [Boolean] The flag indicating whether to fit the bias term.
|
42
55
|
# @param bias_scale [Float] The scale of the bias term.
|
43
56
|
# @param epsilon [Float] The margin of tolerance.
|
44
|
-
# @param max_iter [Integer] The maximum number of
|
57
|
+
# @param max_iter [Integer] The maximum number of epochs that indicates
|
58
|
+
# how many times the whole data is given to the training process.
|
45
59
|
# @param batch_size [Integer] The size of the mini batches.
|
46
|
-
# @param
|
47
|
-
# If nil is given, Nadam is used.
|
60
|
+
# @param tol [Float] The tolerance of loss for terminating optimization.
|
48
61
|
# @param n_jobs [Integer] The number of jobs for running the fit method in parallel.
|
49
62
|
# If nil is given, the method does not execute in parallel.
|
50
63
|
# If zero or less is given, it becomes equal to the number of processors.
|
51
64
|
# This parameter is ignored if the Parallel gem is not loaded.
|
65
|
+
# @param verbose [Boolean] The flag indicating whether to output loss during iteration.
|
52
66
|
# @param random_seed [Integer] The seed value using to initialize the random generator.
|
53
|
-
def initialize(
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
67
|
+
def initialize(learning_rate: 0.01, decay: nil, momentum: 0.9,
|
68
|
+
penalty: 'l2', reg_param: 1.0, l1_ratio: 0.5,
|
69
|
+
fit_bias: true, bias_scale: 1.0,
|
70
|
+
epsilon: 0.1,
|
71
|
+
max_iter: 200, batch_size: 50, tol: 1e-4,
|
72
|
+
n_jobs: nil, verbose: false, random_seed: nil)
|
73
|
+
check_params_numeric(learning_rate: learning_rate, momentum: momentum,
|
74
|
+
reg_param: reg_param, bias_scale: bias_scale, epsilon: epsilon,
|
75
|
+
max_iter: max_iter, batch_size: batch_size, tol: tol)
|
76
|
+
check_params_boolean(fit_bias: fit_bias, verbose: verbose)
|
77
|
+
check_params_numeric_or_nil(decay: decay, n_jobs: n_jobs, random_seed: random_seed)
|
78
|
+
check_params_positive(learning_rate: learning_rate, reg_param: reg_param,
|
79
|
+
bias_scale: bias_scale, epsilon: epsilon,
|
59
80
|
max_iter: max_iter, batch_size: batch_size)
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
@params[:
|
81
|
+
super()
|
82
|
+
@params.merge!(method(:initialize).parameters.map { |_t, arg| [arg, binding.local_variable_get(arg)] }.to_h)
|
83
|
+
@params[:decay] ||= @params[:reg_param] * @params[:learning_rate]
|
84
|
+
@params[:random_seed] ||= srand
|
85
|
+
@rng = Random.new(@params[:random_seed])
|
86
|
+
@penalty_type = @params[:penalty]
|
87
|
+
@loss_func = LinearModel::Loss::EpsilonInsensitive.new(epsilon: @params[:epsilon])
|
88
|
+
@weight_vec = nil
|
89
|
+
@bias_term = nil
|
64
90
|
end
|
65
91
|
|
66
92
|
# Fit the model with given training data.
|
@@ -100,35 +126,6 @@ module Rumale
|
|
100
126
|
x = check_convert_sample_array(x)
|
101
127
|
x.dot(@weight_vec.transpose) + @bias_term
|
102
128
|
end
|
103
|
-
|
104
|
-
# Dump marshal data.
|
105
|
-
# @return [Hash] The marshal data about SVR.
|
106
|
-
def marshal_dump
|
107
|
-
{ params: @params,
|
108
|
-
weight_vec: @weight_vec,
|
109
|
-
bias_term: @bias_term,
|
110
|
-
rng: @rng }
|
111
|
-
end
|
112
|
-
|
113
|
-
# Load marshal data.
|
114
|
-
# @return [nil]
|
115
|
-
def marshal_load(obj)
|
116
|
-
@params = obj[:params]
|
117
|
-
@weight_vec = obj[:weight_vec]
|
118
|
-
@bias_term = obj[:bias_term]
|
119
|
-
@rng = obj[:rng]
|
120
|
-
nil
|
121
|
-
end
|
122
|
-
|
123
|
-
private
|
124
|
-
|
125
|
-
def calc_loss_gradient(x, y, weight)
|
126
|
-
z = x.dot(weight)
|
127
|
-
grad = Numo::DFloat.zeros(@params[:batch_size])
|
128
|
-
grad[(z - y).gt(@params[:epsilon]).where] = 1
|
129
|
-
grad[(y - z).gt(@params[:epsilon]).where] = -1
|
130
|
-
grad
|
131
|
-
end
|
132
129
|
end
|
133
130
|
end
|
134
131
|
end
|
@@ -17,7 +17,8 @@ module Rumale
|
|
17
17
|
# @param loss [String] The loss function ('hinge' or 'logistic' or nil).
|
18
18
|
# @param reg_param_linear [Float] The regularization parameter for linear model.
|
19
19
|
# @param reg_param_factor [Float] The regularization parameter for factor matrix.
|
20
|
-
# @param max_iter [Integer] The maximum number of
|
20
|
+
# @param max_iter [Integer] The maximum number of epochs that indicates
|
21
|
+
# how many times the whole data is given to the training process.
|
21
22
|
# @param batch_size [Integer] The size of the mini batches.
|
22
23
|
# @param optimizer [Optimizer] The optimizer to calculate adaptive learning rate.
|
23
24
|
# If nil is given, Nadam is used.
|
@@ -27,7 +28,7 @@ module Rumale
|
|
27
28
|
# This parameter is ignored if the Parallel gem is not loaded.
|
28
29
|
# @param random_seed [Integer] The seed value using to initialize the random generator.
|
29
30
|
def initialize(n_factors: 2, loss: nil, reg_param_linear: 1.0, reg_param_factor: 1.0,
|
30
|
-
max_iter:
|
31
|
+
max_iter: 200, batch_size: 50, optimizer: nil, n_jobs: nil, random_seed: nil)
|
31
32
|
@params = {}
|
32
33
|
@params[:n_factors] = n_factors
|
33
34
|
@params[:loss] = loss unless loss.nil?
|
@@ -51,27 +52,29 @@ module Rumale
|
|
51
52
|
def partial_fit(x, y)
|
52
53
|
# Initialize some variables.
|
53
54
|
n_samples, n_features = x.shape
|
54
|
-
|
55
|
+
sub_rng = @rng.dup
|
55
56
|
weight_vec = Numo::DFloat.zeros(n_features + 1)
|
56
57
|
factor_mat = Numo::DFloat.zeros(@params[:n_factors], n_features)
|
57
58
|
weight_optimizer = @params[:optimizer].dup
|
58
59
|
factor_optimizers = Array.new(@params[:n_factors]) { @params[:optimizer].dup }
|
59
60
|
# Start optimization.
|
60
61
|
@params[:max_iter].times do |_t|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
62
|
+
sample_ids = [*0...n_samples]
|
63
|
+
sample_ids.shuffle!(random: sub_rng)
|
64
|
+
until (subset_ids = sample_ids.shift(@params[:batch_size])).empty?
|
65
|
+
# Sampling.
|
66
|
+
sub_x = x[subset_ids, true]
|
67
|
+
sub_y = y[subset_ids]
|
68
|
+
ex_sub_x = expand_feature(sub_x)
|
69
|
+
# Calculate gradients for loss function.
|
70
|
+
loss_grad = loss_gradient(sub_x, ex_sub_x, sub_y, factor_mat, weight_vec)
|
71
|
+
next if loss_grad.ne(0.0).count.zero?
|
72
|
+
# Update each parameter.
|
73
|
+
weight_vec = weight_optimizer.call(weight_vec, weight_gradient(loss_grad, ex_sub_x, weight_vec))
|
74
|
+
@params[:n_factors].times do |n|
|
75
|
+
factor_mat[n, true] = factor_optimizers[n].call(factor_mat[n, true],
|
76
|
+
factor_gradient(loss_grad, sub_x, factor_mat[n, true]))
|
77
|
+
end
|
75
78
|
end
|
76
79
|
end
|
77
80
|
[factor_mat, *split_weight_vec_bias(weight_vec)]
|
@@ -14,7 +14,7 @@ module Rumale
|
|
14
14
|
# estimator =
|
15
15
|
# Rumale::PolynomialModel::FactorizationMachineClassifier.new(
|
16
16
|
# n_factors: 10, loss: 'hinge', reg_param_linear: 0.001, reg_param_factor: 0.001,
|
17
|
-
# max_iter:
|
17
|
+
# max_iter: 500, batch_size: 50, random_seed: 1)
|
18
18
|
# estimator.fit(training_samples, traininig_labels)
|
19
19
|
# results = estimator.predict(testing_samples)
|
20
20
|
#
|
@@ -50,7 +50,8 @@ module Rumale
|
|
50
50
|
# @param loss [String] The loss function ('hinge' or 'logistic').
|
51
51
|
# @param reg_param_linear [Float] The regularization parameter for linear model.
|
52
52
|
# @param reg_param_factor [Float] The regularization parameter for factor matrix.
|
53
|
-
# @param max_iter [Integer] The maximum number of
|
53
|
+
# @param max_iter [Integer] The maximum number of epochs that indicates
|
54
|
+
# how many times the whole data is given to the training process.
|
54
55
|
# @param batch_size [Integer] The size of the mini batches.
|
55
56
|
# @param optimizer [Optimizer] The optimizer to calculate adaptive learning rate.
|
56
57
|
# If nil is given, Nadam is used.
|
@@ -60,7 +61,7 @@ module Rumale
|
|
60
61
|
# This parameter is ignored if the Parallel gem is not loaded.
|
61
62
|
# @param random_seed [Integer] The seed value using to initialize the random generator.
|
62
63
|
def initialize(n_factors: 2, loss: 'hinge', reg_param_linear: 1.0, reg_param_factor: 1.0,
|
63
|
-
max_iter:
|
64
|
+
max_iter: 200, batch_size: 50, optimizer: nil, n_jobs: nil, random_seed: nil)
|
64
65
|
check_params_numeric(reg_param_linear: reg_param_linear, reg_param_factor: reg_param_factor,
|
65
66
|
n_factors: n_factors, max_iter: max_iter, batch_size: batch_size)
|
66
67
|
check_params_string(loss: loss)
|
@@ -12,7 +12,7 @@ module Rumale
|
|
12
12
|
# estimator =
|
13
13
|
# Rumale::PolynomialModel::FactorizationMachineRegressor.new(
|
14
14
|
# n_factors: 10, reg_param_linear: 0.1, reg_param_factor: 0.1,
|
15
|
-
# max_iter:
|
15
|
+
# max_iter: 500, batch_size: 50, random_seed: 1)
|
16
16
|
# estimator.fit(training_samples, traininig_values)
|
17
17
|
# results = estimator.predict(testing_samples)
|
18
18
|
#
|
@@ -43,7 +43,8 @@ module Rumale
|
|
43
43
|
# @param n_factors [Integer] The maximum number of iterations.
|
44
44
|
# @param reg_param_linear [Float] The regularization parameter for linear model.
|
45
45
|
# @param reg_param_factor [Float] The regularization parameter for factor matrix.
|
46
|
-
# @param max_iter [Integer] The maximum number of
|
46
|
+
# @param max_iter [Integer] The maximum number of epochs that indicates
|
47
|
+
# how many times the whole data is given to the training process.
|
47
48
|
# @param batch_size [Integer] The size of the mini batches.
|
48
49
|
# @param optimizer [Optimizer] The optimizer to calculate adaptive learning rate.
|
49
50
|
# If nil is given, Nadam is used.
|
@@ -53,7 +54,7 @@ module Rumale
|
|
53
54
|
# This parameter is ignored if the Parallel gem is not loaded.
|
54
55
|
# @param random_seed [Integer] The seed value using to initialize the random generator.
|
55
56
|
def initialize(n_factors: 2, reg_param_linear: 1.0, reg_param_factor: 1.0,
|
56
|
-
max_iter:
|
57
|
+
max_iter: 200, batch_size: 50, optimizer: nil, n_jobs: nil, random_seed: nil)
|
57
58
|
check_params_numeric(reg_param_linear: reg_param_linear, reg_param_factor: reg_param_factor,
|
58
59
|
n_factors: n_factors, max_iter: max_iter, batch_size: batch_size)
|
59
60
|
check_params_numeric_or_nil(n_jobs: n_jobs, random_seed: random_seed)
|
data/lib/rumale/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rumale
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.17.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- yoshoku
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-01-
|
11
|
+
date: 2020-01-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: numo-narray
|