Работа с методами интеллектуального анализа данных

Язык Python имеет множество дополнительных модулей, которые позволяют разрабатывать программы различного спектра задач. Рассмотрим работу с методами интеллектуального анализа данных на примере расчёта логистической регрессии в функции на языке Python.

Для языка Python дополнительно потребуется установка библиотеки для машинного обучения Scikit-Learn (https://scikit-learn.org) и библиотеки для работы с многомерными массивами NumPy (http://www.numpy.org/).

Код модуля на языке Python:

import numpy as np

from sklearn.linear_model import LogisticRegression

from sklearn.metrics import confusion_matrix

class CData(object):

def __init__(self, p1, p2, p3, p4):

self.PredictY = p1.tolist()

self.PredictTest = p2.tolist()

self.Intercept = p3

self.ConfMatr = p4.tolist()

def execute_lr(pX, pY, pXt):

X = np.array(pX)

Y = np.array(pY)

Xt = np.array(pXt)

LR=LogisticRegression(solver='liblinear', tol=1e-5)

LR.fit(X, Y)

intercept=LR.intercept_

predictY=LR.predict(X)

predictTest=LR.predict(Xt)

ConfMatrix=confusion_matrix(Y, predictY)

sz = CData(predictY, predictTest, intercept[0], ConfMatrix)

return sz

Функция execute_lr осуществляет расчёт методом логистической регрессии. В качестве входных параметров функции передаются массивы обучающих данных и массив тестовых данных. В качестве результата функция возвращает объект класса CData, который в атрибутах будет содержать результаты классификации на обучающем и тестовом множестве, константу регрессии и матрицу несоответствий.

Для выполнения функции execute_lr в Fore/Fore.NET предполагается наличие модуля Python с наименованием LogisticRegression. Модуль должен располагаться в папке «D:\Work\Python\».

Sub Main;
Var
    PyUtils: IPythonUtils;
    PylistX1, PyListY1, PyListX1test: IPythonList;
    PyClassObj: IPythonClassObject;
    PyObj: IPythonObject;
    Param1, Param2: Array 
Of Variant;
    X, Y, Xt: Array;
    i, j: Integer;
    Intercept: Double;
    RowCount, ColCount, RowCountTest: Integer;
    vrnt: Variant;
    str: String;
Begin
    PyUtils := 
New PythonUtils.Create;
    PyUtils.AddFolderToPythonPath(
"D:\Work\Python\");
    
//Создание множеств
    RowCount := 12;
    RowCountTest := 
6;
    ColCount := 
4;
    X := 
New Variant[RowCount, ColCount];
    Y := 
New Variant[RowCount];
    Xt := 
New Variant[RowCountTest, ColCount];
    
//Обучающее множество
    X[0, 0] := 5.1; X[0, 1] := 3.5;     X[0, 2]:= 1.4;      X[0, 3]:= 0.2;      Y[0]:= 0;
    X[
1, 0] := 4.9; X[1, 1] := 3.0;     X[1, 2]:= 1.4;      X[1, 3]:= 0.2;      Y[1]:= 0;
    X[
2, 0] := 4.7; X[2, 1] := 3.2;     X[2, 2]:= 1.3;      X[2, 3]:= 0.2;      Y[2]:= 0;
    X[
3, 0] := 4.6; X[3, 1] := 3.1;     X[3, 2]:= 1.5;      X[3, 3]:= 0.2;      Y[3]:= 0;
    X[
4, 0] := 7.0; X[4, 1] := 3.2;     X[4, 2]:= 4.7;      X[4, 3]:= 1.4;      Y[4]:= 1;
    X[
5, 0] := 6.4; X[5, 1] := 3.2;     X[5, 2]:= 4.5;      X[5, 3]:= 1.5;      Y[5]:= 1;
    X[
6, 0] := 6.9; X[6, 1] := 3.1;     X[6, 2]:= 4.9;      X[6, 3]:= 1.5;      Y[6]:= 1;
    X[
7, 0] := 5.5; X[7, 1] := 2.3;     X[7, 2]:= 4.0;      X[7, 3]:= 1.3;      Y[7]:= 1;
    X[
8, 0] := 6.3; X[8, 1] := 3.3;     X[8, 2]:= 6.0;      X[8, 3]:= 2.5;      Y[8]:= 2;
    X[
9, 0] := 5.8; X[9, 1] := 2.7;     X[9, 2]:= 5.1;      X[9, 3]:= 1.9;      Y[9]:= 2;
    X[
10, 0] := 7.1; X[10, 1] := 3.0;   X[10, 2]:= 5.9;     X[10, 3]:= 2.1;     Y[10]:= 2;
    X[
11, 0] := 6.3; X[11, 1] := 2.9;   X[11, 2]:= 5.6;     X[11, 3]:= 1.8;     Y[11]:= 2;
    
//Тестовое множество    
    Xt[0, 0] := 5.0; Xt[0, 1] := 3.6;   Xt[0, 2]:= 1.4;     Xt[0, 3]:= 0.2;
    Xt[
1, 0] := 5.4; Xt[1, 1] := 3.9;   Xt[1, 2]:= 1.7;     Xt[1, 3]:= 0.4;
    Xt[
2, 0] := 6.5; Xt[2, 1] := 2.8;   Xt[2, 2]:= 4.6;     Xt[2, 3]:= 1.5;
    Xt[
3, 0] := 5.7; Xt[3, 1] := 2.8;   Xt[3, 2]:= 4.5;     Xt[3, 3]:= 1.3;
    Xt[
4, 0] := 6.5; Xt[4, 1] := 3.0;   Xt[4, 2]:= 5.8;     Xt[4, 3]:= 2.2;
    Xt[
5, 0] := 7.6; Xt[5, 1] := 3.0;   Xt[5, 2]:= 6.6;     Xt[5, 3]:= 2.1;
    
//Создание списков Python
    PylistX1 := New PythonList.Create(X);
    PylistY1 := 
New PythonList.Create(Y);
    PyListX1test := 
New PythonList.Create(Xt);
    
//Выполнение функции Python и получение результатов
    vrnt := PyUtils.Invoke("LogisticRegression", "execute_lr", PyListX1, PyListY1, PyListX1test);
    PyClassObj := vrnt 
As IPythonClassObject;
    
//Извлекаем константу регрессии
    vrnt := PyClassObj.GetAttr("Intercept");
    Intercept := vrnt 
As Double;
    Debug.WriteLine(
"Константа регрессии: " + Intercept.ToString);
    
//Извлекаем результат классификации на обучающем множестве
    vrnt := PyClassObj.GetAttr("PredictY");
    PyObj := vrnt 
As IPythonObject;
    Param1 := (vrnt 
As IPythonList).ToArray;
    Debug.WriteLine(
"Классификация на обучающем множестве:");
    
For i := 0 To Param1.Length - 1 Do
        Debug.Write(i.ToString + 
": " + Param1[i] + "; ");
    
End For;
    Debug.WriteLine(
"");
    
//Извлекаем результат классификации на тестовом множестве
    vrnt := PyClassObj.GetAttr("PredictTest");
    PyObj := vrnt 
As IPythonObject;
    Param1 := (vrnt 
As IPythonList).ToArray;
    Debug.WriteLine(
"Классификация на тестовом множестве:");
    
For i := 0 To Param1.Length - 1 Do
        Debug.Write(i.ToString + 
": " + Param1[i] + "; ");
    
End For;
    Debug.WriteLine(
"");
    
//Извлекаем матрицу
    Debug.WriteLine("Матрица несоответствий:");
    vrnt := PyClassObj.GetAttr(
"ConfMatr");
    Param2 := (vrnt 
As IPythonList).ToArray;
    
For i := 0 To Param2.Length - 1 Do
        Param1 := (Param2[i] 
As IPythonList).ToArray;
        str := 
"";
        
For j := 0 To Param1.Length - 1 Do
            str := str + (Param1[j] 
As Double).ToString + ' ';
        
End For;
        Debug.WriteLine(str);
    
End For;
End Sub Main;

Imports Prognoz.Platform.Interop.Python;

Public Shared Sub Main(Params: StartParams);
Var
    PyUtils: IPythonUtils = 
New PythonUtilsClass();
    PylistX1, PyListY1, PyListX1test: IPythonList = 
New PythonListClass();
    PyClassObj: IPythonClassObject;
    PyObj: IPythonObject;
    Param1, Param2: Array;
    X, Y, Xt: Array;
    i, j: Integer;
    Intercept: Double;
    RowCount, ColCount, RowCountTest: Integer;
    vrnt: Object;
    str: String;
Begin
    PyUtils.AddFolderToPythonPath(
"D:\Work\Python\");
    
//Создание множеств
    RowCount := 12;
    RowCountTest := 
6;
    ColCount := 
4;
    X := 
New Object[ColCount, RowCount];
    Y := 
New Object[RowCount];
    Xt := 
New Object[ColCount, RowCountTest];
    
//Обучающее множество
    X[0, 0] := 5.1; X[1, 0] := 3.5;     X[2, 0]:= 1.4;      X[3, 0]:= 0.2;      Y[0]:= 0;
    X[
0, 1] := 4.9; X[1, 1] := 3.0;     X[2, 1]:= 1.4;      X[3, 1]:= 0.2;      Y[1]:= 0;
    X[
0, 2] := 4.7; X[1, 2] := 3.2;     X[2, 2]:= 1.3;      X[3, 2]:= 0.2;      Y[2]:= 0;
    X[
0, 3] := 4.6; X[1, 3] := 3.1;     X[2, 3]:= 1.5;      X[3, 3]:= 0.2;      Y[3]:= 0;
    X[
0, 4] := 7.0; X[1, 4] := 3.2;     X[2, 4]:= 4.7;      X[3, 4]:= 1.4;      Y[4]:= 1;
    X[
0, 5] := 6.4; X[1, 5] := 3.2;     X[2, 5]:= 4.5;      X[3, 5]:= 1.5;      Y[5]:= 1;
    X[
0, 6] := 6.9; X[1, 6] := 3.1;     X[2, 6]:= 4.9;      X[3, 6]:= 1.5;      Y[6]:= 1;
    X[
0, 7] := 5.5; X[1, 7] := 2.3;     X[2, 7]:= 4.0;      X[3, 7]:= 1.3;      Y[7]:= 1;
    X[
0, 8] := 6.3; X[1, 8] := 3.3;     X[2, 8]:= 6.0;      X[3, 8]:= 2.5;      Y[8]:= 2;
    X[
0, 9] := 5.8; X[1, 9] := 2.7;     X[2, 9]:= 5.1;      X[3, 9]:= 1.9;      Y[9]:= 2;
    X[
0, 10] := 7.1; X[1, 10] := 3.0;   X[2, 10]:= 5.9;     X[3, 10]:= 2.1;     Y[10]:= 2;
    X[
0, 11] := 6.3; X[1, 11] := 2.9;   X[2, 11]:= 5.6;     X[3, 11]:= 1.8;     Y[11]:= 2;
    
//Тестовое множество    
    Xt[0, 0] := 5.0; Xt[1, 0] := 3.6;   Xt[2, 0]:= 1.4;     Xt[3, 0]:= 0.2;
    Xt[
0, 1] := 5.4; Xt[1, 1] := 3.9;   Xt[2, 1]:= 1.7;     Xt[3, 1]:= 0.4;
    Xt[
0, 2] := 6.5; Xt[1, 2] := 2.8;   Xt[2, 2]:= 4.6;     Xt[3, 2]:= 1.5;
    Xt[
0, 3] := 5.7; Xt[1, 3] := 2.8;   Xt[2, 3]:= 4.5;     Xt[3, 3]:= 1.3;
    Xt[
0, 4] := 6.5; Xt[1, 4] := 3.0;   Xt[2, 4]:= 5.8;     Xt[3, 4]:= 2.2;
    Xt[
0, 5] := 7.6; Xt[1, 5] := 3.0;   Xt[2, 5]:= 6.6;     Xt[3, 5]:= 2.1;
    
//Создание списков Python
    PylistX1.Create(X);
    PylistY1.Create(Y);
    PyListX1test.Create(Xt);
    
//Выполнение функции Python и получение результатов
    vrnt := PyUtils.Invoke("LogisticRegression", "execute_lr", PyListX1, PyListY1, PyListX1test);
    PyClassObj := vrnt 
As IPythonClassObject;
    
//Извлекаем константу регрессии
    vrnt := PyClassObj.GetAttr("Intercept");
    Intercept := vrnt 
As Double;
    System.Diagnostics.Debug.WriteLine(
"Константа регрессии:" + Intercept.ToString());
    
//Извлекаем результат классификации на обучающем множестве
    vrnt := PyClassObj.GetAttr("PredictY");
    PyObj := vrnt 
As IPythonObject;
    Param1 := (vrnt 
As IPythonList).ToArray();
    System.Diagnostics.Debug.WriteLine(
"Классификация на обучающем множестве:");
    
For i := 0 To Param1.Length - 1 Do
        System.Diagnostics.Debug.Write(i.ToString() + 
": " + Param1[i] + "; ");
    
End For;
    System.Diagnostics.Debug.WriteLine(
"");
    
//Извлекаем результат классификации на тестовом множестве
    vrnt := PyClassObj.GetAttr("PredictTest");
    PyObj := vrnt 
As IPythonObject;
    Param1 := (vrnt 
As IPythonList).ToArray();
    System.Diagnostics.Debug.WriteLine(
"Классификация на тестовом множестве:");
    
For i := 0 To Param1.Length - 1 Do
        System.Diagnostics.Debug.Write(i.ToString() + 
": " + Param1[i] + "; ");
    
End For;
    System.Diagnostics.Debug.WriteLine(
"");
    
//Извлекаем матрицу
    System.Diagnostics.Debug.WriteLine("Матрица несоответствий:");
    vrnt := PyClassObj.GetAttr(
"ConfMatr");
    Param2 := (vrnt 
As IPythonList).ToArray();
    
For i := 0 To Param2.Length - 1 Do
        Param1 := (Param2[i] 
As IPythonList).ToArray();
        str := 
"";
        
For j := 0 To Param1.Length - 1 Do
            str := str + Param1[j].ToString() + 
' ';
        
End For;
        System.Diagnostics.Debug.WriteLine(str);
    
End For;
End Sub;

При выполнении примера будет выполнена функция execute_lr, написанная на языке Python. В функцию будут переданы исходные данные и получен результат работы. В результате приходит объект класса CData, из атрибутов объекта будут считаны и выведены в консоль среды разработки полученные данные.

См. также:

Примеры