Re: Santander Value Prediction Challenge
![Сообщение Сообщение](./styles/prosilver/imageset/icon_post_target.gif)
Послал тебе на почту правильные и неправильные матрицы моделей и как они выглядят в системе Эйдос. Ниже мои функции работы с этими текстовыми матрицами. Эти функции обеспечивают работу с текстовыми матрицами любой размерности практически как dbf-файлами по номерам записей и полей. Для расчета позиций полей используются файлы структуры, которые я приводил на форуме и привожу здесь. Они разные для Abs.txt, Prc#.txt и Inf#.txt. Кроем того они зависят также от максимальной длины наименования описательной шкалы с градацией в Attributes.dbf. Наверное надо смотреть как применяются эти функции в системе Эйдос в исходном тексте: http://lc.kubagro.ru/__AIDOS-X.txt, Чтобы проверить получилось или нет достаточно посмотреть модели в режиме 5.5.
Для проверки я установил лаб.работу 3.03 в режиме 1.3. Потом выполнил режим 3.5, который выполняет синтез и верификацию моделей. Потом сохранил txt-матрицы моделей в отдельную папку. Посмотрел их в режиме 5.5. Потом выполнил твой модуль синтеза моделей. И сразу посмотрел их в режиме 5.5. Сохранил их в другую папку и послал все тебе и сами txt-матрицы моделей, и скришоты.
Но я думаю сейчас это не срочно. Сейчас надо сделать нормировку результатов распознавания обучающей выборки, выбор модели и инт.критерия с минимальным критерием Каггла и нормировку результатов распознавания тестовой выборки в наилучшей модели с теми же параметрами, чтобы послать в Каггл.
Для проверки я установил лаб.работу 3.03 в режиме 1.3. Потом выполнил режим 3.5, который выполняет синтез и верификацию моделей. Потом сохранил txt-матрицы моделей в отдельную папку. Посмотрел их в режиме 5.5. Потом выполнил твой модуль синтеза моделей. И сразу посмотрел их в режиме 5.5. Сохранил их в другую папку и послал все тебе и сами txt-матрицы моделей, и скришоты.
Но я думаю сейчас это не срочно. Сейчас надо сделать нормировку результатов распознавания обучающей выборки, выбор модели и инт.критерия с минимальным критерием Каггла и нормировку результатов распознавания тестовой выборки в наилучшей модели с теми же параметрами, чтобы послать в Каггл.
- Код: Выделить всё
* ###########################################################################
// Определить максимальную длину наименования: ОПИСАТЕЛЬНАЯ ШКАЛА-градация
mLenNameMax = 33
FOR i=1 TO N_Gos
SELECT Gr_OpSc;DBGOTO(i)
M_NameGrOS = ALLTRIM(Name_GrOS)
M_KodOpSc = Kod_OpSc
SELECT Opis_Sc;DBGOTO(M_KodOpSc)
M_NameOS = UPPER(ALLTRIM(Name_OpSc))
// Если в названии градации уже включено наим.шкалы, то повторно не включать его
IF AT(M_NameOS, UPPER(M_NameGrOS)) = 0
M_Name = M_NameOS+"-"+M_NameGrOS
ELSE
M_Name = M_NameGrOS
ENDIF
mLenNameMax = MAX(mLenNameMax, LEN(M_Name))
NEXT
********** Структура создаваемой базы ***********
aInfStruct := { { "Kod_pr", "N", 15, 0},; // 1
{ "Name" , "C",mLenNameMax, 0} } // 2
FOR j=1 TO N_Cls
FieldName = "N"+ALLTRIM(STR(j,15))
AADD(aInfStruct, { FieldName, "N", 19, 1 })
NEXT
AADD(aInfStruct, { "Summa", "N", 19, 1 })
AADD(aInfStruct, { "Sredn", "N", 19, 7 })
AADD(aInfStruct, { "Disp" , "N", 19, 7 })
DC_ASave(aInfStruct, "_AbsStruct.arx") // Когда БД создается - записывать структуру, когда открывается - считывать
*aInfStruct = DC_ARestore("_AbsStruct.arx")
*************************************************
DB_name = "Abs.txt"
nHandle := FCreate( DB_name, FC_NORMAL ) // Создание БД (если она была, то все равно создается пустая)
IF nHandle = -1
MsgBox(L("Файл: "+DB_name+" не может быть создан. Ошибка: ")+FERROR())
RETURN NIL
ENDIF
***** Формирование пустой записи
N_Col = N_Cls+5 // Число полей
CrLf = CHR(13)+CHR(10) // Конец строки (записи)
Lc_buf = ""
FOR j=1 TO N_Col
* S = IF(j=2*INT(j/2),"#","X") // Для отладки
S = " " // Для работы
Lc_buf = Lc_buf + REPLICATE(S, aInfStruct[j,3])
NEXT
Lc_buf = Lc_buf + CrLf
Len_LcBuf = LEN(Lc_buf)
LC_DbCreate( DB_name, nHandle, Lc_buf, N_Gos+4 ) // Создание БД.txt, содержащей N_Rec пустых записей ############
*nHandle := FOpen( DB_name, FO_READWRITE ) // Открытие базы данных ############################################
**** Рассчет массива начальных позиций полей в строке
PRIVATE aPos[N_Col]
aPos[1] = 1
FOR j=2 TO N_Col
aPos[j] = aPos[j-1] + aInfStruct[j-1,3]
NEXT
* ###########################################################################
- Код: Выделить всё
* ###########################################################################
// Определить максимальную длину наименования: ОПИСАТЕЛЬНАЯ ШКАЛА-градация
mLenNameMax = 33
FOR i=1 TO N_Gos
SELECT Gr_OpSc;DBGOTO(i)
M_NameGrOS = ALLTRIM(Name_GrOS)
M_KodOpSc = Kod_OpSc
SELECT Opis_Sc;DBGOTO(M_KodOpSc)
M_NameOS = UPPER(ALLTRIM(Name_OpSc))
// Если в названии градации уже включено наим.шкалы, то повторно не включать его
IF AT(M_NameOS, UPPER(M_NameGrOS)) = 0
M_Name = M_NameOS+"-"+M_NameGrOS
ELSE
M_Name = M_NameGrOS
ENDIF
mLenNameMax = MAX(mLenNameMax, LEN(M_Name))
NEXT
********** Структура создаваемой базы ***********
aInfStruct := { { "Kod_pr", "N", 15, 0},; // 1
{ "Name" , "C",mLenNameMax, 0} } // 2
FOR j=1 TO N_Cls
FieldName = "N"+ALLTRIM(STR(j,15))
AADD(aInfStruct, { FieldName, "N", 19, 7 })
NEXT
AADD(aInfStruct, { "Summa", "N", 19, 7 })
AADD(aInfStruct, { "Sredn", "N", 19, 7 })
AADD(aInfStruct, { "Disp" , "N", 19, 7 })
DC_ASave(aInfStruct, "_InfStruct.arx") // Когда БД создается - записывать структуру, когда открывается - считывать
*aInfStruct = DC_ARestore("_InfStruct.arx")
*************************************************
***** Формирование пустой записи
N_Col = N_Cls+5 // Число полей
CrLf = CHR(13)+CHR(10) // Конец строки (записи)
Lc_buf = ""
FOR j=1 TO N_Col
* S = IF(j=2*INT(j/2),"#","X") // Для отладки
S = " " // Для работы
Lc_buf = Lc_buf + REPLICATE(S, aInfStruct[j,3])
NEXT
Lc_buf = Lc_buf + CrLf
Len_LcBuf = LEN(Lc_buf)
****** Создаем стат.базы и базы знаний (7 по частным критериям знаний)
Ar_Model := {"Abs","Prc1","Prc2","Inf1","Inf2","Inf3","Inf4","Inf5","Inf6","Inf7" }
PRIVATE nHandle[LEN(Ar_Model)]
FOR z=4 TO LEN(Ar_Model)
IF aCalcInf[z] // Создавать только заданные БД, т.к. они могут быть очень большого размера
DB_name = Ar_Model[z]+".txt"
nHandle[z] := FCreate( DB_name, FC_NORMAL ) // Создание БД (если она была, то все равно создается пустая)
IF nHandle[z] = -1
MsgBox("Файл: "+DB_name+" не может быть создан. Ошибка:"+FERROR())
RETURN NIL
ENDIF
LC_DbCreate( DB_name, nHandle[z], Lc_buf, N_Gos+3 ) // Создание БД.txt, содержащей N_Rec пустых записей ############
ENDIF
NEXT
*nHandle := FOpen( DB_name, FO_READWRITE ) // Открытие базы данных ########################################
**** Рассчет массива начальных позиций полей в строке
PRIVATE aPos[N_Col]
aPos[1] = 1
FOR j=2 TO N_Col
aPos[j] = aPos[j-1] + aInfStruct[j-1,3]
NEXT
* ###########################################################################
- Код: Выделить всё
* ###########################################################################
// Определить максимальную длину наименования: ОПИСАТЕЛЬНАЯ ШКАЛА-градация
mLenNameMax = 33
FOR i=1 TO N_Gos
SELECT Gr_OpSc;DBGOTO(i)
M_NameGrOS = ALLTRIM(Name_GrOS)
M_KodOpSc = Kod_OpSc
SELECT Opis_Sc;DBGOTO(M_KodOpSc)
M_NameOS = UPPER(ALLTRIM(Name_OpSc))
// Если в названии градации уже включено наим.шкалы, то повторно не включать его
IF AT(M_NameOS, UPPER(M_NameGrOS)) = 0
M_Name = M_NameOS+"-"+M_NameGrOS
ELSE
M_Name = M_NameGrOS
ENDIF
mLenNameMax = MAX(mLenNameMax, LEN(M_Name))
NEXT
********** Структура создаваемой базы ***********
aInfStruct := { { "Kod_pr", "N", 15, 0},; // 1
{ "Name" , "C",mLenNameMax, 0} } // 2
FOR j=1 TO N_Cls
FieldName = "N"+ALLTRIM(STR(j,15))
AADD(aInfStruct, { FieldName, "N", 19, 7 })
NEXT
AADD(aInfStruct, { "UnProb", "N", 19, 7 }) // Безусловная вероятность
AADD(aInfStruct, { "Sredn" , "N", 19, 7 })
AADD(aInfStruct, { "Disp" , "N", 19, 7 })
DC_ASave(aInfStruct, "_PrcStruct.arx") // Когда БД создается - записывать структуру, когда открывается - считывать
*aInfStruct = DC_ARestore("_PrcStruct.arx")
*************************************************
***** Формирование пустой записи
N_Col = N_Cls+5 // Число полей
CrLf = CHR(13)+CHR(10) // Конец строки (записи)
Lc_buf = ""
FOR j=1 TO N_Col
* S = IF(j=2*INT(j/2),"#","X") // Для отладки
S = " " // Для работы
Lc_buf = Lc_buf + REPLICATE(S, aInfStruct[j,3])
NEXT
Lc_buf = Lc_buf + CrLf
Len_LcBuf = LEN(Lc_buf)
******** Создать БД *********************
DB_name1 = "Prc1.txt"
nHandle1 := FCreate( DB_name1, FC_NORMAL ) // Создание БД (если она была, то все равно создается пустая)
IF nHandle1 = -1
MsgBox(L("Файл: "+DB_name1+" не может быть создан. Ошибка:")+FERROR())
RETURN NIL
ENDIF
LC_DbCreate( DB_name1, nHandle1, Lc_buf, N_Gos+3 ) // Создание БД.txt, содержащей N_Rec пустых записей ############
DB_name2 = "Prc2.txt"
nHandle2 := FCreate( DB_name2, FC_NORMAL ) // Создание БД (если она была, то все равно создается пустая)
IF nHandle2 = -1
MsgBox("Файл: "+DB_name2+" не может быть создан. Ошибка:"+FERROR())
RETURN NIL
ENDIF
LC_DbCreate( DB_name2, nHandle2, Lc_buf, N_Gos+3 ) // Создание БД.txt, содержащей N_Rec пустых записей ############
*nHandle := FOpen( DB_name, FO_READWRITE ) // Открытие базы данных ############################################
**** Рассчет массива начальных позиций полей в строке
PRIVATE aPos[N_Col]
aPos[1] = 1
FOR j=2 TO N_Col
aPos[j] = aPos[j-1] + aInfStruct[j-1,3]
NEXT
* ###########################################################################
- Код: Выделить всё
**** Рассчет массива начальных позиций полей в строке
PRIVATE aPos[N_Col]
aPos[1] = 1
FOR j=2 TO N_Col
aPos[j] = aPos[j-1] + aInfStruct[j-1,3]
NEXT
********************************************
******** Запись поля в Max_БД
********************************************
FUNCTION LC_FieldPut( DB_name, nHandle, mRec, mCol, String )
Pos = (mRec-1) * Len_LcBuf + aPos[mCol] - 1
FSEEK(nHandle, Pos, FS_SET) // Позиционирование начала поля
Len_str = LEN(String)
N_Write = FWrite( nHandle, String, Len_str )
IF N_Write < Len_str
aMess := {}
AADD(aMess, L('Ошибка записи поля: [строка=@, колонка=$] БД: "#".'))
AADD(aMess, L(' '))
AADD(aMess, L('Это неустранимая ошибка, возникающая при попытке открытия уже открытой базы данных модели: '+DB_Name+'.'))
AADD(aMess, L('Скорее всего она возникла из-за того, что перед запуском нового режима не был закрыт предыдущий.'))
AADD(aMess, L('Работа системы будет прервана. Если после этого сразу запустить режим, в котором возникла ошибка,'))
AADD(aMess, L('то скорее всего он будет выполнен нормально.'))
aMess[1] = STRTRAN(aMess[1], "#", DB_Name)
aMess[1] = STRTRAN(aMess[1], "@", ALLTRIM(STR(mRec)))
aMess[1] = STRTRAN(aMess[1], "$", ALLTRIM(STR(mCol)))
LB_Warning(aMess)
* MsgBox(aMess)
QUIT
RETURN(.T.)
ENDIF
RETURN(.F.)
********************************************
******** Считывание поля из Max_БД
********************************************
FUNCTION LC_FieldGet( DB_name, nHandle, mRec, mCol )
*MsgBox('Строка='+ALLTRIM(STR(mRec))+', Колонка='+ALLTRIM(STR(mCol)))
Len_str = aInfStruct[mCol,3]
Pos = (mRec-1) * Len_LcBuf + aPos[mCol] - 1
FSEEK(nHandle, Pos, FS_SET) // Позиционирование начала поля
String = SPACE(Len_str)
N_Read = FRead( nHandle, @String, Len_str )
IF N_Read < Len_str
aMess := {}
AADD(aMess, L('Ошибка считывания поля: [строка=@, колонка=$] БД: "#".'))
AADD(aMess, L(' '))
AADD(aMess, L('Это неустранимая ошибка, возникающая при попытке открытия уже открытой базы данных модели: '+DB_Name+'.'))
AADD(aMess, L('Скорее всего она возникла из-за того, что перед запуском нового режима не был закрыт предыдущий.'))
AADD(aMess, L('Работа системы будет прервана. Если после этого сразу запустить режим, в котором возникла ошибка,'))
AADD(aMess, L('то скорее всего он будет выполнен нормально.'))
aMess[1] = STRTRAN(aMess[1], "#", DB_Name)
aMess[1] = STRTRAN(aMess[1], "@", ALLTRIM(STR(mRec)))
aMess[1] = STRTRAN(aMess[1], "$", ALLTRIM(STR(mCol)))
LB_Warning(aMess)
* MsgBox(aMess)
QUIT
RETURN("")
ENDIF
// Пробел в числовом поле рассматривается как "0"
IF aInfStruct[mCol,2] = "N" .AND. LEN(ALLTRIM(String)) = 0
String = "0"
ENDIF
RETURN(String)