private static DecisionTreeItem InitializeTreeItem(DataSet dataSet, int levelAvailableCount, List <int> unusedFeatures, bool useId3, ref int nodeIndex) { nodeIndex++; var currentIndex = nodeIndex; if (dataSet.ClassCount == 1 || levelAvailableCount == 1 || unusedFeatures.Count == 0) { return(new DecisionTreeLeaf(dataSet.GetClassByMaxCount(), currentIndex)); } levelAvailableCount--; (var _, var usedFeature) = DecisionTreeItem.GetBestDecisionFromDataSet(dataSet, unusedFeatures, out var split); if (useId3) { unusedFeatures.Remove(usedFeature); } if (split is null || split.RightPart.ObjectCount == 0 || split.LeftPart.ObjectCount == 0) { return(new DecisionTreeLeaf(dataSet.GetClassByMaxCount(), currentIndex)); } var leftChild = InitializeTreeItem(split.LeftPart, levelAvailableCount, unusedFeatures, useId3, ref nodeIndex); var rightChild = InitializeTreeItem(split.RightPart, levelAvailableCount, unusedFeatures, useId3, ref nodeIndex); return(new DecisionTreeNode(leftChild, rightChild, split.SplitItemIndex, split.SplitValue, currentIndex)); }
internal DecisionTreeNode(DecisionTreeItem leftChild, DecisionTreeItem rightChild, int itemDecisionItemIndex, Double compareValue, int nodeIndex) : base(nodeIndex) { _leftChild = leftChild; _rightChild = rightChild; _decisionItemIndex = itemDecisionItemIndex; _compareValue = compareValue; }
private DecisionTree(DecisionTreeItem head, int nodeCount) { _head = head; NodeCount = nodeCount; }