Class: LightGBM::Booster
- Inherits:
-
Object
- Object
- LightGBM::Booster
- Includes:
- Utils
- Defined in:
- lib/lightgbm/booster.rb
Instance Attribute Summary collapse
-
#best_iteration ⇒ Object
Returns the value of attribute best_iteration.
-
#train_data_name ⇒ Object
Returns the value of attribute train_data_name.
Class Method Summary collapse
Instance Method Summary collapse
- #add_valid(data, name) ⇒ Object
- #current_iteration ⇒ Object
- #dump_model(num_iteration: nil, start_iteration: 0) ⇒ Object (also: #to_json)
- #eval_train ⇒ Object
- #eval_valid ⇒ Object
- #feature_importance(iteration: nil, importance_type: "split") ⇒ Object
- #feature_name ⇒ Object
-
#initialize(params: nil, train_set: nil, model_file: nil, model_str: nil) ⇒ Booster
constructor
A new instance of Booster.
- #model_from_string(model_str) ⇒ Object
- #model_to_string(num_iteration: nil, start_iteration: 0) ⇒ Object
- #num_feature ⇒ Object (also: #num_features)
- #num_model_per_iteration ⇒ Object
- #num_trees ⇒ Object
-
#predict(input, start_iteration: nil, num_iteration: nil, **params) ⇒ Object
TODO support different prediction types.
- #save_model(filename, num_iteration: nil, start_iteration: 0) ⇒ Object
- #update ⇒ Object
Constructor Details
#initialize(params: nil, train_set: nil, model_file: nil, model_str: nil) ⇒ Booster
Returns a new instance of Booster.
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# File 'lib/lightgbm/booster.rb', line 5 def initialize(params: nil, train_set: nil, model_file: nil, model_str: nil) @handle = ::FFI::MemoryPointer.new(:pointer) if model_str model_from_string(model_str) elsif model_file out_num_iterations = ::FFI::MemoryPointer.new(:int) check_result FFI.LGBM_BoosterCreateFromModelfile(model_file, out_num_iterations, @handle) else params ||= {} set_verbosity(params) check_result FFI.LGBM_BoosterCreate(train_set.handle_pointer, params_str(params), @handle) end ObjectSpace.define_finalizer(@handle, self.class.finalize(handle_pointer.to_i)) self.best_iteration = -1 # TODO get names when loaded from file @name_valid_sets = [] end |
Instance Attribute Details
#best_iteration ⇒ Object
Returns the value of attribute best_iteration.
3 4 5 |
# File 'lib/lightgbm/booster.rb', line 3 def best_iteration @best_iteration end |
#train_data_name ⇒ Object
Returns the value of attribute train_data_name.
3 4 5 |
# File 'lib/lightgbm/booster.rb', line 3 def train_data_name @train_data_name end |
Class Method Details
.finalize(addr) ⇒ Object
182 183 184 185 |
# File 'lib/lightgbm/booster.rb', line 182 def self.finalize(addr) # must use proc instead of stabby lambda proc { FFI.LGBM_BoosterFree(::FFI::Pointer.new(:pointer, addr)) } end |
Instance Method Details
#add_valid(data, name) ⇒ Object
25 26 27 28 29 |
# File 'lib/lightgbm/booster.rb', line 25 def add_valid(data, name) check_result FFI.LGBM_BoosterAddValidData(handle_pointer, data.handle_pointer) @name_valid_sets << name self # consistent with Python API end |
#current_iteration ⇒ Object
31 32 33 34 35 |
# File 'lib/lightgbm/booster.rb', line 31 def current_iteration out = ::FFI::MemoryPointer.new(:int) check_result FFI.LGBM_BoosterGetCurrentIteration(handle_pointer, out) out.read_int end |
#dump_model(num_iteration: nil, start_iteration: 0) ⇒ Object Also known as: to_json
37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
# File 'lib/lightgbm/booster.rb', line 37 def dump_model(num_iteration: nil, start_iteration: 0) num_iteration ||= best_iteration buffer_len = 1 << 20 out_len = ::FFI::MemoryPointer.new(:int64) out_str = ::FFI::MemoryPointer.new(:char, buffer_len) feature_importance_type = 0 # TODO add option check_result FFI.LGBM_BoosterDumpModel(handle_pointer, start_iteration, num_iteration, feature_importance_type, buffer_len, out_len, out_str) actual_len = read_int64(out_len) if actual_len > buffer_len out_str = ::FFI::MemoryPointer.new(:char, actual_len) check_result FFI.LGBM_BoosterDumpModel(handle_pointer, start_iteration, num_iteration, feature_importance_type, actual_len, out_len, out_str) end out_str.read_string end |
#eval_train ⇒ Object
57 58 59 |
# File 'lib/lightgbm/booster.rb', line 57 def eval_train inner_eval(train_data_name, 0) end |
#eval_valid ⇒ Object
53 54 55 |
# File 'lib/lightgbm/booster.rb', line 53 def eval_valid @name_valid_sets.each_with_index.flat_map { |n, i| inner_eval(n, i + 1) } end |
#feature_importance(iteration: nil, importance_type: "split") ⇒ Object
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
# File 'lib/lightgbm/booster.rb', line 61 def feature_importance(iteration: nil, importance_type: "split") iteration ||= best_iteration importance_type = case importance_type when "split" 0 when "gain" 1 else -1 end num_feature = self.num_feature out_result = ::FFI::MemoryPointer.new(:double, num_feature) check_result FFI.LGBM_BoosterFeatureImportance(handle_pointer, iteration, importance_type, out_result) out_result.read_array_of_double(num_feature).map(&:to_i) end |
#feature_name ⇒ Object
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
# File 'lib/lightgbm/booster.rb', line 79 def feature_name len = self.num_feature out_len = ::FFI::MemoryPointer.new(:size_t) buffer_len = 255 out_buffer_len = ::FFI::MemoryPointer.new(:size_t) out_strs = ::FFI::MemoryPointer.new(:pointer, num_feature) str_ptrs = len.times.map { ::FFI::MemoryPointer.new(:char, buffer_len) } out_strs.write_array_of_pointer(str_ptrs) check_result FFI.LGBM_BoosterGetFeatureNames(handle_pointer, len, out_len, buffer_len, out_buffer_len, out_strs) actual_len = out_buffer_len.read(:size_t) if actual_len > buffer_len str_ptrs = len.times.map { ::FFI::MemoryPointer.new(:char, actual_len) } out_strs.write_array_of_pointer(str_ptrs) check_result FFI.LGBM_BoosterGetFeatureNames(handle_pointer, len, out_len, actual_len, out_buffer_len, out_strs) end str_ptrs[0, out_len.read(:size_t)].map(&:read_string) end |
#model_from_string(model_str) ⇒ Object
99 100 101 102 103 |
# File 'lib/lightgbm/booster.rb', line 99 def model_from_string(model_str) out_num_iterations = ::FFI::MemoryPointer.new(:int) check_result FFI.LGBM_BoosterLoadModelFromString(model_str, out_num_iterations, @handle) self end |
#model_to_string(num_iteration: nil, start_iteration: 0) ⇒ Object
105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
# File 'lib/lightgbm/booster.rb', line 105 def model_to_string(num_iteration: nil, start_iteration: 0) num_iteration ||= best_iteration buffer_len = 1 << 20 out_len = ::FFI::MemoryPointer.new(:int64) out_str = ::FFI::MemoryPointer.new(:char, buffer_len) feature_importance_type = 0 # TODO add option check_result FFI.LGBM_BoosterSaveModelToString(handle_pointer, start_iteration, num_iteration, feature_importance_type, buffer_len, out_len, out_str) actual_len = read_int64(out_len) if actual_len > buffer_len out_str = ::FFI::MemoryPointer.new(:char, actual_len) check_result FFI.LGBM_BoosterSaveModelToString(handle_pointer, start_iteration, num_iteration, feature_importance_type, actual_len, out_len, out_str) end out_str.read_string end |
#num_feature ⇒ Object Also known as: num_features
120 121 122 123 124 |
# File 'lib/lightgbm/booster.rb', line 120 def num_feature out = ::FFI::MemoryPointer.new(:int) check_result FFI.LGBM_BoosterGetNumFeature(handle_pointer, out) out.read_int end |
#num_model_per_iteration ⇒ Object
127 128 129 130 131 |
# File 'lib/lightgbm/booster.rb', line 127 def num_model_per_iteration out = ::FFI::MemoryPointer.new(:int) check_result FFI.LGBM_BoosterNumModelPerIteration(handle_pointer, out) out.read_int end |
#num_trees ⇒ Object
133 134 135 136 137 |
# File 'lib/lightgbm/booster.rb', line 133 def num_trees out = ::FFI::MemoryPointer.new(:int) check_result FFI.LGBM_BoosterNumberOfTotalModel(handle_pointer, out) out.read_int end |
#predict(input, start_iteration: nil, num_iteration: nil, **params) ⇒ Object
TODO support different prediction types
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 |
# File 'lib/lightgbm/booster.rb', line 140 def predict(input, start_iteration: nil, num_iteration: nil, **params) input = if daru?(input) input.map_rows(&:to_a) else input.to_a end singular = !input.first.is_a?(Array) input = [input] if singular start_iteration ||= 0 num_iteration ||= best_iteration num_class ||= num_class() flat_input = input.flatten handle_missing(flat_input) data = ::FFI::MemoryPointer.new(:double, input.count * input.first.count) data.write_array_of_double(flat_input) out_len = ::FFI::MemoryPointer.new(:int64) out_result = ::FFI::MemoryPointer.new(:double, num_class * input.count) check_result FFI.LGBM_BoosterPredictForMat(handle_pointer, data, 1, input.count, input.first.count, 1, 0, start_iteration, num_iteration, params_str(params), out_len, out_result) out = out_result.read_array_of_double(read_int64(out_len)) out = out.each_slice(num_class).to_a if num_class > 1 singular ? out.first : out end |
#save_model(filename, num_iteration: nil, start_iteration: 0) ⇒ Object
169 170 171 172 173 174 |
# File 'lib/lightgbm/booster.rb', line 169 def save_model(filename, num_iteration: nil, start_iteration: 0) num_iteration ||= best_iteration feature_importance_type = 0 # TODO add check_result FFI.LGBM_BoosterSaveModel(handle_pointer, start_iteration, num_iteration, feature_importance_type, filename) self # consistent with Python API end |
#update ⇒ Object
176 177 178 179 180 |
# File 'lib/lightgbm/booster.rb', line 176 def update finished = ::FFI::MemoryPointer.new(:int) check_result FFI.LGBM_BoosterUpdateOneIter(handle_pointer, finished) finished.read_int == 1 end |