Class: Rumale::LinearModel::SVC
- Inherits:
-
BaseEstimator
- Object
- Base::Estimator
- BaseEstimator
- Rumale::LinearModel::SVC
- Includes:
- Base::Classifier
- Defined in:
- rumale-linear_model/lib/rumale/linear_model/svc.rb
Overview
Rumale::SVM provides linear support vector classifier based on LIBLINEAR. If you prefer execution speed, you should use Rumale::SVM::LinearSVC. github.com/yoshoku/rumale-svm
SVC is a class that implements Support Vector Classifier with the squared hinge loss. For multiclass classification problem, it uses one-vs-the-rest strategy.
Instance Attribute Summary collapse
-
#classes ⇒ Numo::Int32
readonly
Return the class labels.
Attributes inherited from BaseEstimator
Attributes inherited from Base::Estimator
Instance Method Summary collapse
-
#decision_function(x) ⇒ Numo::DFloat
Calculate confidence scores for samples.
-
#fit(x, y) ⇒ SVC
Fit the model with given training data.
-
#initialize(reg_param: 1.0, fit_bias: true, bias_scale: 1.0, max_iter: 1000, tol: 1e-4, probability: false, n_jobs: nil, verbose: false) ⇒ SVC
constructor
Create a new linear classifier with Support Vector Machine with the squared hinge loss.
-
#predict(x) ⇒ Numo::Int32
Predict class labels for samples.
-
#predict_proba(x) ⇒ Numo::DFloat
Predict probability for samples.
Methods included from Base::Classifier
Constructor Details
#initialize(reg_param: 1.0, fit_bias: true, bias_scale: 1.0, max_iter: 1000, tol: 1e-4, probability: false, n_jobs: nil, verbose: false) ⇒ SVC
Create a new linear classifier with Support Vector Machine with the squared hinge loss.
50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
# File 'rumale-linear_model/lib/rumale/linear_model/svc.rb', line 50 def initialize(reg_param: 1.0, fit_bias: true, bias_scale: 1.0, max_iter: 1000, tol: 1e-4, probability: false, n_jobs: nil, verbose: false) super() @params = { reg_param: reg_param, fit_bias: fit_bias, bias_scale: bias_scale, max_iter: max_iter, tol: tol, probability: probability, n_jobs: n_jobs, verbose: verbose } end |
Instance Attribute Details
#classes ⇒ Numo::Int32 (readonly)
Return the class labels.
33 34 35 |
# File 'rumale-linear_model/lib/rumale/linear_model/svc.rb', line 33 def classes @classes end |
Instance Method Details
#decision_function(x) ⇒ Numo::DFloat
Calculate confidence scores for samples.
110 111 112 113 114 |
# File 'rumale-linear_model/lib/rumale/linear_model/svc.rb', line 110 def decision_function(x) x = Rumale::Validation.check_convert_sample_array(x) x.dot(@weight_vec.transpose) + @bias_term end |
#fit(x, y) ⇒ SVC
Fit the model with given training data.
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
# File 'rumale-linear_model/lib/rumale/linear_model/svc.rb', line 70 def fit(x, y) x = Rumale::Validation.check_convert_sample_array(x) y = Rumale::Validation.check_convert_label_array(y) Rumale::Validation.check_sample_size(x, y) @classes = Numo::Int32[*y.to_a.uniq.sort] x = (x) if fit_bias? if multiclass_problem? n_classes = @classes.size n_features = x.shape[1] n_features -= 1 if fit_bias? @weight_vec = Numo::DFloat.zeros(n_classes, n_features) @bias_term = Numo::DFloat.zeros(n_classes) @prob_param = Numo::DFloat.zeros(n_classes, 2) models = if enable_parallel? parallel_map(n_classes) do |n| bin_y = Numo::Int32.cast(y.eq(@classes[n])) * 2 - 1 partial_fit(x, bin_y) end else Array.new(n_classes) do |n| bin_y = Numo::Int32.cast(y.eq(@classes[n])) * 2 - 1 partial_fit(x, bin_y) end end models.each_with_index { |model, n| @weight_vec[n, true], @bias_term[n], @prob_param[n, true] = model } else negative_label = @classes[0] bin_y = Numo::Int32.cast(y.ne(negative_label)) * 2 - 1 @weight_vec, @bias_term, @prob_param = partial_fit(x, bin_y) end self end |
#predict(x) ⇒ Numo::Int32
Predict class labels for samples.
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
# File 'rumale-linear_model/lib/rumale/linear_model/svc.rb', line 120 def predict(x) x = Rumale::Validation.check_convert_sample_array(x) n_samples = x.shape[0] predicted = if multiclass_problem? decision_values = decision_function(x) if enable_parallel? parallel_map(n_samples) { |n| @classes[decision_values[n, true].max_index] } else Array.new(n_samples) { |n| @classes[decision_values[n, true].max_index] } end else decision_values = decision_function(x).ge(0.0).to_a Array.new(n_samples) { |n| @classes[decision_values[n]] } end Numo::Int32.asarray(predicted) end |
#predict_proba(x) ⇒ Numo::DFloat
Predict probability for samples.
142 143 144 145 146 147 148 149 150 151 152 153 154 155 |
# File 'rumale-linear_model/lib/rumale/linear_model/svc.rb', line 142 def predict_proba(x) x = Rumale::Validation.check_convert_sample_array(x) if multiclass_problem? probs = 1.0 / (Numo::NMath.exp(@prob_param[true, 0] * decision_function(x) + @prob_param[true, 1]) + 1.0) (probs.transpose / probs.sum(axis: 1)).transpose.dup else n_samples = x.shape[0] probs = Numo::DFloat.zeros(n_samples, 2) probs[true, 1] = 1.0 / (Numo::NMath.exp(@prob_param[0] * decision_function(x) + @prob_param[1]) + 1.0) probs[true, 0] = 1.0 - probs[true, 1] probs end end |