svmkit 0.6.3 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8f6c3a9b6df704497579a44ed1649baeff28364d8992cc781babb03ee1fe836a
4
- data.tar.gz: 99502858d1cecbe65efe5ee342cc6719278f227b1305c75d5305d3362d00e295
3
+ metadata.gz: 1e3564c00ae91e7c4cc9db2d19b19df0158803571a18ba9b1446bea22c36b93e
4
+ data.tar.gz: ebd9a2d55e3935533144bc25498bc9db24d95cfa74fa9b2e8d6299a8b7d54409
5
5
  SHA512:
6
- metadata.gz: 86bf9a6ce8de82c7b51c9f7ff3451c9834ca73a84abb48394769e65bf80ebf8b00c565f27b69882719ad81c5b33a27af0156cc1b3cc2949f530eeacf11560718
7
- data.tar.gz: 14a4e5a9becd0b41f43ba1a4cdee545f12f8d18f339feae789593c527025a9c6c0bb50d7471c5ffefffbe1ba96dc46e409aaa25e781ef52830adac476531ce58
6
+ metadata.gz: 3fc3e77783fa89bb73b68bd39c21251eae553f8f70259dab31189569b1950f760b72c41b5f839e4d133d156f952995cd2201f2538076435828d19393ea8df007
7
+ data.tar.gz: 953a07537d01e28b4c00714aebcea67789e654896af7ed5bb18900fcbf3d3fdd0be6d60bf8bfe43932e9e6b0e17fc1ade13aa7c9a9aeb564cbcfd79626979bcc
data/HISTORY.md CHANGED
@@ -1,3 +1,7 @@
1
+ # 0.7.0
2
+ - Add class for AdaBoost classifier.
3
+ - Add class for AdaBoost regressor.
4
+
1
5
  # 0.6.3
2
6
  - Fix bug on setting random seed and max_features parameter of Random Forest estimators.
3
7
 
data/README.md CHANGED
@@ -9,7 +9,7 @@ SVMKit is a machine learninig library in Ruby.
9
9
  SVMKit provides machine learning algorithms with interfaces similar to Scikit-Learn in Python.
10
10
  SVMKit currently supports Linear / Kernel Support Vector Machine,
11
11
  Logistic Regression, Linear Regression, Ridge, Lasso, Factorization Machine,
12
- Naive Bayes, Decision Tree, Random Forest, K-nearest neighbor classifier,
12
+ Naive Bayes, Decision Tree, AdaBoost, Random Forest, K-nearest neighbor classifier,
13
13
  K-Means, DBSCAN, Principal Component Analysis, Non-negative Matrix Factorization
14
14
  and cross-validation.
15
15
 
@@ -36,6 +36,8 @@ require 'svmkit/naive_bayes/naive_bayes'
36
36
  require 'svmkit/tree/node'
37
37
  require 'svmkit/tree/decision_tree_classifier'
38
38
  require 'svmkit/tree/decision_tree_regressor'
39
+ require 'svmkit/ensemble/ada_boost_classifier'
40
+ require 'svmkit/ensemble/ada_boost_regressor'
39
41
  require 'svmkit/ensemble/random_forest_classifier'
40
42
  require 'svmkit/ensemble/random_forest_regressor'
41
43
  require 'svmkit/clustering/k_means'
