svmkit 0.7.0 → 0.7.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.travis.yml +2 -1
- data/HISTORY.md +4 -0
- data/lib/svmkit.rb +2 -0
- data/lib/svmkit/dataset.rb +12 -9
- data/lib/svmkit/ensemble/ada_boost_classifier.rb +25 -39
- data/lib/svmkit/ensemble/ada_boost_regressor.rb +3 -23
- data/lib/svmkit/ensemble/random_forest_classifier.rb +18 -21
- data/lib/svmkit/ensemble/random_forest_regressor.rb +4 -8
- data/lib/svmkit/utils.rb +22 -0
- data/lib/svmkit/values.rb +13 -0
- data/lib/svmkit/version.rb +1 -1
- data/svmkit.gemspec +1 -1
- metadata +7 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 1f708500e8ba450849736cd02b152b30e302c1bb
|
4
|
+
data.tar.gz: 210256fcd91375e96b4d68015fae2bf2a5b0d4be
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4a03201b32dc7a5c0db43bfdfe742cc5b369449c2ce0dc63f4905e3e0b9186276f5b382c1b6bff45acdfb91f61712befc58538c1dfa74874722127bec5e2bf03
|
7
|
+
data.tar.gz: deea7c688685935ebe2574448973903115e727cc479b12ea42f382ea697f7218b0de27cccf978c7ea0f4aa0f0fa0bfd5a97ccbbb88e2ea0b87cd1a5ca00cc5f3
|
data/.travis.yml
CHANGED
data/HISTORY.md
CHANGED
data/lib/svmkit.rb
CHANGED
data/lib/svmkit/dataset.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'csv'
|
4
|
+
|
3
5
|
module SVMKit
|
4
6
|
# Module for loading and saving a dataset file.
|
5
7
|
module Dataset
|
@@ -16,11 +18,11 @@ module SVMKit
|
|
16
18
|
ftvecs = []
|
17
19
|
labels = []
|
18
20
|
n_features = 0
|
19
|
-
|
21
|
+
CSV.foreach(filename, col_sep: "\s", headers: false) do |line|
|
20
22
|
label, ftvec, max_idx = parse_libsvm_line(line, zero_based)
|
21
23
|
labels.push(label)
|
22
24
|
ftvecs.push(ftvec)
|
23
|
-
n_features =
|
25
|
+
n_features = max_idx if n_features < max_idx
|
24
26
|
end
|
25
27
|
[convert_to_matrix(ftvecs, n_features), Numo::NArray.asarray(labels)]
|
26
28
|
end
|
@@ -48,16 +50,17 @@ module SVMKit
|
|
48
50
|
private
|
49
51
|
|
50
52
|
def parse_libsvm_line(line, zero_based)
|
51
|
-
|
52
|
-
|
53
|
-
|
53
|
+
label = parse_label(line.shift)
|
54
|
+
adj_idx = zero_based == false ? 1 : 0
|
55
|
+
max_idx = -1
|
56
|
+
ftvec = []
|
57
|
+
while (el = line.shift)
|
54
58
|
idx, val = el.split(':')
|
55
|
-
idx = idx.to_i -
|
59
|
+
idx = idx.to_i - adj_idx
|
56
60
|
val = val.to_i.to_s == val ? val.to_i : val.to_f
|
57
|
-
|
61
|
+
max_idx = idx if max_idx < idx
|
62
|
+
ftvec.push([idx, val])
|
58
63
|
end
|
59
|
-
max_idx = ftvec.map { |el| el[0] }.max
|
60
|
-
max_idx ||= 0
|
61
64
|
[label, ftvec, max_idx]
|
62
65
|
end
|
63
66
|
|
@@ -1,6 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'svmkit/validation'
|
4
|
+
require 'svmkit/values'
|
5
|
+
require 'svmkit/utils'
|
4
6
|
require 'svmkit/base/base_estimator'
|
5
7
|
require 'svmkit/base/classifier'
|
6
8
|
require 'svmkit/tree/decision_tree_classifier'
|
@@ -22,6 +24,7 @@ module SVMKit
|
|
22
24
|
class AdaBoostClassifier
|
23
25
|
include Base::BaseEstimator
|
24
26
|
include Base::Classifier
|
27
|
+
include Validation
|
25
28
|
|
26
29
|
# Return the set of estimators.
|
27
30
|
# @return [Array<DecisionTreeClassifier>]
|
@@ -52,15 +55,16 @@ module SVMKit
|
|
52
55
|
# If nil is given, split process considers all features.
|
53
56
|
# @param random_seed [Integer] The seed value using to initialize the random generator.
|
54
57
|
# It is used to randomly determine the order of features when deciding spliting point.
|
55
|
-
def initialize(n_estimators: 50,
|
58
|
+
def initialize(n_estimators: 50,
|
59
|
+
criterion: 'gini', max_depth: nil, max_leaf_nodes: nil, min_samples_leaf: 1,
|
56
60
|
max_features: nil, random_seed: nil)
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
61
|
+
check_params_type_or_nil(Integer, max_depth: max_depth, max_leaf_nodes: max_leaf_nodes,
|
62
|
+
max_features: max_features, random_seed: random_seed)
|
63
|
+
check_params_integer(n_estimators: n_estimators, min_samples_leaf: min_samples_leaf)
|
64
|
+
check_params_string(criterion: criterion)
|
65
|
+
check_params_positive(n_estimators: n_estimators, max_depth: max_depth,
|
66
|
+
max_leaf_nodes: max_leaf_nodes, min_samples_leaf: min_samples_leaf,
|
67
|
+
max_features: max_features)
|
64
68
|
@params = {}
|
65
69
|
@params[:n_estimators] = n_estimators
|
66
70
|
@params[:criterion] = criterion
|
@@ -82,9 +86,9 @@ module SVMKit
|
|
82
86
|
# @param y [Numo::Int32] (shape: [n_samples]) The labels to be used for fitting the model.
|
83
87
|
# @return [AdaBoostClassifier] The learned classifier itself.
|
84
88
|
def fit(x, y) # rubocop:disable Metrics/AbcSize
|
85
|
-
|
86
|
-
|
87
|
-
|
89
|
+
check_sample_array(x)
|
90
|
+
check_label_array(y)
|
91
|
+
check_sample_label_size(x, y)
|
88
92
|
## Initialize some variables.
|
89
93
|
n_samples, n_features = x.shape
|
90
94
|
@estimators = []
|
@@ -100,12 +104,12 @@ module SVMKit
|
|
100
104
|
observation_weights = Numo::DFloat.zeros(n_samples) + 1.fdiv(n_samples)
|
101
105
|
@params[:n_estimators].times do |_t|
|
102
106
|
# Fit classfier.
|
103
|
-
ids =
|
107
|
+
ids = SVMKit::Utils.choice_ids(n_samples, observation_weights, @rng)
|
104
108
|
break if y[ids].to_a.uniq.size != n_classes
|
105
109
|
tree = Tree::DecisionTreeClassifier.new(
|
106
110
|
criterion: @params[:criterion], max_depth: @params[:max_depth],
|
107
111
|
max_leaf_nodes: @params[:max_leaf_nodes], min_samples_leaf: @params[:min_samples_leaf],
|
108
|
-
max_features: @params[:max_features], random_seed: @rng.rand(int_max)
|
112
|
+
max_features: @params[:max_features], random_seed: @rng.rand(SVMKit::Values::int_max)
|
109
113
|
)
|
110
114
|
tree.fit(x[ids, true], y[ids])
|
111
115
|
# Calculate estimator error.
|
@@ -134,7 +138,7 @@ module SVMKit
|
|
134
138
|
# @param x [Numo::DFloat] (shape: [n_samples, n_features]) The samples to compute the scores.
|
135
139
|
# @return [Numo::DFloat] (shape: [n_samples, n_classes]) Confidence score per sample.
|
136
140
|
def decision_function(x)
|
137
|
-
|
141
|
+
check_sample_array(x)
|
138
142
|
n_samples, = x.shape
|
139
143
|
n_classes = @classes.size
|
140
144
|
sum_probs = Numo::DFloat.zeros(n_samples, n_classes)
|
@@ -150,7 +154,7 @@ module SVMKit
|
|
150
154
|
# @param x [Numo::DFloat] (shape: [n_samples, n_features]) The samples to predict the labels.
|
151
155
|
# @return [Numo::Int32] (shape: [n_samples]) Predicted class label per sample.
|
152
156
|
def predict(x)
|
153
|
-
|
157
|
+
check_sample_array(x)
|
154
158
|
n_samples, = x.shape
|
155
159
|
probs = decision_function(x)
|
156
160
|
Numo::Int32.asarray(Array.new(n_samples) { |n| @classes[probs[n, true].max_index] })
|
@@ -161,7 +165,7 @@ module SVMKit
|
|
161
165
|
# @param x [Numo::DFloat] (shape: [n_samples, n_features]) The samples to predict the probailities.
|
162
166
|
# @return [Numo::DFloat] (shape: [n_samples, n_classes]) Predicted probability of each class per sample.
|
163
167
|
def predict_proba(x)
|
164
|
-
|
168
|
+
check_sample_array(x)
|
165
169
|
n_classes = @classes.size
|
166
170
|
probs = Numo::NMath.exp(1.fdiv(n_classes - 1) * decision_function(x))
|
167
171
|
sum_probs = probs.sum(1)
|
@@ -172,8 +176,11 @@ module SVMKit
|
|
172
176
|
# Dump marshal data.
|
173
177
|
# @return [Hash] The marshal data about AdaBoostClassifier.
|
174
178
|
def marshal_dump
|
175
|
-
{ params: @params,
|
176
|
-
|
179
|
+
{ params: @params,
|
180
|
+
estimators: @estimators,
|
181
|
+
classes: @classes,
|
182
|
+
feature_importances: @feature_importances,
|
183
|
+
rng: @rng }
|
177
184
|
end
|
178
185
|
|
179
186
|
# Load marshal data.
|
@@ -186,27 +193,6 @@ module SVMKit
|
|
186
193
|
@rng = obj[:rng]
|
187
194
|
nil
|
188
195
|
end
|
189
|
-
|
190
|
-
private
|
191
|
-
|
192
|
-
def weighted_sampling(weights)
|
193
|
-
Array.new(weights.size) do
|
194
|
-
target = @rng.rand
|
195
|
-
chosen = 0
|
196
|
-
weights.each_with_index do |w, idx|
|
197
|
-
if target <= w
|
198
|
-
chosen = idx
|
199
|
-
break
|
200
|
-
end
|
201
|
-
target -= w
|
202
|
-
end
|
203
|
-
chosen
|
204
|
-
end
|
205
|
-
end
|
206
|
-
|
207
|
-
def int_max
|
208
|
-
@int_max ||= 2**([42].pack('i').size * 16 - 2) - 1
|
209
|
-
end
|
210
196
|
end
|
211
197
|
end
|
212
198
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'svmkit/validation'
|
4
|
+
require 'svmkit/values'
|
4
5
|
require 'svmkit/base/base_estimator'
|
5
6
|
require 'svmkit/base/regressor'
|
6
7
|
require 'svmkit/tree/decision_tree_regressor'
|
@@ -106,11 +107,11 @@ module SVMKit
|
|
106
107
|
# Construct forest.
|
107
108
|
@params[:n_estimators].times do |_t|
|
108
109
|
# Fit weak learner.
|
109
|
-
ids =
|
110
|
+
ids = SVMKit::Utils.choice_ids(n_samples, observation_weights, @rng)
|
110
111
|
tree = Tree::DecisionTreeRegressor.new(
|
111
112
|
criterion: @params[:criterion], max_depth: @params[:max_depth],
|
112
113
|
max_leaf_nodes: @params[:max_leaf_nodes], min_samples_leaf: @params[:min_samples_leaf],
|
113
|
-
max_features: @params[:max_features], random_seed: @rng.rand(int_max)
|
114
|
+
max_features: @params[:max_features], random_seed: @rng.rand(SVMKit::Values::int_max)
|
114
115
|
)
|
115
116
|
tree.fit(x[ids, true], y[ids])
|
116
117
|
p = tree.predict(x)
|
@@ -174,27 +175,6 @@ module SVMKit
|
|
174
175
|
@rng = obj[:rng]
|
175
176
|
nil
|
176
177
|
end
|
177
|
-
|
178
|
-
private
|
179
|
-
|
180
|
-
def weighted_sampling(weights)
|
181
|
-
Array.new(weights.size) do
|
182
|
-
target = @rng.rand
|
183
|
-
chosen = 0
|
184
|
-
weights.each_with_index do |w, idx|
|
185
|
-
if target <= w
|
186
|
-
chosen = idx
|
187
|
-
break
|
188
|
-
end
|
189
|
-
target -= w
|
190
|
-
end
|
191
|
-
chosen
|
192
|
-
end
|
193
|
-
end
|
194
|
-
|
195
|
-
def int_max
|
196
|
-
@int_max ||= 2**([42].pack('i').size * 16 - 2) - 1
|
197
|
-
end
|
198
178
|
end
|
199
179
|
end
|
200
180
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'svmkit/validation'
|
4
|
+
require 'svmkit/values'
|
4
5
|
require 'svmkit/base/base_estimator'
|
5
6
|
require 'svmkit/base/classifier'
|
6
7
|
require 'svmkit/tree/decision_tree_classifier'
|
@@ -20,6 +21,7 @@ module SVMKit
|
|
20
21
|
class RandomForestClassifier
|
21
22
|
include Base::BaseEstimator
|
22
23
|
include Base::Classifier
|
24
|
+
include Validation
|
23
25
|
|
24
26
|
# Return the set of estimators.
|
25
27
|
# @return [Array<DecisionTreeClassifier>]
|
@@ -50,15 +52,16 @@ module SVMKit
|
|
50
52
|
# If nil is given, split process considers all features.
|
51
53
|
# @param random_seed [Integer] The seed value using to initialize the random generator.
|
52
54
|
# It is used to randomly determine the order of features when deciding spliting point.
|
53
|
-
def initialize(n_estimators: 10,
|
55
|
+
def initialize(n_estimators: 10,
|
56
|
+
criterion: 'gini', max_depth: nil, max_leaf_nodes: nil, min_samples_leaf: 1,
|
54
57
|
max_features: nil, random_seed: nil)
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
58
|
+
check_params_type_or_nil(Integer, max_depth: max_depth, max_leaf_nodes: max_leaf_nodes,
|
59
|
+
max_features: max_features, random_seed: random_seed)
|
60
|
+
check_params_integer(n_estimators: n_estimators, min_samples_leaf: min_samples_leaf)
|
61
|
+
check_params_string(criterion: criterion)
|
62
|
+
check_params_positive(n_estimators: n_estimators, max_depth: max_depth,
|
63
|
+
max_leaf_nodes: max_leaf_nodes, min_samples_leaf: min_samples_leaf,
|
64
|
+
max_features: max_features)
|
62
65
|
@params = {}
|
63
66
|
@params[:n_estimators] = n_estimators
|
64
67
|
@params[:criterion] = criterion
|
@@ -80,9 +83,9 @@ module SVMKit
|
|
80
83
|
# @param y [Numo::Int32] (shape: [n_samples]) The labels to be used for fitting the model.
|
81
84
|
# @return [RandomForestClassifier] The learned classifier itself.
|
82
85
|
def fit(x, y)
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
+
check_sample_array(x)
|
87
|
+
check_label_array(y)
|
88
|
+
check_sample_label_size(x, y)
|
86
89
|
# Initialize some variables.
|
87
90
|
n_samples, n_features = x.shape
|
88
91
|
@params[:max_features] = Math.sqrt(n_features).to_i unless @params[:max_features].is_a?(Integer)
|
@@ -94,7 +97,7 @@ module SVMKit
|
|
94
97
|
tree = Tree::DecisionTreeClassifier.new(
|
95
98
|
criterion: @params[:criterion], max_depth: @params[:max_depth],
|
96
99
|
max_leaf_nodes: @params[:max_leaf_nodes], min_samples_leaf: @params[:min_samples_leaf],
|
97
|
-
max_features: @params[:max_features], random_seed: @rng.rand(int_max)
|
100
|
+
max_features: @params[:max_features], random_seed: @rng.rand(SVMKit::Values::int_max)
|
98
101
|
)
|
99
102
|
bootstrap_ids = Array.new(n_samples) { @rng.rand(0...n_samples) }
|
100
103
|
tree.fit(x[bootstrap_ids, true], y[bootstrap_ids])
|
@@ -110,7 +113,7 @@ module SVMKit
|
|
110
113
|
# @param x [Numo::DFloat] (shape: [n_samples, n_features]) The samples to predict the labels.
|
111
114
|
# @return [Numo::Int32] (shape: [n_samples]) Predicted class label per sample.
|
112
115
|
def predict(x)
|
113
|
-
|
116
|
+
check_sample_array(x)
|
114
117
|
n_samples, = x.shape
|
115
118
|
n_classes = @classes.size
|
116
119
|
classes_arr = @classes.to_a
|
@@ -130,7 +133,7 @@ module SVMKit
|
|
130
133
|
# @param x [Numo::DFloat] (shape: [n_samples, n_features]) The samples to predict the probailities.
|
131
134
|
# @return [Numo::DFloat] (shape: [n_samples, n_classes]) Predicted probability of each class per sample.
|
132
135
|
def predict_proba(x)
|
133
|
-
|
136
|
+
check_sample_array(x)
|
134
137
|
n_samples, = x.shape
|
135
138
|
n_classes = @classes.size
|
136
139
|
classes_arr = @classes.to_a
|
@@ -150,7 +153,7 @@ module SVMKit
|
|
150
153
|
# @param x [Numo::DFloat] (shape: [n_samples, n_features]) The samples to predict the labels.
|
151
154
|
# @return [Numo::Int32] (shape: [n_samples, n_estimators]) Leaf index for sample.
|
152
155
|
def apply(x)
|
153
|
-
|
156
|
+
check_sample_array(x)
|
154
157
|
Numo::Int32[*Array.new(@params[:n_estimators]) { |n| @estimators[n].apply(x) }].transpose
|
155
158
|
end
|
156
159
|
|
@@ -174,12 +177,6 @@ module SVMKit
|
|
174
177
|
@rng = obj[:rng]
|
175
178
|
nil
|
176
179
|
end
|
177
|
-
|
178
|
-
private
|
179
|
-
|
180
|
-
def int_max
|
181
|
-
@int_max ||= 2**([42].pack('i').size * 16 - 2) - 1
|
182
|
-
end
|
183
180
|
end
|
184
181
|
end
|
185
182
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'svmkit/validation'
|
4
|
+
require 'svmkit/values'
|
4
5
|
require 'svmkit/base/base_estimator'
|
5
6
|
require 'svmkit/base/regressor'
|
6
7
|
require 'svmkit/tree/decision_tree_regressor'
|
@@ -46,7 +47,8 @@ module SVMKit
|
|
46
47
|
# If nil is given, split process considers all features.
|
47
48
|
# @param random_seed [Integer] The seed value using to initialize the random generator.
|
48
49
|
# It is used to randomly determine the order of features when deciding spliting point.
|
49
|
-
def initialize(n_estimators: 10,
|
50
|
+
def initialize(n_estimators: 10,
|
51
|
+
criterion: 'mse', max_depth: nil, max_leaf_nodes: nil, min_samples_leaf: 1,
|
50
52
|
max_features: nil, random_seed: nil)
|
51
53
|
check_params_type_or_nil(Integer, max_depth: max_depth, max_leaf_nodes: max_leaf_nodes,
|
52
54
|
max_features: max_features, random_seed: random_seed)
|
@@ -89,7 +91,7 @@ module SVMKit
|
|
89
91
|
tree = Tree::DecisionTreeRegressor.new(
|
90
92
|
criterion: @params[:criterion], max_depth: @params[:max_depth],
|
91
93
|
max_leaf_nodes: @params[:max_leaf_nodes], min_samples_leaf: @params[:min_samples_leaf],
|
92
|
-
max_features: @params[:max_features], random_seed: @rng.rand(int_max)
|
94
|
+
max_features: @params[:max_features], random_seed: @rng.rand(SVMKit::Values::int_max)
|
93
95
|
)
|
94
96
|
bootstrap_ids = Array.new(n_samples) { @rng.rand(0...n_samples) }
|
95
97
|
tree.fit(x[bootstrap_ids, true], single_target ? y[bootstrap_ids] : y[bootstrap_ids, true])
|
@@ -136,12 +138,6 @@ module SVMKit
|
|
136
138
|
@rng = obj[:rng]
|
137
139
|
nil
|
138
140
|
end
|
139
|
-
|
140
|
-
private
|
141
|
-
|
142
|
-
def int_max
|
143
|
-
@int_max ||= 2**([42].pack('i').size * 16 - 2) - 1
|
144
|
-
end
|
145
141
|
end
|
146
142
|
end
|
147
143
|
end
|
data/lib/svmkit/utils.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SVMKit
|
4
|
+
# @!visibility private
|
5
|
+
module Utils
|
6
|
+
module_function
|
7
|
+
|
8
|
+
# @!visibility private
|
9
|
+
def choice_ids(size, probs, rng=nil)
|
10
|
+
rng ||= Random.new
|
11
|
+
Array.new(size) do
|
12
|
+
target = rng.rand
|
13
|
+
chosen = 0
|
14
|
+
probs.each_with_index do |p, idx|
|
15
|
+
break (chosen = idx) if target <= p
|
16
|
+
target -= p
|
17
|
+
end
|
18
|
+
chosen
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/svmkit/version.rb
CHANGED
data/svmkit.gemspec
CHANGED
@@ -35,7 +35,7 @@ MSG
|
|
35
35
|
|
36
36
|
spec.add_runtime_dependency 'numo-narray', '>= 0.9.1'
|
37
37
|
|
38
|
-
spec.add_development_dependency 'bundler', '
|
38
|
+
spec.add_development_dependency 'bundler', '>= 1.16'
|
39
39
|
spec.add_development_dependency 'coveralls', '~> 0.8'
|
40
40
|
spec.add_development_dependency 'rake', '~> 12.0'
|
41
41
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: svmkit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- yoshoku
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-12-
|
11
|
+
date: 2018-12-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: numo-narray
|
@@ -28,14 +28,14 @@ dependencies:
|
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '1.16'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '1.16'
|
41
41
|
- !ruby/object:Gem::Dependency
|
@@ -168,7 +168,9 @@ files:
|
|
168
168
|
- lib/svmkit/tree/decision_tree_classifier.rb
|
169
169
|
- lib/svmkit/tree/decision_tree_regressor.rb
|
170
170
|
- lib/svmkit/tree/node.rb
|
171
|
+
- lib/svmkit/utils.rb
|
171
172
|
- lib/svmkit/validation.rb
|
173
|
+
- lib/svmkit/values.rb
|
172
174
|
- lib/svmkit/version.rb
|
173
175
|
- svmkit.gemspec
|
174
176
|
homepage: https://github.com/yoshoku/svmkit
|
@@ -191,7 +193,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
191
193
|
version: '0'
|
192
194
|
requirements: []
|
193
195
|
rubyforge_project:
|
194
|
-
rubygems_version: 2.
|
196
|
+
rubygems_version: 2.5.2.3
|
195
197
|
signing_key:
|
196
198
|
specification_version: 4
|
197
199
|
summary: SVMKit is a machine learninig library in Ruby. SVMKit provides machine learning
|