baobab 0.1.1 → 0.1.2
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 +4 -4
- data/lib/baobab/tree.rb +54 -48
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9664c33acdc442b0afdd6c7020df547ac6a675ea
|
4
|
+
data.tar.gz: 579a7397a9752c0755afcc4dcb72a4fbce2e83cb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c3c826681d0640b31a775ef8112870471a29782cbc99e7e457bd3ff01d3e5a12f278a267a57fc4e5848211814779aead62f32454f7622b992743edca22c6b4d5
|
7
|
+
data.tar.gz: a4b0cdacebd5a284719ca081c5458140da21cce31774702efd5f3a9fcb16807709cdc33c710a131494c52be18785637a961fd4e55af82c784b893d1a443e0104
|
data/lib/baobab/tree.rb
CHANGED
@@ -5,63 +5,69 @@ module Baobab
|
|
5
5
|
|
6
6
|
class DecisionTree
|
7
7
|
|
8
|
-
|
9
|
-
|
8
|
+
# The first decision tree node
|
9
|
+
attr_reader :root
|
10
10
|
|
11
|
-
|
12
|
-
|
11
|
+
# The class variable of interest in this decision tree.
|
12
|
+
attr_reader :class_var
|
13
13
|
|
14
|
-
|
15
|
-
|
14
|
+
# The underlying dataset
|
15
|
+
attr_reader :dataset
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
entropy
|
25
|
-
)
|
26
|
-
@root.build_subtree
|
17
|
+
# Receives
|
18
|
+
# - dataset, a list of hashes
|
19
|
+
# - the name of the class variable
|
20
|
+
def initialize dataset, class_var
|
21
|
+
@dataset = dataset
|
22
|
+
if class_var.nil?
|
23
|
+
raise "class_var cannot be nil"
|
27
24
|
end
|
25
|
+
@class_var = class_var
|
26
|
+
entropy = dataset.entropy class_var
|
27
|
+
@root = DecisionTreeNode.new(
|
28
|
+
self, parent=nil,
|
29
|
+
attribute=nil, value=nil,
|
30
|
+
entropy
|
31
|
+
)
|
32
|
+
@root.build_subtree
|
33
|
+
end
|
28
34
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
end
|
41
|
-
return s
|
35
|
+
# Prints the decision depth-first with the respective entropy values.
|
36
|
+
def to_s
|
37
|
+
s = ""
|
38
|
+
nodes = [[0, @root]]
|
39
|
+
while nodes.any?
|
40
|
+
l, n = nodes.last
|
41
|
+
nodes = nodes.slice(0...-1)
|
42
|
+
n.children.each do |c|
|
43
|
+
nodes << [l + 1, c]
|
44
|
+
end
|
45
|
+
s = s + "#{' ' * (l * 2)}#{n.to_s}\n"
|
42
46
|
end
|
47
|
+
s
|
48
|
+
end
|
43
49
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
end
|
61
|
-
end
|
50
|
+
# Receives attributes and their values (they must be all defined).
|
51
|
+
# Returns the value of the predicted class value.
|
52
|
+
def query values
|
53
|
+
if values.keys.sort != @dataset.attribute_names(@class_var).sort
|
54
|
+
raise "Query does not fit all variables"
|
55
|
+
end
|
56
|
+
node = @root
|
57
|
+
while node.variable != @class_var
|
58
|
+
if node.next_attribute
|
59
|
+
if node.children.count > 1
|
60
|
+
val = values[node.next_attribute]
|
61
|
+
node = node.children.select do |child|
|
62
|
+
child.value == val
|
63
|
+
end[0]
|
64
|
+
else
|
65
|
+
node = node.children[0]
|
62
66
|
end
|
63
|
-
|
67
|
+
end
|
64
68
|
end
|
69
|
+
node.value
|
70
|
+
end
|
65
71
|
|
66
72
|
end
|
67
73
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: baobab
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Johnny E. Lee Othon
|
@@ -41,7 +41,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
41
41
|
version: '0'
|
42
42
|
requirements: []
|
43
43
|
rubyforge_project:
|
44
|
-
rubygems_version: 2.
|
44
|
+
rubygems_version: 2.2.2
|
45
45
|
signing_key:
|
46
46
|
specification_version: 4
|
47
47
|
summary: ID3 decision trees for machine learning in Ruby
|