@@ -0,0 +1,212 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'svmkit/validation'
4
+ require 'svmkit/base/base_estimator'
5
+ require 'svmkit/base/classifier'
6
+ require 'svmkit/tree/decision_tree_classifier'
7
+
8
+ module SVMKit
9
+ module Ensemble
10
+ # AdaBoostClassifier is a class that implements AdaBoost (SAMME.R) for classification.
11
+ # This class uses decision tree for a weak learner.
12
+ #
13
+ # @example
14
+ # estimator =
15
+ # SVMKit::Ensemble::AdaBoostClassifier.new(
16
+ # n_estimators: 10, criterion: 'gini', max_depth: 3, max_leaf_nodes: 10, min_samples_leaf: 5, random_seed: 1)
17
+ # estimator.fit(training_samples, traininig_labels)
18
+ # results = estimator.predict(testing_samples)
19
+ #
20
+ # *Reference*
21
+ # - J. Zhu, S. Rosset, H. Zou, and T.Hashie, "Multi-class AdaBoost," Technical Report No. 430, Department of Statistics, University of Michigan, 2005.
22
+ class AdaBoostClassifier
23
+ include Base::BaseEstimator
24
+ include Base::Classifier
25
+
26
+ # Return the set of estimators.
27
+ # @return [Array<DecisionTreeClassifier>]
28
+ attr_reader :estimators
29
+
30
+ # Return the class labels.
31
+ # @return [Numo::Int32] (size: n_classes)
32
+ attr_reader :classes
33
+
34
+ # Return the importance for each feature.
35
+ # @return [Numo::DFloat] (size: n_features)
36
+ attr_reader :feature_importances
37
+
38
+ # Return the random generator for random selection of feature index.
39
+ # @return [Random]
40
+ attr_reader :rng
41
+
42
+ # Create a new classifier with AdaBoost.
43
+ #
44
+ # @param n_estimators [Integer] The numeber of decision trees for contructing random forest.
45
+ # @param criterion [String] The function to evalue spliting point. Supported criteria are 'gini' and 'entropy'.
46
+ # @param max_depth [Integer] The maximum depth of the tree.
47
+ # If nil is given, decision tree grows without concern for depth.
48
+ # @param max_leaf_nodes [Integer] The maximum number of leaves on decision tree.
49
+ # If nil is given, number of leaves is not limited.
50
+ # @param min_samples_leaf [Integer] The minimum number of samples at a leaf node.
51
+ # @param max_features [Integer] The number of features to consider when searching optimal split point.
52
+ # If nil is given, split process considers all features.
53
+ # @param random_seed [Integer] The seed value using to initialize the random generator.
54
+ # It is used to randomly determine the order of features when deciding spliting point.
55
+ def initialize(n_estimators: 50, criterion: 'gini', max_depth: nil, max_leaf_nodes: nil, min_samples_leaf: 1,
56
+ max_features: nil, random_seed: nil)
57
+ SVMKit::Validation.check_params_type_or_nil(Integer, max_depth: max_depth, max_leaf_nodes: max_leaf_nodes,
58
+ max_features: max_features, random_seed: random_seed)
59
+ SVMKit::Validation.check_params_integer(n_estimators: n_estimators, min_samples_leaf: min_samples_leaf)
60
+ SVMKit::Validation.check_params_string(criterion: criterion)
61
+ SVMKit::Validation.check_params_positive(n_estimators: n_estimators, max_depth: max_depth,
62
+ max_leaf_nodes: max_leaf_nodes, min_samples_leaf: min_samples_leaf,
63
+ max_features: max_features)
64
+ @params = {}
65
+ @params[:n_estimators] = n_estimators
66
+ @params[:criterion] = criterion
67
+ @params[:max_depth] = max_depth
68
+ @params[:max_leaf_nodes] = max_leaf_nodes
69
+ @params[:min_samples_leaf] = min_samples_leaf
70
+ @params[:max_features] = max_features
71
+ @params[:random_seed] = random_seed
72
+ @params[:random_seed] ||= srand
73
+ @estimators = nil
74
+ @classes = nil
75
+ @feature_importances = nil
76
+ @rng = Random.new(@params[:random_seed])
77
+ end
78
+
79
+ # Fit the model with given training data.
80
+ #
81
+ # @param x [Numo::DFloat] (shape: [n_samples, n_features]) The training data to be used for fitting the model.
82
+ # @param y [Numo::Int32] (shape: [n_samples]) The labels to be used for fitting the model.
83
+ # @return [AdaBoostClassifier] The learned classifier itself.
84
+ def fit(x, y) # rubocop:disable Metrics/AbcSize
85
+ SVMKit::Validation.check_sample_array(x)
86
+ SVMKit::Validation.check_label_array(y)
87
+ SVMKit::Validation.check_sample_label_size(x, y)
88
+ ## Initialize some variables.
89
+ n_samples, n_features = x.shape
90
+ @estimators = []
91
+ @feature_importances = Numo::DFloat.zeros(n_features)
92
+ @params[:max_features] = n_features unless @params[:max_features].is_a?(Integer)
93
+ @params[:max_features] = [[1, @params[:max_features]].max, n_features].min
94
+ @classes = Numo::Int32.asarray(y.to_a.uniq.sort)
95
+ n_classes = @classes.shape[0]
96
+ ## Boosting.
97
+ classes_arr = @classes.to_a
98
+ y_codes = Numo::DFloat.zeros(n_samples, n_classes) - 1.fdiv(n_classes - 1)
99
+ n_samples.times { |n| y_codes[n, classes_arr.index(y[n])] = 1.0 }
100
+ observation_weights = Numo::DFloat.zeros(n_samples) + 1.fdiv(n_samples)
101
+ @params[:n_estimators].times do |_t|
102
+ # Fit classfier.
103
+ ids = weighted_sampling(observation_weights)
104
+ break if y[ids].to_a.uniq.size != n_classes
105
+ tree = Tree::DecisionTreeClassifier.new(
106
+ criterion: @params[:criterion], max_depth: @params[:max_depth],
107
+ 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)
109
+ )
110
+ tree.fit(x[ids, true], y[ids])
111
+ # Calculate estimator error.
112
+ proba = tree.predict_proba(x).clip(1.0e-15, nil)
113
+ p = Numo::Int32.asarray(Array.new(n_samples) { |n| @classes[proba[n, true].max_index] })
114
+ inds = p.ne(y)
115
+ error = (observation_weights * inds).sum / observation_weights.sum
116
+ # Store model.
117
+ @estimators.push(tree)
118
+ @feature_importances += tree.feature_importances
119
+ break if error.zero?
120
+ # Update observation weights.
121
+ log_proba = Numo::NMath.log(proba)
122
+ observation_weights *= Numo::NMath.exp(-1.0 * (n_classes - 1).fdiv(n_classes) * (y_codes * log_proba).sum(1))
123
+ observation_weights = observation_weights.clip(1.0e-15, nil)
124
+ sum_observation_weights = observation_weights.sum
125
+ break if sum_observation_weights.zero?
126
+ observation_weights /= sum_observation_weights
127
+ end
128
+ @feature_importances /= @feature_importances.sum
129
+ self
130
+ end
131
+
132
+ # Calculate confidence scores for samples.
133
+ #
134
+ # @param x [Numo::DFloat] (shape: [n_samples, n_features]) The samples to compute the scores.
135
+ # @return [Numo::DFloat] (shape: [n_samples, n_classes]) Confidence score per sample.
136
+ def decision_function(x)
137
+ SVMKit::Validation.check_sample_array(x)
138
+ n_samples, = x.shape
139
+ n_classes = @classes.size
140
+ sum_probs = Numo::DFloat.zeros(n_samples, n_classes)
141
+ @estimators.each do |tree|
142
+ log_proba = Numo::NMath.log(tree.predict_proba(x).clip(1.0e-15, nil))
143
+ sum_probs += (n_classes - 1) * (log_proba - 1.fdiv(n_classes) * Numo::DFloat[log_proba.sum(1)].transpose)
144
+ end
145
+ sum_probs /= @estimators.size
146
+ end
147
+
148
+ # Predict class labels for samples.
149
+ #
150
+ # @param x [Numo::DFloat] (shape: [n_samples, n_features]) The samples to predict the labels.
151
+ # @return [Numo::Int32] (shape: [n_samples]) Predicted class label per sample.
152
+ def predict(x)
153
+ SVMKit::Validation.check_sample_array(x)
154
+ n_samples, = x.shape
155
+ probs = decision_function(x)
156
+ Numo::Int32.asarray(Array.new(n_samples) { |n| @classes[probs[n, true].max_index] })
157
+ end
158
+
159
+ # Predict probability for samples.
160
+ #
161
+ # @param x [Numo::DFloat] (shape: [n_samples, n_features]) The samples to predict the probailities.
162
+ # @return [Numo::DFloat] (shape: [n_samples, n_classes]) Predicted probability of each class per sample.
163
+ def predict_proba(x)
164
+ SVMKit::Validation.check_sample_array(x)
165
+ n_classes = @classes.size
166
+ probs = Numo::NMath.exp(1.fdiv(n_classes - 1) * decision_function(x))
167
+ sum_probs = probs.sum(1)
168
+ probs /= Numo::DFloat[sum_probs].transpose
169
+ probs
170
+ end
171
+
172
+ # Dump marshal data.
173
+ # @return [Hash] The marshal data about AdaBoostClassifier.
174
+ def marshal_dump
175
+ { params: @params, estimators: @estimators, classes: @classes,
176
+ feature_importances: @feature_importances, rng: @rng }
177
+ end
178
+
179
+ # Load marshal data.
180
+ # @return [nil]
181
+ def marshal_load(obj)
182
+ @params = obj[:params]
183
+ @estimators = obj[:estimators]
184
+ @classes = obj[:classes]
185
+ @feature_importances = obj[:feature_importances]
186
+ @rng = obj[:rng]
187
+ nil
188
+ 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
+ end
211
+ end
212
+ end
@@ -0,0 +1,200 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'svmkit/validation'
4
+ require 'svmkit/base/base_estimator'
5
+ require 'svmkit/base/regressor'
6
+ require 'svmkit/tree/decision_tree_regressor'
7
+
8
+ module SVMKit
9
+ module Ensemble
10
+ # AdaBoostRegressor is a class that implements random forest for regression
11
+ # This class uses decision tree for a weak learner.
12
+ #
13
+ # @example
14
+ # estimator =
15
+ # SVMKit::Ensemble::AdaBoostRegressor.new(
16
+ # n_estimators: 10, criterion: 'mse', max_depth: 3, max_leaf_nodes: 10, min_samples_leaf: 5, random_seed: 1)
17
+ # estimator.fit(training_samples, traininig_values)
18
+ # results = estimator.predict(testing_samples)
19
+ #
20
+ # *Reference*
21
+ # - D. L. Shrestha and D. P. Solomatine, "Experiments with AdaBoost.RT, an Improved Boosting Scheme for Regression," Neural Computation 18 (7), pp. 1678--1710, 2006.
22
+ #
23
+ class AdaBoostRegressor
24
+ include Base::BaseEstimator
25
+ include Base::Regressor
26
+ include Validation
27
+
28
+ # Return the set of estimators.
29
+ # @return [Array<DecisionTreeRegressor>]
30
+ attr_reader :estimators
31
+
32
+ # Return the weight for each weak learner.
33
+ # @return [Numo::DFloat] (size: n_estimates)
34
+ attr_reader :estimator_weights
35
+
36
+ # Return the importance for each feature.
37
+ # @return [Numo::DFloat] (size: n_features)
38
+ attr_reader :feature_importances
39
+
40
+ # Return the random generator for random selection of feature index.
41
+ # @return [Random]
42
+ attr_reader :rng
43
+
44
+ # Create a new regressor with random forest.
45
+ #
46
+ # @param n_estimators [Integer] The numeber of decision trees for contructing random forest.
47
+ # @param threshold [Float] The threshold for delimiting correct and incorrect predictions. That is constrained to [0, 1]
48
+ # @param exponent [Float] The exponent for the weight of each weak learner.
49
+ # @param criterion [String] The function to evalue spliting point. Supported criteria are 'gini' and 'entropy'.
50
+ # @param max_depth [Integer] The maximum depth of the tree.
51
+ # If nil is given, decision tree grows without concern for depth.
52
+ # @param max_leaf_nodes [Integer] The maximum number of leaves on decision tree.
53
+ # If nil is given, number of leaves is not limited.
54
+ # @param min_samples_leaf [Integer] The minimum number of samples at a leaf node.
55
+ # @param max_features [Integer] The number of features to consider when searching optimal split point.
56
+ # If nil is given, split process considers all features.
57
+ # @param random_seed [Integer] The seed value using to initialize the random generator.
58
+ # It is used to randomly determine the order of features when deciding spliting point.
59
+ def initialize(n_estimators: 10, threshold: 0.2, exponent: 1.0,
60
+ criterion: 'mse', max_depth: nil, max_leaf_nodes: nil, min_samples_leaf: 1,
61
+ max_features: nil, random_seed: nil)
62
+ check_params_type_or_nil(Integer, max_depth: max_depth, max_leaf_nodes: max_leaf_nodes,
63
+ max_features: max_features, random_seed: random_seed)
64
+ check_params_integer(n_estimators: n_estimators, min_samples_leaf: min_samples_leaf)
65
+ check_params_float(threshold: threshold, exponent: exponent)
66
+ check_params_string(criterion: criterion)
67
+ check_params_positive(n_estimators: n_estimators, threshold: threshold, exponent: exponent,
68
+ max_depth: max_depth,
69
+ max_leaf_nodes: max_leaf_nodes, min_samples_leaf: min_samples_leaf,
70
+ max_features: max_features)
71
+ @params = {}
72
+ @params[:n_estimators] = n_estimators
73
+ @params[:threshold] = threshold
74
+ @params[:exponent] = exponent
75
+ @params[:criterion] = criterion
76
+ @params[:max_depth] = max_depth
77
+ @params[:max_leaf_nodes] = max_leaf_nodes
78
+ @params[:min_samples_leaf] = min_samples_leaf
79
+ @params[:max_features] = max_features
80
+ @params[:random_seed] = random_seed
81
+ @params[:random_seed] ||= srand
82
+ @estimators = nil
83
+ @feature_importances = nil
84
+ @rng = Random.new(@params[:random_seed])
85
+ end
86
+
87
+ # Fit the model with given training data.
88
+ #
89
+ # @param x [Numo::DFloat] (shape: [n_samples, n_features]) The training data to be used for fitting the model.
90
+ # @param y [Numo::DFloat] (shape: [n_samples]) The target values to be used for fitting the model.
91
+ # @return [AdaBoostRegressor] The learned regressor itself.
92
+ def fit(x, y) # rubocop:disable Metrics/AbcSize
93
+ check_sample_array(x)
94
+ check_tvalue_array(y)
95
+ check_sample_tvalue_size(x, y)
96
+ # Check target values
97
+ raise ArgumentError, 'Expect target value vector to be 1-D arrray' unless y.shape.size == 1
98
+ # Initialize some variables.
99
+ n_samples, n_features = x.shape
100
+ @params[:max_features] = n_features unless @params[:max_features].is_a?(Integer)
101
+ @params[:max_features] = [[1, @params[:max_features]].max, n_features].min
102
+ observation_weights = Numo::DFloat.zeros(n_samples) + 1.fdiv(n_samples)
103
+ @estimators = []
104
+ @estimator_weights = []
105
+ @feature_importances = Numo::DFloat.zeros(n_features)
106
+ # Construct forest.
107
+ @params[:n_estimators].times do |_t|
108
+ # Fit weak learner.
109
+ ids = weighted_sampling(observation_weights)
110
+ tree = Tree::DecisionTreeRegressor.new(
111
+ criterion: @params[:criterion], max_depth: @params[:max_depth],
112
+ 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
+ )
115
+ tree.fit(x[ids, true], y[ids])
116
+ p = tree.predict(x)
117
+ # Calculate errors.
118
+ abs_err = ((p - y) / y).abs
119
+ err = observation_weights[abs_err.gt(@params[:threshold])].sum
120
+ break if err <= 0.0
121
+ # Calculate weight.
122
+ beta = err**@params[:exponent]
123
+ weight = Math.log(1.fdiv(beta))
124
+ # Store model.
125
+ @estimators.push(tree)
126
+ @estimator_weights.push(weight)
127
+ @feature_importances += weight * tree.feature_importances
128
+ # Update observation weights.
129
+ update = Numo::DFloat.ones(n_samples)
130
+ update[abs_err.le(@params[:threshold])] = beta
131
+ observation_weights *= update
132
+ observation_weights = observation_weights.clip(1.0e-15, nil)
133
+ sum_observation_weights = observation_weights.sum
134
+ break if sum_observation_weights.zero?
135
+ observation_weights /= sum_observation_weights
136
+ end
137
+ @estimator_weights = Numo::DFloat.asarray(@estimator_weights)
138
+ @feature_importances /= @estimator_weights.sum
139
+ self
140
+ end
141
+
142
+ # Predict values for samples.
143
+ #
144
+ # @param x [Numo::DFloat] (shape: [n_samples, n_features]) The samples to predict the values.
145
+ # @return [Numo::DFloat] (shape: [n_samples, n_outputs]) Predicted value per sample.
146
+ def predict(x)
147
+ check_sample_array(x)
148
+ n_samples, = x.shape
149
+ predictions = Numo::DFloat.zeros(n_samples)
150
+ @estimators.size.times do |t|
151
+ predictions += @estimator_weights[t] * @estimators[t].predict(x)
152
+ end
153
+ sum_weight = @estimator_weights.sum
154
+ predictions / sum_weight
155
+ end
156
+
157
+ # Dump marshal data.
158
+ # @return [Hash] The marshal data about AdaBoostRegressor.
159
+ def marshal_dump
160
+ { params: @params,
161
+ estimators: @estimators,
162
+ estimator_weights: @estimator_weights,
163
+ feature_importances: @feature_importances,
164
+ rng: @rng }
165
+ end
166
+
167
+ # Load marshal data.
168
+ # @return [nil]
169
+ def marshal_load(obj)
170
+ @params = obj[:params]
171
+ @estimators = obj[:estimators]
172
+ @estimator_weights = obj[:estimator_weights]
173
+ @feature_importances = obj[:feature_importances]
174
+ @rng = obj[:rng]
175
+ nil
176
+ 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
+ end
199
+ end
200
+ end
@@ -3,5 +3,5 @@
3
3
  # SVMKit is a machine learning library in Ruby.
