ISmCART.Tree

Fore Syntax

Tree: IBinaryTreeNode;

Fore.NET Syntax

Tree: Prognoz.Platform.Interop.Stat.IBinaryTreeNode;

Description

The Tree property returns the created decision tree.

Comments

A decision tree is a hierarchical tree of rules, where each object corresponds to a single node giving the decision. A rule is a logical construction represented as "if... then ...".

Fore Example

To execute the example add links to the Stat system assembly.

Public Sub UserProc;
Var
    CART: SmCART;
    y: Array[16Of Integer;
    x1: Array[16Of Integer;
    x2: Array[16Of Integer;
    x3dbl: array[16Of double;
    x4cat: array[16Of integer;
    TreeSizeSpecification: ITreeSpecification;
    res: integer;
    i: integer;
    str: string;
    d: double;
    CatList: Array Of Integer;
Begin
    // Create object to calculate classification tree
    CART := New SmCART.Create;
    // Set explained series values
    y[0] := 1000; y[4] := 201; y[8] := -1; y[12] := 5002;
    y[1] := 1000; y[5] := 201; y[9] := 5002; y[13] := 5002;
    y[2] := 1000; y[6] := 201; y[10] := 5002; y[14] := -1;
    y[3] := 1000; y[7] := 201; y[11] := 5002; y[15] := 5002;
    // Set value of explanatory ordinal series x1
    x1[0] := 0; x1[4] := 0; x1[8] := 0; x1[12] := 1;
    x1[1] := 0; x1[5] := 0; x1[9] := 1; x1[13] := 1;
    x1[2] := 0; x1[6] := 0; x1[10] := 1; x1[14] := 1;
    x1[3] := 0; x1[7] := 0; x1[11] := 1; x1[15] := 1;
    // Set value of explanatory ordinal series x2
    x2[0] := 10; x2[4] := 10; x2[8] := 20; x2[12] := 20;
    x2[1] := 10; x2[5] := 20; x2[9] := 10; x2[13] := 20;
    x2[2] := 10; x2[6] := 20; x2[10] := 10; x2[14] := 20;
    x2[3] := 10; x2[7] := 20; x2[11] := 20; x2[15] := 20;
    // Set values of explanatory quantitative series
    x3dbl[0] := 1; x3dbl[4] := 4; x3dbl[8] := 9; x3dbl[12] := 11;
    x3dbl[1] := 2; x3dbl[5] := 6; x3dbl[9] := 9; x3dbl[13] := 12;
    x3dbl[2] := 3; x3dbl[6] := 7; x3dbl[10] := 10; x3dbl[14] := 13;
    x3dbl[3] := 5; x3dbl[7] := 8; x3dbl[11] := 10; x3dbl[15] := 14;
    // Set values of explanatory categorical series
    x4cat[0] := 1; x4cat[4] := 1; x4cat[8] := 2; x4cat[12] := 3;
    x4cat[1] := 1; x4cat[5] := 1; x4cat[9] := 2; x4cat[13] := 3;
    x4cat[2] := 1; x4cat[6] := 1; x4cat[10] := 2; x4cat[14] := 3;
    x4cat[3] := 1; x4cat[7] := 2; x4cat[11] := 2; x4cat[15] := 3;

    // Set parameters describing tree
    TreeSizeSpecification := CART.TreeSizeSpecification;
    TreeSizeSpecification.MaximumNumberOfLevels := 10;
    TreeSizeSpecification.MinimumNumberOfCases := 2;
    // Set explained series
    CART.Dependent.Value := y;
    // Set explanatory ordinal series
    CART.ExplanatoriesOrdered.Add.Value := x1;
    CART.ExplanatoriesOrdered.Add.Value := x2;
    // Set explanatory quantitative series
    cart.ExplanatoriesContinuous.Add.Value := x3dbl;
    // Set explanatory categorical series
    CART.ExplanatoriesCategorical.Add.Value := x4cat;
    // Execute calculation
    res := CART.Execute;
    If res <> 0 Then
        Debug.WriteLine("An error occurred");
        Debug.WriteLine(CART.Errors);
    // If calculation is executed without errors, display results   
    Else
        Debug.WriteLine("Initial values - processed values:");
        Debug.Indent;
        For i := 0 To CART.Dependent.Value.Length - 1 Do
            str := i.ToString +  ":   ";
            d := CART.Dependent.Value[i];
            str := str + d.ToString + "   -   ";
            d := CART.FilledDependent[i];
            str := str + d.ToString + "    "
            Debug.WriteLine(str);
        End For;
        Debug.Unindent;
        // Display list of categories
        CatList := CART.CategoriesList;
        If CatList.Length > 0 Then
            Debug.WriteLine("List of categories:");
            Debug.Indent;
            For i := 0 To CatList.Length - 1 Do
                Debug.WriteLine(CatList[i]);
            End For;
            Debug.Unindent;
        End If;
        // Display decision tree   
        Debug.WriteLine("Decision tree:");
        print(CART.Tree);
    End If;
End Sub UserProc;


// Procedure of outputting decision tree
Sub print(node: IBinaryTreeNode);
Var
    i: Integer;
    Categorical: Boolean = False;
Begin
    Debug.Indent;
    Debug.WriteLine("Node number: " + node.NodeIndex.ToString);
    Debug.WriteLine("Improvement: " + node.Improvement.ToString);
    Debug.WriteLine("Number of cases in node: " + node.Total.ToString);
    Debug.WriteLine("Criterion index: " + node.ExplanatorieIndex.ToString);
    Debug.WriteLine("Criterion name: " + node.Name);
    Debug.Write("Criterion type: ");
    Select Case node.PropertyType
        Case
            DecisionTreePropertyType.Categorical: Debug.WriteLine("categorical");
            Categorical := True;
        Case DecisionTreePropertyType.NoProperty: Debug.WriteLine("-");
        Case DecisionTreePropertyType.Ordered: Debug.WriteLine("ordinal");
        Case DecisionTreePropertyType.Value: Debug.WriteLine("quantitative");
    End Select;
    If Not Categorical Then
        Debug.WriteLine("Criterion value: " + node.Value.ToString);
    End If;
    If (node.LeftNode <> NullThen
        Debug.WriteLine("Left branch:  ");
        print(node.LeftNode);
    End If;

    If (node.LeftNodeCategories.Length <> 0And Categorical Then
        Debug.WriteLine("List of categories which are sorted to the left branch: ");
        For i := 0 To node.LeftNodeCategories.Length - 1 Do
            Debug.WriteLine(node.LeftNodeCategories[i]);
        End For;
    End If;
    If (node.RightNode <> NullThen
        Debug.WriteLine("Right branch: ");
        print(node.RightNode);
    End If;
    If (node.RightNodeCategories.Length <> 0And Categorical Then
        Debug.WriteLine("List of categories which are sorted to the right branch: ");
        For i := 0 To node.RightNodeCategories.Length - 1 Do
            Debug.WriteLine(node.RightNodeCategories[i]);
        End For;
    End If;
    Debug.Unindent;
End Sub print;

After executing the example task will be calculated using classification tree. Calculation results are displayed to the browser console.

Fore.NET Example

The requirements and result of the Fore.NET example execution match with those in the Fore example.

Imports Prognoz.Platform.Interop.Stat;

Public Shared Sub Main(Params: StartParams);
Var
    CART: SmCART;
    y: Array[16Of integer;
    x1: Array[16Of integer;
    x2: Array[16Of Integer;
    x3dbl: array[16Of double;
    x4cat: array[16Of integer;
    TreeSizeSpecification: ITreeSpecification;
    res: integer;
    i: integer;
    str: string;
    CatList, Value: System.Array;
Begin
    // Create object to calculate classification tree
    CART := New SmCART.Create();
    // Set explained series values
    y[0] := 1000; y[4] := 201; y[8] := -1; y[12] := 5002;
    y[1] := 1000; y[5] := 201; y[9] := 5002; y[13] := 5002;
    y[2] := 1000; y[6] := 201; y[10] := 5002; y[14] := -1;
    y[3] := 1000; y[7] := 201; y[11] := 5002; y[15] := 5002;
    // Set value of explanatory ordinal series x1
    x1[0] := 0; x1[4] := 0; x1[8] := 0; x1[12] := 1;
    x1[1] := 0; x1[5] := 0; x1[9] := 1; x1[13] := 1;
    x1[2] := 0; x1[6] := 0; x1[10] := 1; x1[14] := 1;
    x1[3] := 0; x1[7] := 0; x1[11] := 1; x1[15] := 1;
    // Set value of explanatory ordinal series x2
    x2[0] := 10; x2[4] := 10; x2[8] := 20; x2[12] := 20;
    x2[1] := 10; x2[5] := 20; x2[9] := 10; x2[13] := 20;
    x2[2] := 10; x2[6] := 20; x2[10] := 10; x2[14] := 20;
    x2[3] := 10; x2[7] := 20; x2[11] := 20; x2[15] := 20;
    // Set values of explanatory quantitative series
    x3dbl[0] := 1; x3dbl[4] := 4; x3dbl[8] := 9; x3dbl[12] := 11;
    x3dbl[1] := 2; x3dbl[5] := 6; x3dbl[9] := 9; x3dbl[13] := 12;
    x3dbl[2] := 3; x3dbl[6] := 7; x3dbl[10] := 10; x3dbl[14] := 13;
    x3dbl[3] := 5; x3dbl[7] := 8; x3dbl[11] := 10; x3dbl[15] := 14;
    // Set values of explanatory categorical series
    x4cat[0] := 1; x4cat[4] := 1; x4cat[8] := 2; x4cat[12] := 3;
    x4cat[1] := 1; x4cat[5] := 1; x4cat[9] := 2; x4cat[13] := 3;
    x4cat[2] := 1; x4cat[6] := 1; x4cat[10] := 2; x4cat[14] := 3;
    x4cat[3] := 1; x4cat[7] := 2; x4cat[11] := 2; x4cat[15] := 3;

    // Set parameters describing tree
    TreeSizeSpecification := CART.TreeSizeSpecification;
    TreeSizeSpecification.MaximumNumberOfLevels := 10;
    TreeSizeSpecification.MinimumNumberOfCases := 2;
    // Set explained series
    CART.Dependent.Value := y;
    // Set explanatory ordinal series
    CART.ExplanatoriesOrdered.Add().Value := x1;
    CART.ExplanatoriesOrdered.Add().Value := x2;
    // Set explanatory quantitative series
    cart.ExplanatoriesContinuous.Add().Value := x3dbl;
    // Set explanatory categorical series
    CART.ExplanatoriesCategorical.Add().Value := x4cat;
    // Execute calculation
    res := CART.Execute();
    If res <> 0 Then
        System.Diagnostics.Debug.WriteLine("An error occurred");
        System.Diagnostics.Debug.WriteLine(CART.Errors);
    // If calculation is executed without errors, display results   
    Else
        System.Diagnostics.Debug.WriteLine("Initial values - processed values:");
        System.Diagnostics.Debug.Indent();
        Value := CART.Dependent.Value;
        For i := 0 To CART.Dependent.Value.Length - 1 Do
            str := i.ToString() + ":   ";
            str := str + Value[i].ToString() + "   -   ";
            str := str + CART.FilledDependent.GetValue(i).ToString() + "    ";
            System.Diagnostics.Debug.WriteLine(str);
        End For;
        System.Diagnostics.Debug.Unindent();
        // Display list of categories
        CatList := CART.CategoriesList;
        If CatList.Length > 0 Then
            System.Diagnostics.Debug.WriteLine("List of categories:");
            System.Diagnostics.Debug.Indent();
            For i := 0 To CatList.Length - 1 Do
                System.Diagnostics.Debug.WriteLine(CatList[i]);
            End For;
            System.Diagnostics.Debug.Unindent();
        End If;
        // Display decision tree   
        System.Diagnostics.Debug.WriteLine("Decision tree:");
        print(CART.Tree);
    End If;
End Sub;


// Procedure of outputting decision tree
Public Shared Sub print(node: IBinaryTreeNode);
Var
    i: Integer;
    Categorical: Boolean = False;
Begin
    System.Diagnostics.Debug.Indent();
    System.Diagnostics.Debug.WriteLine("Node number: " + node.NodeIndex.ToString());
    System.Diagnostics.Debug.WriteLine("Improvement: " + node.Improvement.ToString());
    System.Diagnostics.Debug.WriteLine("Number of cases in node: " + node.Total.ToString());
    System.Diagnostics.Debug.WriteLine("Criterion index: " + node.ExplanatorieIndex.ToString());
    System.Diagnostics.Debug.WriteLine("Criterion name: " + node.Name);
    System.Diagnostics.Debug.Write("Criterion type: ");
    Select Case node.PropertyType
        Case
            DecisionTreePropertyType.dtptCategorical: System.Diagnostics.Debug.WriteLine("categorical");
            Categorical := True;
        Case DecisionTreePropertyType.dtptNoProperty: System.Diagnostics.Debug.WriteLine("-");
        Case DecisionTreePropertyType.dtptOrdered: System.Diagnostics.Debug.WriteLine("ordinal");
        Case DecisionTreePropertyType.dtptValue: System.Diagnostics.Debug.WriteLine("quantitative");
    End Select;
    If Not Categorical Then
        System.Diagnostics.Debug.WriteLine("Criterion value: " + node.Value.ToString());
    End If;
    If (node.LeftNode <> NullThen
        System.Diagnostics.Debug.WriteLine("Left branch:  ");
        print(node.LeftNode);
    End If;

    If (node.LeftNodeCategories.Length <> 0And Categorical Then
        System.Diagnostics.Debug.WriteLine("List of categories which are sorted to the left branch: ");
        For i := 0 To node.LeftNodeCategories.Length - 1 Do
            System.Diagnostics.Debug.WriteLine(node.LeftNodeCategories.GetValue(i));
        End For;
    End If;
    If (node.RightNode <> NullThen
        System.Diagnostics.Debug.WriteLine("Right branch: ");
        print(node.RightNode);
    End If;
    If (node.RightNodeCategories.Length <> 0And Categorical Then
        System.Diagnostics.Debug.WriteLine("List of categories which are sorted to the right branch: ");
        For i := 0 To node.RightNodeCategories.Length - 1 Do
            System.Diagnostics.Debug.WriteLine(node.RightNodeCategories.GetValue(i));
        End For;
    End If;
    System.Diagnostics.Debug.Unindent();
End Sub print;

See also:

ISmCART