Probabilities: Array;
Probabilities: System.Array;
Свойство Probabilities возвращает ряд вероятностей прогноза логистической регрессии.
Для определения порогового значения вероятности для классификации используйте свойство ISmLogisticRegression.Threshold.
Для выполнения примера добавьте ссылку на системную сборку Stat.
Sub
UserLogisticR;
Var
Binary: SmLogisticRegression;
e, s: Array[62] Of Double;
Coef: IModelCoefficients;
stat: ISummaryStatistics;
i, res: Integer;
ROCcurve: IROCcurve;
FilledDependent, ar, Probabilities, ProbFitted:
Array Of Double;
OneMinusSpecificity, Sensitivity, CutOffPoints:
Array Of Double;
Begin
// Задаем данные для анализа
// Значения, соответствующие
социальному статусу
s[0] := Double.Nan;
s[11] := 0;
s[22] := 0;
s[33] := Double.Nan; s[44]
:= 1; s[55]
:= Double.Nan;
s[1] := 1;
s[12] := 1;
s[23] := 1;
s[34] := 0;
s[45] := 1;
s[56] := 1;
s[2] := Double.Nan;
s[13] := 1;
s[24] := 0;
s[35] := 0;
s[46] := 1;
s[57] := 1;
s[3] := 0;
s[14] := 0;
s[25] := 0;
s[36] := 1;
s[47] := 0;
s[58] := 1;
s[4] := 0;
s[15] := 0;
s[26] := 0;
s[37] := 0;
s[48] := 1;
s[59] := 1;
s[5] := 1;
s[16] := 0;
s[27] := 0;
s[38] := 0;
s[49] := 0;
s[60] := 0;
s[6] := 0;
s[17] := 0;
s[28] := 0;
s[39] := 0;
s[50] := 0;
s[61] := 0;
s[7] := 1;
s[18] := Double.Nan; s[29]
:= Double.Nan; s[40] := 0;
s[51] := Double.Nan;
s[8] := 1;
s[19] := 0;
s[30] := 0;
s[41] := 0;
s[52] := 0;
s[9] := 1;
s[20] := 1;
s[31] := 0;
s[42] := Double.Nan; s[53]
:= 0;
s[10] := 1;
s[21] := 0;
s[32] := 0;
s[43] := 1;
s[54] := 0;
// Значения, соответствующие
возрастной группе
e[0] := 1; e[11] := 0; e[22] := 1; e[33] := 2; e[44] := 2; e[55] := 2;
e[1] := 1;
e[12] := 1;
e[23] := 2;
e[34] := 1;
e[45] := 0;
e[56] := 0;
e[2] := 1;
e[13] := 1;
e[24] := 1;
e[35] := 3;
e[46] := 1;
e[57] := 1;
e[3] := 0;
e[14] := 1;
e[25] := 0;
e[36] := 1;
e[47] := 1;
e[58] := 0;
e[4] := 0;
e[15] := 2;
e[26] := 1;
e[37] := 1;
e[48] := 1;
e[59] := 0;
e[5] := 1;
e[16] := 1;
e[27] := 0;
e[38] := 2;
e[49] := 0;
e[60] := 2;
e[6] := 2;
e[17] := 0;
e[28] := 1;
e[39] := 3;
e[50] := 1;
e[61] := 2;
e[7] := 0;
e[18] := 1;
e[29] := 3;
e[40] := 1;
e[51] := 0;
e[8] := 3;
e[19] := 3;
e[30] := 1;
e[41] := 0;
e[52] := 0;
e[9] := 1;
e[20] := 4;
e[31] := 1;
e[42] := 4;
e[53] := 2;
e[10] := 2;
e[21] := 0;
e[32] := 2;
e[43] := 1;
e[54] := 0;
// Создаем метод
binary := New
SmLogisticRegression.Create;
// Задаем объясняемый ряд
binary.Dependent.Value := s;
// Задаем признак для классификации
binary.Explanatories.Add.Value := e;
// Задаем точность решения
binary.Tolerance := 0.005;
// Задаем максимальное число
итераций
binary.MaxIteration := 10000;
// Задаем параметры ROC-кривой
ROCcurve := binary.ROCcurve;
ROCcurve.ConfidenceLevel := 0.85;
// Выполняем расчёт и выводим
результаты расчёта
res := binary.Execute;
If res <> 0 Then
Debug.WriteLine(binary.Errors);
Else
Debug.WriteLine("Количество
итераций, потребовавшихся для решения: ");
Debug.Indent;
Debug.WriteLine(binary.NumOfIter);
Debug.Unindent;
Debug.WriteLine("До
заполнения; после заполнения");
Debug.Indent;
FilledDependent := binary.FilledDependent.Value;
For
i := 0 To s.Length
- 1 Do
If s[i] = 0 Then
Debug.Write("Single ");
Elseif s[i] = 1
Then
Debug.Write("Married ");
Else
Debug.Write(" - ");
End If;
If FilledDependent[i] = 0
Then
Debug.WriteLine("Single");
Else
Debug.WriteLine("Married");
End If;
End
For;
Debug.Unindent;
Debug.WriteLine("Оцененные
значения коэффициентов:");
Debug.Indent;
Coef := binary.ModelCoefficients;
ar := Coef.Coefficients.Estimate;
For
i := 0 To ar.Length
- 1 Do
Debug.WriteLine(ar[i]);
End
For;
Debug.Unindent;
Debug.WriteLine("Среднее
логарифма функции правдоподобия: ");
Debug.Indent;
Stat := binary.SummaryStatistics;
Debug.WriteLine(Stat.AvgLogL);
Debug.Unindent;
Debug.WriteLine("Ряд
вероятностей");
Debug.Indent;
Probabilities := binary.Probabilities;
For
i := 0 To Probabilities.Length
- 1 Do
Debug.WriteLine((i
+ 1).ToString + ".
" + Probabilities[i].ToString);
End
For;
Debug.Unindent;
Debug.WriteLine("Ряд
вероятностей для обучающих объектов");
Debug.Indent;
ProbFitted := binary.ProbFitted;
For
i := 0 To ProbFitted.Length
- 1 Do
Debug.WriteLine((i
+ 1).ToString + ".
" + ProbFitted[i].ToString);
End
For;
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;
End If;
End Sub UserLogisticR;
В результате выполнения примера будет настроена и рассчитана логистическа регрессия, в окно консоли будут выведен ряды результаты расчета.
Необходимые требования и результат выполнения примера Fore.NET совпадают с примером Fore.
Imports
Prognoz.Platform.Interop.Stat;
…
Public Shared
Sub Main(Params: StartParams);
Var
Binary: SmLogisticRegression;
e, s: Array[62] Of Double;
Coef: IModelCoefficients;
stat: ISummaryStatistics;
i, res: Integer;
ROCcurve: IROCcurve;
FilledDependent, ar, Probabilities, ProbFitted:
System.Array;
OneMinusSpecificity, Sensitivity, CutOffPoints:
System.Array;
Begin
// Задаем данные для анализа
// Значения, соответствующие
социальному статусу
s[0] := Double.Nan;
s[11] := 0;
s[22] := 0;
s[33] := Double.Nan; s[44]
:= 1; s[55]
:= Double.Nan;
s[1] := 1;
s[12] := 1;
s[23] := 1;
s[34] := 0;
s[45] := 1;
s[56] := 1;
s[2] := Double.Nan;
s[13] := 1;
s[24] := 0;
s[35] := 0;
s[46] := 1;
s[57] := 1;
s[3] := 0;
s[14] := 0;
s[25] := 0;
s[36] := 1;
s[47] := 0;
s[58] := 1;
s[4] := 0;
s[15] := 0;
s[26] := 0;
s[37] := 0;
s[48] := 1;
s[59] := 1;
s[5] := 1;
s[16] := 0;
s[27] := 0;
s[38] := 0;
s[49] := 0;
s[60] := 0;
s[6] := 0;
s[17] := 0;
s[28] := 0;
s[39] := 0;
s[50] := 0;
s[61] := 0;
s[7] := 1;
s[18] := Double.Nan; s[29]
:= Double.Nan; s[40] := 0;
s[51] := Double.Nan;
s[8] := 1;
s[19] := 0;
s[30] := 0;
s[41] := 0;
s[52] := 0;
s[9] := 1;
s[20] := 1;
s[31] := 0;
s[42] := Double.Nan; s[53]
:= 0;
s[10] := 1;
s[21] := 0;
s[32] := 0;
s[43] := 1;
s[54] := 0;
// Значения, соответствующие
возрастной группе
e[0] := 1; e[11] := 0; e[22] := 1; e[33] := 2; e[44] := 2; e[55] := 2;
e[1] := 1;
e[12] := 1;
e[23] := 2;
e[34] := 1;
e[45] := 0;
e[56] := 0;
e[2] := 1;
e[13] := 1;
e[24] := 1;
e[35] := 3;
e[46] := 1;
e[57] := 1;
e[3] := 0;
e[14] := 1;
e[25] := 0;
e[36] := 1;
e[47] := 1;
e[58] := 0;
e[4] := 0;
e[15] := 2;
e[26] := 1;
e[37] := 1;
e[48] := 1;
e[59] := 0;
e[5] := 1;
e[16] := 1;
e[27] := 0;
e[38] := 2;
e[49] := 0;
e[60] := 2;
e[6] := 2;
e[17] := 0;
e[28] := 1;
e[39] := 3;
e[50] := 1;
e[61] := 2;
e[7] := 0;
e[18] := 1;
e[29] := 3;
e[40] := 1;
e[51] := 0;
e[8] := 3;
e[19] := 3;
e[30] := 1;
e[41] := 0;
e[52] := 0;
e[9] := 1;
e[20] := 4;
e[31] := 1;
e[42] := 4;
e[53] := 2;
e[10] := 2;
e[21] := 0;
e[32] := 2;
e[43] := 1;
e[54] := 0;
// Создаем метод
binary := New
SmLogisticRegression.Create();
// Задаем объясняемый ряд
binary.Dependent.Value := s;
// Задаем признак для классификации
binary.Explanatories.Add().Value := e;
// Задаем точность решения
binary.Tolerance := 0.005;
// Задаем максимальное число
итераций
binary.MaxIteration := 10000;
// Задаем параметры ROC-кривой
ROCcurve := binary.ROCcurve;
ROCcurve.ConfidenceLevel := 0.85;
// Выполняем расчёт и выводим
результаты расчёта
res := binary.Execute();
If res <> 0 Then
System.Diagnostics.Debug.WriteLine(binary.Errors);
Else
System.Diagnostics.Debug.WriteLine("Количество итераций, потребовавшихся для решения:
");
System.Diagnostics.Debug.Indent();
System.Diagnostics.Debug.WriteLine(binary.NumOfIter);
System.Diagnostics.Debug.Unindent();
System.Diagnostics.Debug.WriteLine("До заполнения; после заполнения");
System.Diagnostics.Debug.Indent();
FilledDependent := binary.FilledDependent.Value;
For
i := 0 To s.Length
- 1 Do
If s[i] = 0 Then
System.Diagnostics.Debug.Write("Single ");
Elseif s[i] = 1
Then
System.Diagnostics.Debug.Write("Married ");
Else
System.Diagnostics.Debug.Write(" - ");
End If;
If FilledDependent[i] As
double = 0 Then
System.Diagnostics.Debug.WriteLine("Single");
Else
System.Diagnostics.Debug.WriteLine("Married");
End If;
End
For;
System.Diagnostics.Debug.Unindent();
System.Diagnostics.Debug.WriteLine("Оцененные значения коэффициентов:");
System.Diagnostics.Debug.Indent();
Coef := binary.ModelCoefficients;
ar := Coef.Coefficients.Estimate;
For
i := 0 To ar.Length
- 1 Do
System.Diagnostics.Debug.WriteLine(ar[i]);
End
For;
System.Diagnostics.Debug.Unindent();
System.Diagnostics.Debug.WriteLine("Среднее логарифма функции правдоподобия: ");
System.Diagnostics.Debug.Indent();
Stat := binary.SummaryStatistics;
System.Diagnostics.Debug.WriteLine(Stat.AvgLogL);
System.Diagnostics.Debug.Unindent();
System.Diagnostics.Debug.WriteLine("Ряд вероятностей");
System.Diagnostics.Debug.Indent();
Probabilities := binary.Probabilities;
For
i := 0 To Probabilities.Length
- 1 Do
System.Diagnostics.Debug.WriteLine((i
+ 1).ToString() + ".
" + Probabilities[i].ToString());
End
For;
System.Diagnostics.Debug.Unindent();
System.Diagnostics.Debug.WriteLine("Ряд вероятностей для обучающих объектов");
System.Diagnostics.Debug.Indent();
ProbFitted := binary.ProbFitted;
For
i := 0 To ProbFitted.Length
- 1 Do
System.Diagnostics.Debug.WriteLine((i
+ 1).ToString() + ".
" + ProbFitted[i].ToString());
End
For;
System.Diagnostics.Debug.Unindent();
//
Выводим данные ROC-кривой
System.Diagnostics.Debug.WriteLine("Данные ROC-кривой:");
System.Diagnostics.Debug.Indent();
System.Diagnostics.Debug.WriteLine("Специфичность:");
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("Чувствительность:");
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("Площадь под кривой: " + ROCcurve.Area.ToString());
System.Diagnostics.Debug.WriteLine("Стандартная ошибка: " + ROCcurve.StdError.ToString());
System.Diagnostics.Debug.WriteLine("Асимптотический доверительный интервал:");
System.Diagnostics.Debug.Indent();
System.Diagnostics.Debug.WriteLine("Нижняя граница: " + ROCcurve.ConfidenceIntervalLower.ToString());
System.Diagnostics.Debug.WriteLine("Верхняя граница: " + ROCcurve.ConfidenceIntervalUpper.ToString());
System.Diagnostics.Debug.Unindent();
System.Diagnostics.Debug.WriteLine("Порог отсечения:");
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();
End If;
End Sub;
См. также: