ClassificationSummary: Array;
The ClassificationSummary property returns summary results of classification.
To get a list of categories, use the ISmGradientBoostedTree.CategoriesListproperty.
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;
As a result of example execution, the console displays problem calculation results with the gradient boosting method and classification quality criteria.
See also: