ISmGradientBoostedTree.ClassificationSummary

Syntax

ClassificationSummary: Array;

ClassificationSummary: System.Array;

Description

The ClassificationSummary property returns summary results of classification.

Comments

To get a list of categories, use the ISmGradientBoostedTree.CategoriesListproperty.

Example

Add a link to the Stat system assembly.

Sub UserProc;
Var
    GB: SmGradientBoostedTree;
    y: Array[20] Of Double;
    x1ord: Array[20] Of integer;
    x2ord: Array[20] Of integer;
    x3dbl: array[20] Of double;
    x4cat: array[20] Of integer;
    TreeSizeSpecification: ITreeSpecification;
    BinningSett: IBinningSettingsInt;
    ExpSeries: ISlSeriesInt;
    ESeries: ISlSerieInt;
    Series: ISlSeries;
    Serie: ISlSerie;
    CrossValidation: ICrossValidation;
    i, j, res: integer;
    str: String;
    d: double;
    CrossValPerf: ICrossValidationPerformanceScores;
    TreeNode: IBinaryTreeNode;
    CatList, BinningRes, CategoriesList: Array Of Integer;
    PerformanceMatrix, OneMinusSpecificity, Sensitivity, CutOffPoints: Array Of Double;
    ROCcurve: IROCcurve;
Begin
    // Create object for gradient boosting calculation
    GB := New SmGradientBoostedTree.Create;
    // Set explained series values
    y[0] := 0; y[5] := 1; y[10] := 1; y[15] := 1;
    y[1] := 1; y[6] := 0; y[11] := 1; y[16] := 0;
    y[2] := 0; y[7] := 1; y[12] := 1; y[17] := 1;
    y[3] := 0; y[8] := 0; y[13] := 0; y[18] := 0;
    y[4] := 0; y[9] := 0; y[14] := 0; y[19] := 1;
    // Set values of the Ord1 explanatory ordinal series
    x1ord[0] := 0; x1ord[5] := 0; x1ord[10] := 1; x1ord[15] := 1;
    x1ord[1] := 0; x1ord[6] := 0; x1ord[11] := 1; x1ord[16] := -1;
    x1ord[2] := 0; x1ord[7] := 0; x1ord[12] := 1; x1ord[17] := 0;
    x1ord[3] := 0; x1ord[8] := 0; x1ord[13] := 1; x1ord[18] := 0;
    x1ord[4] := 0; x1ord[9] := 1; x1ord[14] := 1; x1ord[19] := 1;
    // Set values of the Ord2 explanatory ordinal series
    x2ord[0] := 10; x2ord[5] := 20; x2ord[10] := 10; x2ord[15] := -1;
    x2ord[1] := 10; x2ord[6] := 20; x2ord[11] := 20; x2ord[16] := 20;
    x2ord[2] := 10; x2ord[7] := 20; x2ord[12] := 20; x2ord[17] := 20;
    x2ord[3] := 10; x2ord[8] := 20; x2ord[13] := 20; x2ord[18] := 20;
    x2ord[4] := 10; x2ord[9] := 10; x2ord[14] := 20; x2ord[19] := 10;
    // Set values of explanatory quantitative series
    x3dbl[0] := 1; x3dbl[5] := 6; x3dbl[10] := 10; x3dbl[15] := 14;
    x3dbl[1] := 2; x3dbl[6] := 7; x3dbl[11] := 10; x3dbl[16] := 4;
    x3dbl[2] := 3; x3dbl[7] := 8; x3dbl[12] := 11; x3dbl[17] := 8;
    x3dbl[3] := 5; x3dbl[8] := 9; x3dbl[13] := 12; x3dbl[18] := 9;
    x3dbl[4] := 4; x3dbl[9] := 9; x3dbl[14] := 13; x3dbl[19] := 9;
    // Set values of explanatory categorical series
    x4cat[0] := 21; x4cat[5] := 21; x4cat[10] := 12; x4cat[15] := 13;
    x4cat[1] := 21; x4cat[6] := 21; x4cat[11] := 12; x4cat[16] := 13;
    x4cat[2] := 21; x4cat[7] := 12; x4cat[12] := 13; x4cat[17] := 13;
    x4cat[3] := 21; x4cat[8] := 12; x4cat[13] := 13; x4cat[18] := 13;
    x4cat[4] := 21; x4cat[9] := 12; x4cat[14] := 13; x4cat[19] := 12;

    // Set number of iterations
    GB.NumberOfIterations := 5;
    // Set training speed coefficient
    GB.LearningRate := 0.15;
    // Set tree description parameters
    TreeSizeSpecification := GB.TreeSizeSpecification;
    TreeSizeSpecification.MaximumNumberOfLevels := 1;
    TreeSizeSpecification.MinimumNumberOfCases := 2;
    // Set an explained series and set up the Binning procedure for it
    GB.Dependent.Name:="Explained";
    BinningSett := GB.Dependent.BinningSettings;
    BinningSett.DoubleValue := y;
    BinningSett.Method := binningmethod.EqualDepth;
    BinningSett.NumOfCategories := 3;

    // Set explanatory ordinal series
    ExpSeries := GB.ExplanatoriesOrdered;
    // Series Ord1
    ESeries := ExpSeries.Add;
    ESeries.Value := x1ord;
    ESeries.Name := "Ord1";
    // Series Ord2
    ESeries := ExpSeries.Add;
    ESeries.Value := x2ord;
    ESeries.Name := "Ord2";
    // Set explanatory quantitative series
    Series := GB.ExplanatoriesContinuous;
    Serie := Series.Add;
    Serie.Value := x3dbl;
    Serie.Name := "x3dbl";
    // Set explanatory categorical series
    ExpSeries := GB.ExplanatoriesCategorical;
    ESeries := ExpSeries.Add;
    ESeries.Value := x4cat;
    ESeries.Name := "Cat1";
    // Set cross-validation parameters
    CrossValidation := GB.CrossValidation;
    CrossValidation.SamplingType := CrossValidationSamplingType.RandomSampling;
    CrossValidation.NumberOfRandomTests := 15;
    CrossValidation.TrainingSetSize := 60;
    // Set ROC curve parameters
    ROCcurve := GB.ROCcurve;
    ROCcurve.ConfidenceLevel := 0.85;
    // Perform calculation
    res := GB.Execute;
    // Output calculation results
    If res <> 0 Then
        Debug.WriteLine("Error occurred:");
        Debug.WriteLine(GB.Errors);
    Else
        // Output initial and processed values
        Debug.WriteLine("Initial values; Processed values;");
        Debug.Indent;
        For i := 0 To BinningSett.DoubleValue.Length - 1 Do
            str := i.ToString + ": ";
            d := BinningSett.DoubleValue[i];
            str := str + d.ToString + " - ";
            d := GB.FilledDependent[i];
            str := str + d.ToString + "    ";
            Debug.WriteLine(str);
        End For;
        Debug.Unindent;
        // Output posterior probabilities
        Debug.WriteLine("A posteriori probabilities:");
        Debug.Indent;
        For i := 0 To GB.PseudoProbability.GetUpperBound(1) Do
            str := i.ToString + ": ";
            For j := 0 To GB.PseudoProbability.GetUpperBound(2) Do
                d := GB.PseudoProbability[i, j];
                str := str + d.ToString + ", ";
            End For;
            Debug.WriteLine(str);
        End For;
        Debug.Unindent;
        // Display list of categories
        CatList := GB.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;

        // Output summary classification results
        Debug.WriteLine("Summary classification results:");
        Debug.Indent;
        str := "";
        For i := 0 To GB.ClassificationSummary.GetUpperBound(1) Do
            For j := 0 To GB.ClassificationSummary.GetUpperBound(2) Do
                str := str + GB.ClassificationSummary[i, j].ToString + " ";
            End For;
            Debug.WriteLine(str);
            str := "";
        End For;
        Debug.Unindent;
        // Output Binning procedure calculation results
        Debug.WriteLine("Binning procedure calculation results:");
        Debug.Indent;
        BinningRes := BinningSett.IntegerValue;
        For i := 0 To BinningRes.Length - 1 Do
            Debug.WriteLine(BinningRes[i]);
        End For;
        Debug.Unindent;
        // Output cross-validation results
        GB.ExecuteValidation;
        CrossValPerf := GB.PerformanceScores;
        Debug.WriteLine("Cross-validation results:");
        Debug.Indent;
        Debug.WriteLine("Analyzed attribute: " + CrossValPerf.ClassificatorName);
        Debug.Write("Number of factors affecting the analyzed attribute: ");
        Debug.WriteLine(CrossValPerf.FactorsNumber);
        Debug.WriteLine("Number of observations: " + CrossValPerf.ObservationsNumber.ToString);
        Debug.WriteLine("Number of repetitions: " + CrossValidation.NumberOfRandomTests.ToString);
        Debug.WriteLine("Classification accuracy: " + CrossValPerf.ClassificationAccuracy.ToString);
        Debug.WriteLine("Categories:");
        Debug.Indent;
        CategoriesList := CrossValPerf.CategoriesList;
        For i := 0 To CategoriesList.Length - 1 Do
            Debug.WriteLine(CategoriesList[i]);
        End For;
        Debug.Unindent;
        Debug.WriteLine("Correct classification:");
        Debug.Indent;
        PerformanceMatrix := CrossValPerf.PerformanceMatrix;
        For i := 0 To PerformanceMatrix.GetUpperBound(1) Do
            For j := 0 To PerformanceMatrix.GetUpperBound(2) Do
                Debug.Write(PerformanceMatrix[i, j].ToString + #9);
            End For;
            Debug.WriteLine("");
        End For;
        Debug.Unindent;
        Debug.Unindent;
        // Output ROC curve data
        Debug.WriteLine("ROC curve data:");
        Debug.Indent;
        Debug.WriteLine("Specificity:");
        Debug.Indent;
        OneMinusSpecificity := ROCcurve.OneMinusSpecificity;
        For i := 0 To OneMinusSpecificity.Length - 1 Do
            Debug.WriteLine(OneMinusSpecificity[i]);
        End For;
        Debug.Unindent;
        Debug.WriteLine("Sensitivity:");
        Debug.Indent;
        Sensitivity := ROCcurve.Sensitivity;
        For i := 0 To Sensitivity.Length - 1 Do
            Debug.WriteLine(Sensitivity[i]);
        End For;

        Debug.Unindent;
        Debug.WriteLine("Area under curve: " + ROCcurve.Area.ToString);
        Debug.WriteLine("Standard error: " + ROCcurve.StdError.ToString);
        Debug.WriteLine("Asymptotic confidence interval:");
        Debug.Indent;
        Debug.WriteLine("Lower limit: " + ROCcurve.ConfidenceIntervalLower.ToString);
        Debug.WriteLine("Upper limit: " + ROCcurve.ConfidenceIntervalUpper.ToString);
        Debug.Unindent;
        Debug.WriteLine("Cutoff threshold:");
        Debug.Indent;
        CutOffPoints := ROCcurve.CutOffPoints;
        For i := 0 To CutOffPoints.Length - 1 Do
            Debug.WriteLine(CutOffPoints[i]);
        End For;
        Debug.Unindent;
        Debug.Unindent;
        // Output decision tree     
        For i := 0 To GB.Trees.Count1 - 1 Do
            For j := 0 To GB.Trees.Count2 - 1 Do
                TreeNode := GB.Trees.Item(i, j);
                If TreeNode <> Null Then
                    Debug.Write("Decision tree");
                    Debug.WriteLine(" [" + i.ToString + "," + j.ToString + "]:");
                    print(TreeNode);
                    Debug.WriteLine("");
                End If;
            End For;
        End For;
        
// Display classification quality criteria
        Debug.Unindent;
        Debug.Unindent;
        Debug.WriteLine(
"Classification quality criteria");
        Debug.WriteLine(
"Overall accuracy: " + GB.RelevanceMeasure.Accuracy.ToString);
        Debug.WriteLine(
"F - estimate: " + GB.RelevanceMeasure.F1.ToString);
        Debug.WriteLine(
"Number of truly positive values: " + GB.RelevanceMeasure.TruePositive.ToString);
        Debug.WriteLine(
"Number of truly negative values: " + GB.RelevanceMeasure.TrueNegative.ToString);
        Debug.WriteLine(
"Number of false positive values: " + GB.RelevanceMeasure.FalsePositive.ToString);
        Debug.WriteLine(
"Number of false negative values: " + GB.RelevanceMeasure.FalseNegative.ToString);
    
End If;

End Sub UserProc;
// Decision tree output procedure
Sub print(node: IBinaryTreeNode);
Var
    i: Integer;
    Categorical: Boolean = False;
Begin
    Debug.Indent;
    Debug.WriteLine("Node No.: " + node.NodeIndex.ToString);
    Debug.WriteLine("Number of node cases: " + 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;
    Debug.WriteLine("Variance: " + node.Disp.ToString);
    Debug.WriteLine("Mean: " + node.Mean.ToString);
    Debug.WriteLine("Sum of squared residuals: " + node.SSR.ToString);
    If (node.LeftNode <> Null) Then
        Debug.WriteLine("Left branch: ");
        print(node.LeftNode);
    End If;
    If (node.LeftNodeCategories.Length <> 0) And Categorical Then
        Debug.WriteLine("List of categories that are sent 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 <> Null) Then
        Debug.WriteLine("Right branch: ");
        print(node.RightNode);
    End If;
    If (node.RightNodeCategories.Length <> 0) And Categorical Then
        Debug.WriteLine("List of categories that are sent 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;

Imports Prognoz.Platform.Interop.Stat;

Public Shared Sub Main(Params: StartParams);
Var
    GB: SmGradientBoostedTree;
    y: Array[20] Of Double;
    x1ord: Array[20] Of integer;
    x2ord: Array[20] Of integer;
    x3dbl: array[20] Of double;
    x4cat: array[20] Of integer;
    TreeSizeSpecification: ITreeSpecification;
    BinningSett: IBinningSettingsInt;
    ExpSeries: ISlSeriesInt;
    ESeries: ISlSerieInt;
    Series: ISlSeries;
    Serie: ISlSerie;
    CrossValidation: ICrossValidation;
    i, j, res: integer;
    str: String;
    d: double;
    CrossValPerf: ICrossValidationPerformanceScores;
    TreeNode: IBinaryTreeNode;
    CatList, BinningRes, CategoriesList: System.Array;
    PerformanceMatrix, OneMinusSpecificity, Sensitivity, CutOffPoints: System.Array;
    ROCcurve: IROCcurve;
Begin
    // Create object for gradient boosting calculation
    GB := New SmGradientBoostedTree.Create();
    // Set explained series values
    y[0] := 0; y[5] := 1; y[10] := 1; y[15] := 1;
    y[1] := 1; y[6] := 0; y[11] := 1; y[16] := 0;
    y[2] := 0; y[7] := 1; y[12] := 1; y[17] := 1;
    y[3] := 0; y[8] := 0; y[13] := 0; y[18] := 0;
    y[4] := 0; y[9] := 0; y[14] := 0; y[19] := 1;
    // Set values of the Ord1 explanatory ordinal series
    x1ord[0] := 0; x1ord[5] := 0; x1ord[10] := 1; x1ord[15] := 1;
    x1ord[1] := 0; x1ord[6] := 0; x1ord[11] := 1; x1ord[16] := -1;
    x1ord[2] := 0; x1ord[7] := 0; x1ord[12] := 1; x1ord[17] := 0;
    x1ord[3] := 0; x1ord[8] := 0; x1ord[13] := 1; x1ord[18] := 0;
    x1ord[4] := 0; x1ord[9] := 1; x1ord[14] := 1; x1ord[19] := 1;
    // Set values of the Ord2 explanatory ordinal series
    x2ord[0] := 10; x2ord[5] := 20; x2ord[10] := 10; x2ord[15] := -1;
    x2ord[1] := 10; x2ord[6] := 20; x2ord[11] := 20; x2ord[16] := 20;
    x2ord[2] := 10; x2ord[7] := 20; x2ord[12] := 20; x2ord[17] := 20;
    x2ord[3] := 10; x2ord[8] := 20; x2ord[13] := 20; x2ord[18] := 20;
    x2ord[4] := 10; x2ord[9] := 10; x2ord[14] := 20; x2ord[19] := 10;
    // Set values of explanatory quantitative series
    x3dbl[0] := 1; x3dbl[5] := 6; x3dbl[10] := 10; x3dbl[15] := 14;
    x3dbl[1] := 2; x3dbl[6] := 7; x3dbl[11] := 10; x3dbl[16] := 4;
    x3dbl[2] := 3; x3dbl[7] := 8; x3dbl[12] := 11; x3dbl[17] := 8;
    x3dbl[3] := 5; x3dbl[8] := 9; x3dbl[13] := 12; x3dbl[18] := 9;
    x3dbl[4] := 4; x3dbl[9] := 9; x3dbl[14] := 13; x3dbl[19] := 9;
    // Set values of explanatory categorical series
    x4cat[0] := 21; x4cat[5] := 21; x4cat[10] := 12; x4cat[15] := 13;
    x4cat[1] := 21; x4cat[6] := 21; x4cat[11] := 12; x4cat[16] := 13;
    x4cat[2] := 21; x4cat[7] := 12; x4cat[12] := 13; x4cat[17] := 13;
    x4cat[3] := 21; x4cat[8] := 12; x4cat[13] := 13; x4cat[18] := 13;
    x4cat[4] := 21; x4cat[9] := 12; x4cat[14] := 13; x4cat[19] := 12;
    // Set number of iterations
    GB.NumberOfIterations := 5;
    // Set training speed coefficient
    GB.LearningRate := 0.15;
    // Set tree description parameters
    TreeSizeSpecification := GB.TreeSizeSpecification;
    TreeSizeSpecification.MaximumNumberOfLevels := 1;
    TreeSizeSpecification.MinimumNumberOfCases := 2;
    // Set explained series and set up the Binning procedure for it
    GB.Dependent.Name:="Explained";
    BinningSett := GB.Dependent.BinningSettings;
    BinningSett.DoubleValue := y;
    BinningSett.Method := binningmethod.bmEqualDepth;
    BinningSett.NumOfCategories := 3;
    // Set explanatory ordinal series
    ExpSeries := GB.ExplanatoriesOrdered;
    // Series Ord1
    ESeries := ExpSeries.Add();
    ESeries.Value := x1ord;
    ESeries.Name := "Ord1";
    // Series Ord2
    ESeries := ExpSeries.Add();
    ESeries.Value := x2ord;
    ESeries.Name := "Ord2";
    // Set explanatory quantitative series
    Series := GB.ExplanatoriesContinuous;
    Serie := Series.Add();
    Serie.Value := x3dbl;
    Serie.Name := "x3dbl";

    // Set explanatory categorical series
    ExpSeries := GB.ExplanatoriesCategorical;
    ESeries := ExpSeries.Add();
    ESeries.Value := x4cat;
    ESeries.Name := "Cat1";
    // Set cross-validation parameters
    CrossValidation := GB.CrossValidation;
    CrossValidation.SamplingType := CrossValidationSamplingType.cvstRandomSampling;
    CrossValidation.NumberOfRandomTests := 15;
    CrossValidation.TrainingSetSize := 60;
    // Set ROC curve parameters
    ROCcurve := GB.ROCcurve;
    ROCcurve.ConfidenceLevel := 0.85;
    // Perform calculation
    res := GB.Execute();
    // Output calculation results
    If res <> 0 Then
        System.Diagnostics.Debug.WriteLine("Error occurred:");
        System.Diagnostics.Debug.WriteLine(GB.Errors);
    Else
        // Output initial and processed values
        System.Diagnostics.Debug.WriteLine("Initial values; Processed values;");
        System.Diagnostics.Debug.Indent();
        For i := 0 To BinningSett.DoubleValue.Length - 1 Do
            str := i.ToString() + ": ";
            str := str + BinningSett.DoubleValue.GetValue(i).ToString() + " - ";
            str := str + BinningSett.DoubleValue.GetValue(i).ToString() + "    ";
            System.Diagnostics.Debug.WriteLine(str);
        End For;
        System.Diagnostics.Debug.Unindent();
        // Output posterior probabilities
        System.Diagnostics.Debug.WriteLine("A posteriori probabilities:");
        System.Diagnostics.Debug.Indent();
        For i := 0 To GB.PseudoProbability.GetUpperBound(0) Do
            str := i.ToString() + ": ";
            For j := 0 To GB.PseudoProbability.GetUpperBound(1) Do
                d := GB.PseudoProbability.GetValue(i, j) As double;
                str := str + d.ToString() + ", ";
            End For;
            System.Diagnostics.Debug.WriteLine(str);
        End For;
        System.Diagnostics.Debug.Unindent();
        // Display list of categories
        CatList := GB.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 summary classification results
        System.Diagnostics.Debug.WriteLine("Summary classification results:");
        System.Diagnostics.Debug.Indent();
        str := "";
        For i := 0 To GB.ClassificationSummary.GetUpperBound(0) Do
            For j := 0 To GB.ClassificationSummary.GetUpperBound(1) Do
                str := str + GB.ClassificationSummary.GetValue(i, j).ToString() + " ";
            End For;
            System.Diagnostics.Debug.WriteLine(str);
            str := "";
        End For;
        System.Diagnostics.Debug.Unindent();
        // Output Binning procedure calculation results
        System.Diagnostics.Debug.WriteLine("Binning procedure calculation results:");
        System.Diagnostics.Debug.Indent();
        BinningRes := BinningSett.IntegerValue;
        For i := 0 To BinningRes.Length - 1 Do
            System.Diagnostics.Debug.WriteLine(BinningRes[i]);
        End For;
        System.Diagnostics.Debug.Unindent();
        // Output cross-validation results
        GB.ExecuteValidation();
        CrossValPerf := GB.PerformanceScores;
        System.Diagnostics.Debug.WriteLine("Cross-validation results:");
        System.Diagnostics.Debug.Indent();
        System.Diagnostics.Debug.WriteLine("Analyzed attribute: " + CrossValPerf.ClassificatorName);
        System.Diagnostics.Debug.Write("Number of factors affecting the analyzed attribute: ");
        System.Diagnostics.Debug.WriteLine(CrossValPerf.FactorsNumber);
        System.Diagnostics.Debug.WriteLine("Number of observations: " + CrossValPerf.ObservationsNumber.ToString());
        System.Diagnostics.Debug.WriteLine("Number of repetitions: " + CrossValidation.NumberOfRandomTests.ToString());
        System.Diagnostics.Debug.WriteLine("Classification accuracy: " + CrossValPerf.ClassificationAccuracy.ToString());
        System.Diagnostics.Debug.WriteLine("Categories:");
        System.Diagnostics.Debug.Indent();
        CategoriesList := CrossValPerf.CategoriesList;
        For i := 0 To CategoriesList.Length - 1 Do
            System.Diagnostics.Debug.WriteLine(CategoriesList[i]);
        End For;
        System.Diagnostics.Debug.Unindent();
        System.Diagnostics.Debug.WriteLine("Correct classification:");
        System.Diagnostics.Debug.Indent();
        PerformanceMatrix := CrossValPerf.PerformanceMatrix;
        For i := 0 To PerformanceMatrix.GetUpperBound(1) Do
            For j := 0 To PerformanceMatrix.GetUpperBound(0) Do
                System.Diagnostics.Debug.Write(PerformanceMatrix[j, i].ToString() + char.ConvertFromUtf32(9));
            End For;
            System.Diagnostics.Debug.WriteLine("");
        End For;
        System.Diagnostics.Debug.Unindent();
        System.Diagnostics.Debug.Unindent();

        // Output ROC curve data
        System.Diagnostics.Debug.WriteLine("ROC curve data:");
        System.Diagnostics.Debug.Indent();
        System.Diagnostics.Debug.WriteLine("Specificity:");
        System.Diagnostics.Debug.Indent();
        OneMinusSpecificity := ROCcurve.OneMinusSpecificity;
        For i := 0 To OneMinusSpecificity.Length - 1 Do
            System.Diagnostics.Debug.WriteLine(OneMinusSpecificity[i]);
        End For;
        System.Diagnostics.Debug.Unindent();
        System.Diagnostics.Debug.WriteLine("Sensitivity:");
        System.Diagnostics.Debug.Indent();
        Sensitivity := ROCcurve.Sensitivity;
        For i := 0 To Sensitivity.Length - 1 Do
            System.Diagnostics.Debug.WriteLine(Sensitivity[i]);
        End For;
        System.Diagnostics.Debug.Unindent();
        System.Diagnostics.Debug.WriteLine("Area under curve: " + ROCcurve.Area.ToString());
        System.Diagnostics.Debug.WriteLine("Standard error: " + ROCcurve.StdError.ToString());
        System.Diagnostics.Debug.WriteLine("Asymptotic confidence interval:");
        System.Diagnostics.Debug.Indent();
        System.Diagnostics.Debug.WriteLine("Lower limit: " + ROCcurve.ConfidenceIntervalLower.ToString());
        System.Diagnostics.Debug.WriteLine("Upper limit: " + ROCcurve.ConfidenceIntervalUpper.ToString());
        System.Diagnostics.Debug.Unindent();
        System.Diagnostics.Debug.WriteLine("Cutoff threshold:");
        System.Diagnostics.Debug.Indent();
        CutOffPoints := ROCcurve.CutOffPoints;
        For i := 0 To CutOffPoints.Length - 1 Do
            System.Diagnostics.Debug.WriteLine(CutOffPoints[i]);
        End For;
        System.Diagnostics.Debug.Unindent();
        System.Diagnostics.Debug.Unindent();
        // Output decision tree     
        For i := 0 To GB.Trees.Count1 - 1 Do
            For j := 0 To GB.Trees.Count2 - 1 Do
                TreeNode := GB.Trees.Item[i, j];
                If TreeNode <> Null Then
                    System.Diagnostics.Debug.Write("Decision tree");
                    System.Diagnostics.Debug.WriteLine(" [" + i.ToString() + "," + j.ToString() + "]:");
                    print(TreeNode);
                    System.Diagnostics.Debug.WriteLine("");
                End If;
            End For;
        End For;
        
// Display classification quality criteria
        System.Diagnostics.Debug.Unindent();
        System.Diagnostics.Debug.Unindent();
        System.Diagnostics.Debug.WriteLine(
"Classification quality criteria");
        System.Diagnostics.Debug.WriteLine(
"Overall accuracy: " + GB.RelevanceMeasure.Accuracy.ToString());
        System.Diagnostics.Debug.WriteLine(
"F - estimate: " + GB.RelevanceMeasure.F1.ToString());
        System.Diagnostics.Debug.WriteLine(
"Number of truly positive values: " + GB.RelevanceMeasure.TruePositive.ToString());
        System.Diagnostics.Debug.WriteLine(
"Number of truly negative values: " + GB.RelevanceMeasure.TrueNegative.ToString());
        System.Diagnostics.Debug.WriteLine(
"Number of false positive values: " + GB.RelevanceMeasure.FalsePositive.ToString());
        System.Diagnostics.Debug.WriteLine(
"Number of false negative values: " + GB.RelevanceMeasure.FalseNegative.ToString());
    
End If;

End Sub;

// Decision tree output procedure
Public Shared Sub print(node: IBinaryTreeNode);
Var
    i: Integer;
    Categorical: Boolean = False;
Begin
    System.Diagnostics.Debug.Indent();
    System.Diagnostics.Debug.WriteLine("Node No.: " + node.NodeIndex.ToString());
    System.Diagnostics.Debug.WriteLine("Number of node cases: " + 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;
    System.Diagnostics.Debug.WriteLine("Variance: " + node.Disp.ToString());
    System.Diagnostics.Debug.WriteLine("Mean: " + node.Mean.ToString());
    System.Diagnostics.Debug.WriteLine("Sum of squared residuals: " + node.SSR.ToString());
    If (node.LeftNode <> Null) Then
        System.Diagnostics.Debug.WriteLine("Left branch: ");
        print(node.LeftNode);
    End If;
    If (node.LeftNodeCategories.Length <> 0) And Categorical Then
        System.Diagnostics.Debug.WriteLine("List of categories that are sent 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 <> Null) Then
        System.Diagnostics.Debug.WriteLine("Right branch: ");
        print(node.RightNode);
    End If;
    If (node.RightNodeCategories.Length <> 0) And Categorical Then
        System.Diagnostics.Debug.WriteLine("List of categories that are sent 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;

As a result of example execution, the console displays problem calculation results with the gradient boosting method and classification quality criteria.

See also:

ISmGradientBoostedTree