public void Expand() { LearningOpenNode node = _tree.OpenNode() as LearningOpenNode; if (node == null) { throw new Exception("No open node left"); } ItemSet set = node.LearningSet(); double entropy = set.CalEntropy(_goalAttribute); if (entropy <= _entropyThreshold || _testAttributeSet.Size() == 0) { MakeLeafNode(node); } else { TestScore testScore = set.BestSplitTest(_testAttributeSet, _goalAttribute); if (testScore.Score * set.Size() <= _scoreThreshold) { //forward pruning: test does not provide enough information MakeLeafNode(node); } else { MakeTestNode(node, testScore.Test, testScore.Score * set.Size()); } } }
/// <summary> /// Finds the test on each attribute performing the best split for finding the value of a 'goal' /// attribute. /// </summary> /// <param name="candidateAttributes"></param> /// <param name="goalAttribute"></param> /// <returns></returns> public IEnumerable <TestScore> BestSplitTests(AttributeSet candidateAttributes, SymbolicAttribute goalAttribute) { if (candidateAttributes == null || goalAttribute == null || candidateAttributes.Size() == 0) { throw new ArgumentNullException(); } List <TestScore> bestScores = new List <TestScore>(); List <Attribute> attributes = candidateAttributes.GetAttributes().ToList(); foreach (Attribute attr in attributes) { bestScores.Add(BestSplitTest(attr, goalAttribute)); } return(bestScores); }