ISmLogisticRegression.Probabilities

Синтаксис

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, j, res: Integer;
    ROCcurve: IROCcurve;
    FilledDependent, ar, Probabilities, ProbFitted: Array Of Double;
    OneMinusSpecificity, Sensitivity, CutOffPoints: Array Of Double;
    str: String;
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;
        // Выводим сводные результаты классификации
        Debug.WriteLine("Сводные результаты классификации:");
        Debug.Indent;
        str := "";
        For i := 0 To binary.ClassificationSummary.GetUpperBound(1Do
            For j := 0 To binary.ClassificationSummary.GetUpperBound(2Do
                str := str + binary.ClassificationSummary[i, j].ToString + " ";
            End For;
            Debug.WriteLine(str);
            str := "";
        End For;
        Debug.Unindent;
        // Выводим критерии качества классификации      
        Debug.WriteLine("Критерии качества классификации");
        Debug.Indent;
        Debug.WriteLine(
"Общая точность: " + binary.RelevanceMeasure.Accuracy.ToString);
        Debug.WriteLine(
"Ф - оценка: " + binary.RelevanceMeasure.F1.ToString);
        Debug.WriteLine(
"Точность положительного результата: " + binary.RelevanceMeasure.Precision.ToString);
        Debug.WriteLine(
"Полнота положительного результата: " + binary.RelevanceMeasure.Recall.ToString);
        Debug.Unindent;
        Debug.Unindent;

    End If;
End Sub UserLogisticR;

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, j, res: Integer;
    ROCcurve: IROCcurve;
    FilledDependent, ar, Probabilities, ProbFitted: System.Array;
    OneMinusSpecificity, Sensitivity, CutOffPoints: System.Array;
    str: string;
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();
        // Выводим сводные результаты классификации
        System.Diagnostics.Debug.WriteLine("Сводные результаты классификации:");
        System.Diagnostics.Debug.Indent();
        str := "";
        For i := 0 To binary.ClassificationSummary.GetUpperBound(0Do
            For j := 0 To binary.ClassificationSummary.GetUpperBound(1Do
                str := str + binary.ClassificationSummary.GetValue(i, j).ToString() + " ";
            End For;
            System.Diagnostics.Debug.WriteLine(str);
            str := "";
        End For;
        System.Diagnostics.Debug.Unindent();
        // Выводим критерии качества классификации      
        System.Diagnostics.Debug.WriteLine("Критерии качества классификации");
        System.Diagnostics.Debug.Indent();
        System.Diagnostics.Debug.WriteLine(
"Общая точность: " + binary.RelevanceMeasure.Accuracy.ToString());
        System.Diagnostics.Debug.WriteLine(
"Ф - оценка: " + binary.RelevanceMeasure.F1.ToString());
        System.Diagnostics.Debug.WriteLine(
"Точность положительного результата: " + binary.RelevanceMeasure.Precision.ToString());
        System.Diagnostics.Debug.WriteLine(
"Полнота положительного результата: " + binary.RelevanceMeasure.Recall.ToString());
        System.Diagnostics.Debug.Unindent();
        System.Diagnostics.Debug.Unindent();

    End If;
End Sub;

В результате выполнения примера будет настроена и рассчитана логистическая регрессия, в окно консоли будут выведены результаты расчета и критерии качества классификации.

См. также:

ISmLogisticRegression