ClassificationSummary: Array;
Свойство ClassificationSummary возвращает сводные результаты классификации.
Для получения списка категорий используйте свойство ISmGradientBoostedTree.CategoriesList.
Добавьте ссылку на системную сборку Stat.
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
// Создаем объект для
расчета градиентного бустинга
GB := New
SmGradientBoostedTree.Create;
// Задаем значения объясняемого
ряда
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;
// Задаем значения объясняющего
порядкового ряда Ord1
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;
// Задаем значения объясняющего
порядкового ряда Ord2
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;
// Задаем значения объясняющего
количественного ряда
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;
// Задаем значение объясняющего
категориального ряда
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;
// Задаем число итераций
GB.NumberOfIterations := 5;
// Задаем коэффициент скорости
обучения
GB.LearningRate := 0.15;
// Задаем параметры, описывающее
дерево
TreeSizeSpecification := GB.TreeSizeSpecification;
TreeSizeSpecification.MaximumNumberOfLevels :=
1;
TreeSizeSpecification.MinimumNumberOfCases := 2;
// Задаем объясняемый ряд
и настраиваем для него процедуру Binning
GB.Dependent.Name:="Объясняемый";
BinningSett := GB.Dependent.BinningSettings;
BinningSett.DoubleValue := y;
BinningSett.Method := binningmethod.EqualDepth;
BinningSett.NumOfCategories := 3;
// Задаем объясняющие порядковые ряды
ExpSeries := GB.ExplanatoriesOrdered;
// Ряд Ord1
ESeries := ExpSeries.Add;
ESeries.Value := x1ord;
ESeries.Name := "Ord1";
// Ряд Ord2
ESeries := ExpSeries.Add;
ESeries.Value := x2ord;
ESeries.Name := "Ord2";
// Задаем объясняющий количественный
ряд
Series := GB.ExplanatoriesContinuous;
Serie := Series.Add;
Serie.Value := x3dbl;
Serie.Name := "x3dbl";
// Задаем объясняющий категориальный
ряд
ExpSeries := GB.ExplanatoriesCategorical;
ESeries := ExpSeries.Add;
ESeries.Value := x4cat;
ESeries.Name := "Cat1";
// Задаем параметры кросс-валидации
CrossValidation := GB.CrossValidation;
CrossValidation.SamplingType := CrossValidationSamplingType.RandomSampling;
CrossValidation.NumberOfRandomTests := 15;
CrossValidation.TrainingSetSize := 60;
// Задаем параметры ROC-кривой
ROCcurve := GB.ROCcurve;
ROCcurve.ConfidenceLevel := 0.85;
// Выполняем расчет
res := GB.Execute;
// Выводим результаты расчета
If res <>
0 Then
Debug.WriteLine("Произошла
ошибка:");
Debug.WriteLine(GB.Errors);
Else
//
Выводим начальные и обработанные значения
Debug.WriteLine("Начальные значения; Обработанные значения;");
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;
//
Выводим апостериорные вероятности
Debug.WriteLine("Апостериорные вероятности:");
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;
//
Выводим список категорий
CatList := GB.CategoriesList;
If
CatList.Length > 0 Then
Debug.WriteLine("Список категорий:");
Debug.Indent;
For i := 0 To CatList.Length - 1
Do
Debug.WriteLine(CatList[i]);
End For;
Debug.Unindent;
End
If;
// Выводим сводные результаты классификации
Debug.WriteLine("Сводные результаты классификации:");
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;
//
Выводим результаты расчета процедуры Binning
Debug.WriteLine("Результаты расчета процедуры Binning:");
Debug.Indent;
BinningRes := BinningSett.IntegerValue;
For
i := 0 To BinningRes.Length
- 1 Do
Debug.WriteLine(BinningRes[i]);
End
For;
Debug.Unindent;
//
Выводим результаты кросс-валидации
GB.ExecuteValidation;
CrossValPerf := GB.PerformanceScores;
Debug.WriteLine("Результаты
кросс-валидации:");
Debug.Indent;
Debug.WriteLine("Анализируемый
признак: " + CrossValPerf.ClassificatorName);
Debug.Write("Количество
факторов, влияющих на анализируемый признак: ");
Debug.WriteLine(CrossValPerf.FactorsNumber);
Debug.WriteLine("Количество
наблюдений: " + CrossValPerf.ObservationsNumber.ToString);
Debug.WriteLine("Количество
повторений: " + CrossValidation.NumberOfRandomTests.ToString);
Debug.WriteLine("Точность
классификации: " + CrossValPerf.ClassificationAccuracy.ToString);
Debug.WriteLine("Категории:");
Debug.Indent;
CategoriesList := CrossValPerf.CategoriesList;
For
i := 0 To CategoriesList.Length
- 1 Do
Debug.WriteLine(CategoriesList[i]);
End
For;
Debug.Unindent;
Debug.WriteLine("Корректная
классификация:");
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;
//
Выводим данные ROC-кривой
Debug.WriteLine("Данные
ROC-кривой:");
Debug.Indent;
Debug.WriteLine("Специфичность:");
Debug.Indent;
OneMinusSpecificity :=
ROCcurve.OneMinusSpecificity;
For
i := 0 To OneMinusSpecificity.Length
- 1 Do
Debug.WriteLine(OneMinusSpecificity[i]);
End
For;
Debug.Unindent;
Debug.WriteLine("Чувствительность:");
Debug.Indent;
Sensitivity := ROCcurve.Sensitivity;
For
i := 0 To Sensitivity.Length
- 1 Do
Debug.WriteLine(Sensitivity[i]);
End
For;
Debug.Unindent;
Debug.WriteLine("Площадь
под кривой: " + ROCcurve.Area.ToString);
Debug.WriteLine("Стандартная
ошибка: " + ROCcurve.StdError.ToString);
Debug.WriteLine("Асимптотический
доверительный интервал:");
Debug.Indent;
Debug.WriteLine("Нижняя
граница: " + ROCcurve.ConfidenceIntervalLower.ToString);
Debug.WriteLine("Верхняя
граница: " + ROCcurve.ConfidenceIntervalUpper.ToString);
Debug.Unindent;
Debug.WriteLine("Порог
отсечения:");
Debug.Indent;
CutOffPoints := ROCcurve.CutOffPoints;
For
i := 0 To CutOffPoints.Length
- 1 Do
Debug.WriteLine(CutOffPoints[i]);
End
For;
Debug.Unindent;
Debug.Unindent;
//
Выводим дерево решений
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("Дерево решений");
Debug.WriteLine(" [" + i.ToString + ","
+ j.ToString + "]:");
print(TreeNode);
Debug.WriteLine("");
End If;
End For;
End For;
// Выводим критерии качества классификации
Debug.Unindent;
Debug.Unindent;
Debug.WriteLine("Критерии качества классификации");
Debug.WriteLine("Общая точность: " + GB.RelevanceMeasure.Accuracy.ToString);
Debug.WriteLine("Ф - оценка: " + GB.RelevanceMeasure.F1.ToString);
Debug.WriteLine("Количество истинно-положительных значений: " + GB.RelevanceMeasure.TruePositive.ToString);
Debug.WriteLine("Количество истинно-отрицательных значений: " + GB.RelevanceMeasure.TrueNegative.ToString);
Debug.WriteLine("Количество ложно-положительных значений: " + GB.RelevanceMeasure.FalsePositive.ToString);
Debug.WriteLine("Количество ложно-отрицательных значений: " + GB.RelevanceMeasure.FalseNegative.ToString);
End If;
End Sub UserProc;
// Процедура вывода дерева решений
Sub print(node: IBinaryTreeNode);
Var
i: Integer;
Categorical: Boolean = False;
Begin
Debug.Indent;
Debug.WriteLine("Вершина
номер: " + node.NodeIndex.ToString);
Debug.WriteLine("Число
кейсов в вершине: " + node.Total.ToString);
Debug.WriteLine("Индекс
критерия: " + node.ExplanatorieIndex.ToString);
Debug.WriteLine("Имя
критерия: " + node.Name);
Debug.Write("Тип критерия:
");
Select Case
node.PropertyType
Case
DecisionTreePropertyType.Categorical:
Debug.WriteLine("категориальный");
Categorical
:= True;
Case
DecisionTreePropertyType.NoProperty: Debug.WriteLine("-");
Case
DecisionTreePropertyType.Ordered: Debug.WriteLine("порядковый");
Case
DecisionTreePropertyType.Value: Debug.WriteLine("количественный");
End Select;
If Not
Categorical Then
Debug.WriteLine("Значение
критерия: " + node.Value.ToString);
End If;
Debug.WriteLine("Дисперсия:
" + node.Disp.ToString);
Debug.WriteLine("Среднее:
" + node.Mean.ToString);
Debug.WriteLine("Сумма
квадратов остатков: " + node.SSR.ToString);
If (node.LeftNode
<> Null) Then
Debug.WriteLine("Левая
ветка: ");
print(node.LeftNode);
End If;
If (node.LeftNodeCategories.Length
<> 0) And
Categorical Then
Debug.WriteLine("Список
категорий, которые отсеиваются в левую ветку: ");
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("Правая
ветка: ");
print(node.RightNode);
End If;
If (node.RightNodeCategories.Length
<> 0) And
Categorical Then
Debug.WriteLine("Список
категорий, которые отсеиваются в правую ветку: ");
For
i := 0 To node.RightNodeCategories.Length
- 1 Do
Debug.WriteLine(node.RightNodeCategories[i]);
End
For;
End If;
Debug.Unindent;
End Sub print;
В результате выполнения примера в окно консоли будут выведены результаты рассчёта задачи методом градиентного бустинга и критерии качества классификации.
См. также: