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

Язык 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[00] := 5.1; X[01] := 3.5;     X[02]:= 1.4;      X[03]:= 0.2;      Y[0]:= 0;
    X[
10] := 4.9; X[11] := 3.0;     X[12]:= 1.4;      X[13]:= 0.2;      Y[1]:= 0;
    X[
20] := 4.7; X[21] := 3.2;     X[22]:= 1.3;      X[23]:= 0.2;      Y[2]:= 0;
    X[
30] := 4.6; X[31] := 3.1;     X[32]:= 1.5;      X[33]:= 0.2;      Y[3]:= 0;
    X[
40] := 7.0; X[41] := 3.2;     X[42]:= 4.7;      X[43]:= 1.4;      Y[4]:= 1;
    X[
50] := 6.4; X[51] := 3.2;     X[52]:= 4.5;      X[53]:= 1.5;      Y[5]:= 1;
    X[
60] := 6.9; X[61] := 3.1;     X[62]:= 4.9;      X[63]:= 1.5;      Y[6]:= 1;
    X[
70] := 5.5; X[71] := 2.3;     X[72]:= 4.0;      X[73]:= 1.3;      Y[7]:= 1;
    X[
80] := 6.3; X[81] := 3.3;     X[82]:= 6.0;      X[83]:= 2.5;      Y[8]:= 2;
    X[
90] := 5.8; X[91] := 2.7;     X[92]:= 5.1;      X[93]:= 1.9;      Y[9]:= 2;
    X[
100] := 7.1; X[101] := 3.0;   X[102]:= 5.9;     X[103]:= 2.1;     Y[10]:= 2;
    X[
110] := 6.3; X[111] := 2.9;   X[112]:= 5.6;     X[113]:= 1.8;     Y[11]:= 2;
    
//Тестовое множество    
    Xt[00] := 5.0; Xt[01] := 3.6;   Xt[02]:= 1.4;     Xt[03]:= 0.2;
    Xt[
10] := 5.4; Xt[11] := 3.9;   Xt[12]:= 1.7;     Xt[13]:= 0.4;
    Xt[
20] := 6.5; Xt[21] := 2.8;   Xt[22]:= 4.6;     Xt[23]:= 1.5;
    Xt[
30] := 5.7; Xt[31] := 2.8;   Xt[32]:= 4.5;     Xt[33]:= 1.3;
    Xt[
40] := 6.5; Xt[41] := 3.0;   Xt[42]:= 5.8;     Xt[43]:= 2.2;
    Xt[
50] := 7.6; Xt[51] := 3.0;   Xt[52]:= 6.6;     Xt[53]:= 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[00] := 5.1; X[10] := 3.5;     X[20]:= 1.4;      X[30]:= 0.2;      Y[0]:= 0;
    X[
01] := 4.9; X[11] := 3.0;     X[21]:= 1.4;      X[31]:= 0.2;      Y[1]:= 0;
    X[
02] := 4.7; X[12] := 3.2;     X[22]:= 1.3;      X[32]:= 0.2;      Y[2]:= 0;
    X[
03] := 4.6; X[13] := 3.1;     X[23]:= 1.5;      X[33]:= 0.2;      Y[3]:= 0;
    X[
04] := 7.0; X[14] := 3.2;     X[24]:= 4.7;      X[34]:= 1.4;      Y[4]:= 1;
    X[
05] := 6.4; X[15] := 3.2;     X[25]:= 4.5;      X[35]:= 1.5;      Y[5]:= 1;
    X[
06] := 6.9; X[16] := 3.1;     X[26]:= 4.9;      X[36]:= 1.5;      Y[6]:= 1;
    X[
07] := 5.5; X[17] := 2.3;     X[27]:= 4.0;      X[37]:= 1.3;      Y[7]:= 1;
    X[
08] := 6.3; X[18] := 3.3;     X[28]:= 6.0;      X[38]:= 2.5;      Y[8]:= 2;
    X[
09] := 5.8; X[19] := 2.7;     X[29]:= 5.1;      X[39]:= 1.9;      Y[9]:= 2;
    X[
010] := 7.1; X[110] := 3.0;   X[210]:= 5.9;     X[310]:= 2.1;     Y[10]:= 2;
    X[
011] := 6.3; X[111] := 2.9;   X[211]:= 5.6;     X[311]:= 1.8;     Y[11]:= 2;
    
//Тестовое множество    
    Xt[00] := 5.0; Xt[10] := 3.6;   Xt[20]:= 1.4;     Xt[30]:= 0.2;
    Xt[
01] := 5.4; Xt[11] := 3.9;   Xt[21]:= 1.7;     Xt[31]:= 0.4;
    Xt[
02] := 6.5; Xt[12] := 2.8;   Xt[22]:= 4.6;     Xt[32]:= 1.5;
    Xt[
03] := 5.7; Xt[13] := 2.8;   Xt[23]:= 4.5;     Xt[33]:= 1.3;
    Xt[
04] := 6.5; Xt[14] := 3.0;   Xt[24]:= 5.8;     Xt[34]:= 2.2;
    Xt[
05] := 7.6; Xt[15] := 3.0;   Xt[25]:= 6.6;     Xt[35]:= 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, из атрибутов объекта будут считаны и выведены в консоль среды разработки полученные данные.

См. также:

Примеры