xgb 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 148980f8a4991f1f98cd1740188e763a3bd96c98bc69b13a9de9aa00132a12f1
4
- data.tar.gz: 31d90a3a064d032a7d1f371c6928f11b103bfc6f9c92dd1697cc538ef33f15fa
3
+ metadata.gz: 41e23d36cc3404e32f22527f2ddfd112db2abd096fbdbf272bade29d032f0df6
4
+ data.tar.gz: 5fb377835c2dce3ec1d4f6d734588f3d1e222e9fe35fa9bd127b0eb6198f7f7d
5
5
  SHA512:
6
- metadata.gz: 28fb08d373af3a3b198822ddea958ca0ee433145dbca091583b25945f27a048a3ec4a4ec43d88dc3c1dde67de7f72b7fb84e7668cfbd173f01d56992017ba4e2
7
- data.tar.gz: 5bfb07db7c6b65d0a08010ab59328af75a97e74e025fcd4eb15ca88b05afec3303beb1569c99d59932a5426a64addce1c7fda90562342efcf52fc2c72d9b362a
6
+ metadata.gz: 6a6551eef35b0c560bccb2e23034cda55ee29bd6dd00840e7d8dc8a86b1df017433d270cbb7b1a812f65d92123c22459722266c7a813b4a9e5184d69ba5abe73
7
+ data.tar.gz: 4f15acf5555c4a5db81e73113cc5dc0c47f438687d9ea85dae25d818395bd6ed27f162e7a0588c65e347ee51a805eb2d2a673113aad629f6b7903e31f4d5b2ff
@@ -1,3 +1,9 @@
1
+ ## 0.1.3
2
+
3
+ - Added support for missing values
4
+ - Fixed Daru training and prediction
5
+ - Fixed error with JRuby
6
+
1
7
  ## 0.1.2
2
8
 
3
9
  - Friendlier message when XGBoost not found
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2019 Andrew Kane
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md CHANGED
@@ -8,7 +8,11 @@
8
8
 
9
9
  ## Installation
10
10
 
11
- First, [install XGBoost](https://xgboost.readthedocs.io/en/latest/build.html). On Mac, copy `lib/libxgboost.dylib` to `/usr/local/lib`.
11
+ First, [install XGBoost](https://xgboost.readthedocs.io/en/latest/build.html). For Homebrew, use:
12
+
13
+ ```sh
14
+ brew install xgboost
15
+ ```
12
16
 
13
17
  Add this line to your application’s Gemfile:
14
18
 
@@ -18,22 +22,29 @@ gem 'xgb'
18
22
 
19
23
  ## Getting Started
20
24
 
21
- This library follows the [Python API](https://xgboost.readthedocs.io/en/latest/python/python_api.html). Some methods and options are missing at the moment. PRs welcome!
25
+ This library follows the [Python API](https://xgboost.readthedocs.io/en/latest/python/python_api.html), with the `get_` and `set_` prefixes removed from methods. Some methods and options are missing at the moment. PRs welcome!
22
26
 
23
27
  ## Learning API
24
28
 
29
+ Prep your data
30
+
31
+ ```ruby
32
+ x = [[1, 2], [3, 4], [5, 6], [7, 8]]
33
+ y = [1, 2, 3, 4]
34
+ ```
35
+
25
36
  Train a model
26
37
 
27
38
  ```ruby
28
39
  params = {objective: "reg:squarederror"}
29
- dtrain = Xgb::DMatrix.new(x_train, label: y_train)
40
+ dtrain = Xgb::DMatrix.new(x, label: y)
30
41
  booster = Xgb.train(params, dtrain)
31
42
  ```
32
43
 
33
44
  Predict
34
45
 
35
46
  ```ruby
36
- dtest = Xgb::DMatrix.new(x_test)
47
+ dtest = Xgb::DMatrix.new(x)
37
48
  booster.predict(dtest)
38
49
  ```
39
50
 
@@ -137,6 +148,24 @@ Or a Numo NArray
137
148
  Numo::DFloat.new(3, 2).seq
138
149
  ```
139
150
 
151
+ ## XGBoost Installation
152
+
153
+ There’s an experimental branch that includes XGBoost with the gem for easiest installation.
154
+
155
+ ```ruby
156
+ gem 'xgb', github: 'ankane/xgb', branch: 'vendor', submodules: true
157
+ ```
158
+
159
+ Please file an issue if it doesn’t work for you.
160
+
161
+ You can also specify the path to XGBoost in an initializer:
162
+
163
+ ```ruby
164
+ Xgb.ffi_lib << "/path/to/xgboost/lib/libxgboost.so"
165
+ ```
166
+
167
+ > Use `libxgboost.dylib` for Mac and `xgboost.dll` for Windows
168
+
140
169
  ## Helpful Resources
141
170
 
142
171
  - [Parameters](https://xgboost.readthedocs.io/en/latest/parameter.html)
@@ -149,7 +178,7 @@ Numo::DFloat.new(3, 2).seq
149
178
 
150
179
  ## Credits
151
180
 
152
- Thanks to the [xgboost](https://github.com/PairOnAir/xgboost-ruby) gem for serving as an initial reference, and Selva Prabhakaran for the [test datasets](https://github.com/selva86/datasets).
181
+ Thanks to the [xgboost](https://github.com/PairOnAir/xgboost-ruby) gem for serving as an initial reference.
153
182
 
154
183
  ## History
155
184
 
@@ -53,7 +53,7 @@ module Xgb
53
53
  out_len = ::FFI::MemoryPointer.new(:uint64)
54
54
  out_result = ::FFI::MemoryPointer.new(:pointer)
55
55
  check_result FFI.XGBoosterPredict(handle_pointer, data.handle_pointer, 0, ntree_limit, out_len, out_result)
56
- out = out_result.read_pointer.read_array_of_float(out_len.read_uint64)
56
+ out = out_result.read_pointer.read_array_of_float(read_uint64(out_len))
57
57
  num_class = out.size / data.num_row
58
58
  out = out.each_slice(num_class).to_a if num_class > 1
59
59
  out
@@ -68,7 +68,7 @@ module Xgb
68
68
  out_len = ::FFI::MemoryPointer.new(:uint64)
69
69
  out_result = ::FFI::MemoryPointer.new(:pointer)
70
70
  check_result FFI.XGBoosterDumpModelEx(handle_pointer, fmap, with_stats ? 1 : 0, dump_format, out_len, out_result)
71
- out_result.read_pointer.get_array_of_string(0, out_len.read_uint64)
71
+ out_result.read_pointer.get_array_of_string(0, read_uint64(out_len))
72
72
  end
73
73
 
74
74
  def dump_model(fout, fmap: "", with_stats: false, dump_format: "text")
@@ -14,7 +14,7 @@ module Xgb
14
14
  flat_data = data.to_a.flatten
15
15
  elsif daru?(data)
16
16
  nrow, ncol = data.shape
17
- flat_data = data.each_vector.map(&:to_a).flatten
17
+ flat_data = data.map_rows(&:to_a).flatten
18
18
  elsif narray?(data)
19
19
  nrow, ncol = data.shape
20
20
  flat_data = data.flatten.to_a
@@ -24,6 +24,7 @@ module Xgb
24
24
  flat_data = data.flatten
25
25
  end
26
26
 
27
+ handle_missing(flat_data, missing)
27
28
  c_data = ::FFI::MemoryPointer.new(:float, nrow * ncol)
28
29
  c_data.put_array_of_float(0, flat_data)
29
30
  check_result FFI.XGDMatrixCreateFromMat(c_data, nrow, ncol, missing, @handle)
@@ -31,8 +32,8 @@ module Xgb
31
32
  ObjectSpace.define_finalizer(self, self.class.finalize(handle_pointer))
32
33
  end
33
34
 
34
- set_float_info("label", label) if label
35
- set_float_info("weight", weight) if weight
35
+ self.label = label if label
36
+ self.weight = weight if weight
36
37
  end
37
38
 
38
39
  def self.finalize(pointer)
@@ -48,6 +49,14 @@ module Xgb
48
49
  float_info("weight")
49
50
  end
50
51
 
52
+ def label=(label)
53
+ set_float_info("label", label)
54
+ end
55
+
56
+ def weight=(weight)
57
+ set_float_info("weight", weight)
58
+ end
59
+
51
60
  def group=(group)
52
61
  c_data = ::FFI::MemoryPointer.new(:int, group.size)
53
62
  c_data.put_array_of_int(0, group)
@@ -57,13 +66,13 @@ module Xgb
57
66
  def num_row
58
67
  out = ::FFI::MemoryPointer.new(:uint64)
59
68
  check_result FFI.XGDMatrixNumRow(handle_pointer, out)
60
- out.read_uint64
69
+ read_uint64(out)
61
70
  end
62
71
 
63
72
  def num_col
64
73
  out = ::FFI::MemoryPointer.new(:uint64)
65
74
  check_result FFI.XGDMatrixNumCol(handle_pointer, out)
66
- out.read_uint64
75
+ read_uint64(out)
67
76
  end
68
77
 
69
78
  def slice(rindex)
@@ -115,6 +124,10 @@ module Xgb
115
124
  defined?(Numo::NArray) && data.is_a?(Numo::NArray)
116
125
  end
117
126
 
127
+ def handle_missing(data, missing)
128
+ data.map! { |v| v.nil? ? missing : v }
129
+ end
130
+
118
131
  include Utils
119
132
  end
120
133
  end
@@ -9,5 +9,10 @@ module Xgb
9
9
  raise Xgb::Error, message
10
10
  end
11
11
  end
12
+
13
+ # read_uint64 not available on JRuby
14
+ def read_uint64(ptr)
15
+ ptr.read_array_of_uint64(1).first
16
+ end
12
17
  end
13
18
  end
@@ -1,3 +1,3 @@
1
1
  module Xgb
2
- VERSION = "0.1.2"
2
+ VERSION = "0.1.3"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xgb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-08-19 00:00:00.000000000 Z
11
+ date: 2019-10-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi
@@ -80,20 +80,6 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: numo-narray
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
83
  description:
98
84
  email: andrew@chartkick.com
99
85
  executables: []
@@ -101,6 +87,7 @@ extensions: []
101
87
  extra_rdoc_files: []
102
88
  files:
103
89
  - CHANGELOG.md
90
+ - LICENSE.txt
104
91
  - README.md
105
92
  - lib/xgb.rb
106
93
  - lib/xgb/booster.rb