4
4
  module SVMKit
5
5
  # @!visibility private
6
- VERSION = '0.6.3'.freeze
6
+ VERSION = '0.7.0'.freeze
7
7
  end
@@ -17,7 +17,7 @@ SVMKit is a machine learninig library in Ruby.
17
17
  SVMKit provides machine learning algorithms with interfaces similar to Scikit-Learn in Python.
18
18
  SVMKit currently supports Linear / Kernel Support Vector Machine,
19
19
  Logistic Regression, Linear Regression, Ridge, Lasso, Factorization Machine,
20
- Naive Bayes, Decision Tree, Random Forest, K-nearest neighbor algorithm,
20
+ Naive Bayes, Decision Tree, AdaBoost, Random Forest, K-nearest neighbor algorithm,
21
21
  K-Means, DBSCAN, Principal Component Analysis, Non-negative Matrix Factorization
22
22
  and cross-validation.
23
23
  MSG
@@ -33,7 +33,7 @@ MSG
33
33
 
34
34
  spec.required_ruby_version = '>= 2.1'
35
35
 
36
- spec.add_runtime_dependency 'numo-narray', '>= 0.9.0'
36
+ spec.add_runtime_dependency 'numo-narray', '>= 0.9.1'
37
37
 
38
38
  spec.add_development_dependency 'bundler', '~> 1.16'
