/
id3_spec.rb
106 lines (99 loc) · 2.87 KB
/
id3_spec.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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
105
106
require 'spec_helper'
describe describe DecisionTree::ID3Tree do
describe "simple discrete case" do
Given(:labels) { ["sun", "rain"]}
Given(:data) do
[
[1,0,1],
[0,1,0]
]
end
Given(:tree) { DecisionTree::ID3Tree.new(labels, data, 1, :discrete) }
When { tree.train }
Then { tree.predict([1,0]).should == 1 }
Then { tree.predict([0,1]).should == 0 }
end
describe "discrete attributes" do
Given(:labels) { ["hungry", "color"] }
Given(:data) do
[
["yes", "red", "angry"],
["no", "blue", "not angry"],
["yes", "blue", "not angry"],
["no", "red", "not angry"]
]
end
Given(:tree) { DecisionTree::ID3Tree.new(labels, data, "not angry", :discrete) }
When { tree.train }
Then { tree.predict(["yes", "red"]).should == "angry" }
Then { tree.predict(["no", "red"]).should == "not angry" }
end
describe "discrete attributes" do
Given(:labels) { ["hunger", "happiness"] }
Given(:data) do
[
[8, 7, "angry"],
[6, 7, "angry"],
[7, 9, "angry"],
[7, 1, "not angry"],
[2, 9, "not angry"],
[3, 2, "not angry"],
[2, 3, "not angry"],
[1, 4, "not angry"]
]
end
Given(:tree) { DecisionTree::ID3Tree.new(labels, data, "not angry", :continuous) }
When { tree.train }
Then { tree.predict([7, 7]).should == "angry" }
Then { tree.predict([2, 3]).should == "not angry" }
end
describe "a mixture" do
Given(:labels) { ["hunger", "color"] }
Given(:data) do
[
[8, "red", "angry"],
[6, "red", "angry"],
[7, "red", "angry"],
[7, "blue", "not angry"],
[2, "red", "not angry"],
[3, "blue", "not angry"],
[2, "blue", "not angry"],
[1, "red", "not angry"]
]
end
Given(:tree) { DecisionTree::ID3Tree.new(labels, data, "not angry", color: :discrete, hunger: :continuous) }
When { tree.train }
Then { tree.predict([7, "red"]).should == "angry" }
Then { tree.predict([2, "blue"]).should == "not angry" }
end
describe "infinite recursion case" do
Given(:labels) { [:a, :b, :c] }
Given(:data) do
[
["a1", "b0", "c0", "RED"],
["a1", "b1", "c1", "RED"],
["a1", "b1", "c0", "BLUE"],
["a1", "b0", "c1", "BLUE"]
]
end
Given(:tree) { DecisionTree::ID3Tree.new(labels, data, "RED", :discrete) }
When { tree.train }
Then { tree.predict(["a1","b0","c0"]).should == "RED" }
end
describe "numerical labels case" do
Given(:labels) { [1, 2] }
Given(:data) do
[
[1, 1, true],
[1, 2, false],
[2, 1, false],
[2, 2, true]
]
end
Given(:tree) { DecisionTree::ID3Tree.new labels, data, nil, :discrete }
When { tree.train }
Then {
lambda { tree.predict([1, 1]) }.should_not raise_error
}
end
end