39
39
  spec.add_development_dependency 'coveralls', '~> 0.8'
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.6.3
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - yoshoku
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-11-25 00:00:00.000000000 Z
11
+ date: 2018-12-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: numo-narray
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 0.9.0
19
+ version: 0.9.1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 0.9.0
26
+ version: 0.9.1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -85,7 +85,7 @@ description: |
85
85
  SVMKit provides machine learning algorithms with interfaces similar to Scikit-Learn in Python.
86
86
  SVMKit currently supports Linear / Kernel Support Vector Machine,
87
87
  Logistic Regression, Linear Regression, Ridge, Lasso, Factorization Machine,
88
- Naive Bayes, Decision Tree, Random Forest, K-nearest neighbor algorithm,
88
+ Naive Bayes, Decision Tree, AdaBoost, Random Forest, K-nearest neighbor algorithm,
89
89
  K-Means, DBSCAN, Principal Component Analysis, Non-negative Matrix Factorization
90
90
  and cross-validation.
91
91
  email:
@@ -121,6 +121,8 @@ files:
121
121
  - lib/svmkit/dataset.rb
122
122
  - lib/svmkit/decomposition/nmf.rb
123
123
  - lib/svmkit/decomposition/pca.rb
124
+ - lib/svmkit/ensemble/ada_boost_classifier.rb
125
+ - lib/svmkit/ensemble/ada_boost_regressor.rb
124
126
  - lib/svmkit/ensemble/random_forest_classifier.rb
125
127
  - lib/svmkit/ensemble/random_forest_regressor.rb
126
128
  - lib/svmkit/evaluation_measure/accuracy.rb