- Код: Выделить всё
************************************************************************************************************************************
******** 4.1.9. Подготовка результатов распознавания в форме CSV-файлов в стандарте http://kaggle.com.
******** Данный режим предполагает, что: 1) в модели 2 класса; 2) результаты распознавания во всех моделях уже получены в режиме 3.5
************************************************************************************************************************************
FUNCTION F4_1_9()
Running(.T.)
**********************************************************************
******* Провести проверки на:
******* - наличие приложения;
******* - 2 класса в модели;
****** - наличие результатов распознавания во всех моделях;
****** - числовой результат распознавания;
******* с выдачей соответствующих сообщение.
******* Если все нормально - переход на выполнение.
******* Спросить сколько знаков после запятой включать.
******* Сообщить о том, что возможно нужно поменять название 1-го поля
**********************************************************************
***********************************************
******* Провести проверки на наличие приложения
***********************************************
PUBLIC M_PathAppl := "", M_NameAppl := "", mFlagErr := .F., mFlagAppl :=.F.
IF .NOT. FILE("Appls.dbf")
mFlagErr = .T. // Выдать сообщение об ошибке и вернуться в главное меню
aMess := {}
AADD(aMess, L('Отсутствует текущее приложение !'))
AADD(aMess, L('Надо создать его в режиме 2.3.2.2,'))
AADD(aMess, L('1.3, 2.3.2.1 или в другом!'))
LB_Warning(aMess, L('(C) System "Aidos-X++"' ))
**************************************************************
***** БД, открытые перед запуском главного меню
***** Восстанавливать их после выхода из функций главного меню
**************************************************************
CLOSE ALL
DIRCHANGE(Disk_dir) // Перейти в папку с исполнимым модулем системы
USE PathGrAp EXCLUSIVE NEW
USE Appls EXCLUSIVE NEW
USE Users EXCLUSIVE NEW
Running(.F.)
RETURN NIL
ELSE
CLOSE ALL
USE Appls EXCLUSIVE NEW
SELECT Appls
DBGOTOP()
DO WHILE .NOT. EOF()
IF LEN(ALLTRIM(By_default)) > 0
REPLACE By_default WITH "W"
M_PathAppl = UPPER(ALLTRIM(Path_Appl)) // Путь на текущее приложение
M_NameAppl = ALLTRIM(Name_Appl)
mFlagAppl =.T. // Текущее приложение существует, его имя: M_NameAppl, путь на него: M_PathAppl
EXIT
ENDIF
DBSKIP(1)
ENDDO
ENDIF
IF mFlagAppl =.F. // Текущего приложения не существует
mFlagErr = .T. // Выдать сообщение об ошибке и вернуться в главное меню
aMess := {}
AADD(aMess, L('Отсутствует текущее приложение !'))
AADD(aMess, L('Надо создать его в режиме 2.3.2.2,'))
AADD(aMess, L('1.3, 2.3.2.1 или в другом!'))
LB_Warning(aMess, L('(C) System "Aidos-X++"' ))
**************************************************************
***** БД, открытые перед запуском главного меню
***** Восстанавливать их после выхода из функций главного меню
**************************************************************
CLOSE ALL
DIRCHANGE(Disk_dir) // Перейти в папку с исполнимым модулем системы
USE PathGrAp EXCLUSIVE NEW
USE Appls EXCLUSIVE NEW
USE Users EXCLUSIVE NEW
Running(.F.)
RETURN NIL
ENDIF
**********************************************
******* Провести проверки на 2 класса в модели
**********************************************
DIRCHANGE(M_PathAppl) // Путь на текущее приложение
CLOSE ALL // <<<===############################################### line 49587
USE Classes EXCLUSIVE NEW;N_Cls = RECCOUNT()
IF N_Cls <> 2
mFlagErr = .T. // Выдать сообщение об ошибке и вернуться в главное меню
aMess := {}
AADD(aMess, L('В приложении:'))
AADD(aMess, L(' '))
AADD(aMess, L('Наименование:')+' '+M_NameAppl)
AADD(aMess, L('Путь:')+' '+M_PathAppl)
AADD(aMess, L(' '))
AADD(aMess, ALLTRIM(STR(N_Cls))+' '+L('классов.'))
AADD(aMess, L('А должно быть 2 (на Каггл бинарное распознавание)'))
LB_Warning(aMess, L('(C) System "Aidos-X++"' ))
**************************************************************
***** БД, открытые перед запуском главного меню
***** Восстанавливать их после выхода из функций главного меню
**************************************************************
CLOSE ALL
DIRCHANGE(Disk_dir) // Перейти в папку с исполнимым модулем системы
USE PathGrAp EXCLUSIVE NEW
USE Appls EXCLUSIVE NEW
USE Users EXCLUSIVE NEW
Running(.F.)
RETURN NIL
ENDIF
******************************************************************************
******* Провести проверки на наличие результатов распознавания во всех моделях
******************************************************************************
Ar_Model := {"Abs","Prc1","Prc2","Inf1","Inf2","Inf3","Inf4","Inf5","Inf6","Inf7" }
aRsp2 := {}
FOR mNumModel = 1 TO LEN(Ar_Model)
mNameRsp2i = 'Rsp2i_'+Ar_Model[mNumModel]
mNameRsp2k = 'Rsp2k_'+Ar_Model[mNumModel] // #####################
mFlagRsp2 = .F.
USE (mNameRsp2i) EXCLUSIVE NEW;mReccount_i = RECCOUNT()
USE (mNameRsp2k) EXCLUSIVE NEW;mReccount_k = RECCOUNT()
IF (.NOT. FILE(mNameRsp2i+'.dbf') .OR. .NOT. FILE(mNameRsp2k+'.dbf') ) .OR. (mReccount_i * mReccount_k) = 0
mFlagErr = .T. // Выдать сообщение об ошибке и вернуться в главное меню
aMess := {}
AADD(aMess, L('В приложении:'))
AADD(aMess, L(' '))
AADD(aMess, L('Наименование:')+' '+M_NameAppl)
AADD(aMess, L('Путь:')+' '+M_PathAppl)
AADD(aMess, L(' '))
AADD(aMess, L('нет результатов распознавания во всех моделях и со всеми инт.критериями.'))
AADD(aMess, L(' '))
AADD(aMess, L('Надо провести распознавание в режиме 3.5.'))
LB_Warning(aMess, L('(C) System "Aidos-X++"' ))
**************************************************************
***** БД, открытые перед запуском главного меню
***** Восстанавливать их после выхода из функций главного меню
**************************************************************
CLOSE ALL
DIRCHANGE(Disk_dir) // Перейти в папку с исполнимым модулем системы
USE PathGrAp EXCLUSIVE NEW
USE Appls EXCLUSIVE NEW
USE Users EXCLUSIVE NEW
Running(.F.)
RETURN NIL
ENDIF
NEXT
****************************************************************************
******* Провести проверки на то, что результат распознавания является числом
****************************************************************************
CLOSE ALL
USE Classes EXCLUSIVE NEW;N_Cls = RECCOUNT()
SELECT Classes
DBGOTOP()
DO WHILE .NOT. EOF()
IF AT('{', Name_cls) * AT('}', Name_cls) = 0
mFlagErr = .T. // Выдать сообщение об ошибке и вернуться в главное меню
aMess := {}
AADD(aMess, L('В приложении:'))
AADD(aMess, L(' '))
AADD(aMess, L('Наименование:')+' '+M_NameAppl)
AADD(aMess, L('Путь:')+' '+M_PathAppl)
AADD(aMess, L(' '))
AADD(aMess, L('классы должны быть интервальными числовыми значениями'))
AADD(aMess, L('(классификационная шкала должна быть числовой!)'))
LB_Warning(aMess, L('(C) System "Aidos-X++"' ))
**************************************************************
***** БД, открытые перед запуском главного меню
***** Восстанавливать их после выхода из функций главного меню
**************************************************************
CLOSE ALL
DIRCHANGE(Disk_dir) // Перейти в папку с исполнимым модулем системы
USE PathGrAp EXCLUSIVE NEW
USE Appls EXCLUSIVE NEW
USE Users EXCLUSIVE NEW
Running(.F.)
RETURN NIL
ENDIF
DBSKIP(1)
ENDDO
******************************************************
******* Спросить сколько знаков после запятой включать
******************************************************
mDeci = 1
@0,0 DCSAY L('Задайте число знаков после запятой: ') GET mDeci PICTURE "##" SAYSIZE 0
DCREAD GUI FIT ADDBUTTONS TITLE L('4.1.9. Подготовка результатов для http://kaggle.com')
mDeci = IF(mDeci<=15,mDeci,15)
oScr := DC_WaitOn(L('4.1.9. Подготовка результатов распознавания в форме CSV-файлов стандарта http://kaggle.com'))
CLOSE ALL
USE Classes EXCLUSIVE NEW;N_Cls = RECCOUNT()
IF N_Cls = 2
SELECT Classes
mNameCls1 = ALLTRIM(Name_cls)
DBSKIP(1)
mNameCls2 = ALLTRIM(Name_cls)
***** Структура создаваемой базы ***********
CLOSE ALL
Ar_Model := {"Abs","Prc1","Prc2","Inf1","Inf2","Inf3","Inf4","Inf5","Inf6","Inf7" }
aRsp2i := {}
aRsp2k := {}
aKaggle_i := {}
aKaggle_k := {}
FOR mNumModel = 1 TO LEN(Ar_Model)
mNameRsp2i = 'Rsp2i_'+Ar_Model[mNumModel]
mNameRsp2k = 'Rsp2k_'+Ar_Model[mNumModel] // #####################
IF FILE(mNameRsp2i+'.dbf') .AND. FILE(mNameRsp2k+'.dbf')
AADD(aRsp2i , mNameRsp2i)
AADD(aRsp2k , mNameRsp2k)
AADD(aKaggle_i, 'Kaggle_'+Ar_Model[mNumModel]+'i')
AADD(aKaggle_k, 'Kaggle_'+Ar_Model[mNumModel]+'k')
ENDIF
NEXT
IF LEN(aRsp2i) * LEN(aRsp2k) > 0
mMaxLen = -999
FOR ik = 1 TO LEN(aRsp2i)
CLOSE ALL
USE (aRsp2i[ik]) EXCLUSIVE NEW
SELECT (aRsp2i[ik])
DBGOTOP()
DO WHILE .NOT. EOF()
mMaxLen = MAX(mMaxLen, LEN(ALLTRIM(Name_obj)))
DBSKIP(1)
ENDDO
NEXT
FOR ik = 1 TO LEN(aRsp2k)
CLOSE ALL
USE (aRsp2k[ik]) EXCLUSIVE NEW
SELECT (aRsp2k[ik])
DBGOTOP()
DO WHILE .NOT. EOF()
mMaxLen = MAX(mMaxLen, LEN(ALLTRIM(Name_obj)))
DBSKIP(1)
ENDDO
NEXT
aStructure := { { "id" , "C",mMaxLen, 0},; // 1 id фрагмента текста из тестовой выборки
{ "ProbN1" , "N", 15, 7},; // 2 Нормированная (итоговая) релевантность объекта с классом 1
{ "ProbN2" , "N", 15, 7},; // 3 Нормированная (итоговая) релевантность объекта с классом 2
{ "Prob1" , "N", 15, 7},; // 4 Релевантность объекта с классом 1 = mKorr1 - mKorr2
{ "Prob2" , "N", 15, 7},; // 5 Релевантность объекта с классом 2 = mKorr2 - mKorr1
{ "UrSx_Cls1", "N", 15, 7},; // 6 Ур.сходства объекта с классом 1, который дает система Эйдос
{ "UrSx_Cls2", "N", 15, 7} } // 7 Ур.сходства объекта с классом 2, который дает система Эйдос
FOR mNumModel = 1 TO LEN(Ar_Model)
mNameRsp2i = 'Rsp2i_'+Ar_Model[mNumModel]
mNameRsp2k = 'Rsp2k_'+Ar_Model[mNumModel] // ################
IF FILE(mNameRsp2i+'.dbf')
DbCreate( 'Kaggle_'+Ar_Model[mNumModel]+'i', aStructure )
ENDIF
IF FILE(mNameRsp2k+'.dbf')
DbCreate( 'Kaggle_'+Ar_Model[mNumModel]+'k', aStructure )
ENDIF
NEXT
FOR ik = 1 TO LEN(aRsp2i)
CLOSE ALL
USE (aRsp2i[ik]) EXCLUSIVE NEW
INDEX ON NAME_OBJ+NAME_CLS TO (aRsp2i[ik])
CLOSE ALL
USE (aRsp2i[ik]) INDEX (aRsp2i[ik]) EXCLUSIVE NEW
USE (aKaggle_i[ik]) EXCLUSIVE NEW
mKorr1Max = -9999 // Max.знач.ур.сходства с классом 1
mKorr1Min = +9999 // Min.знач.ур.сходства с классом 1
mKorr2Max = -9999 // Max.знач.ур.сходства с классом 2
mKorr2Min = +9999 // Min.знач.ур.сходства с классом 2
mClass1Sum = 0
mClass2Sum = 0
SELECT (aRsp2i[ik])
DBGOTOP()
mIdErr = '' // Отсутствующие id
mIdOld = VAL(Name_obj)
DO WHILE .NOT. EOF()
mID = ALLTRIM(Name_obj)
mKorr1 = Sum_inf // ################
DBSKIP(1)
mKorr2 = Sum_inf // ################
mClass1Sum = mClass1Sum + mKorr1
mClass2Sum = mClass2Sum + mKorr2
// mKorr1 уровень сходства с классом: "есть описание суицида"
// mKorr2 уровень сходства с классом: "нет описания суицида"
SELECT (aKaggle_i[ik])
APPEND BLANK
mProb1 = mKorr1 - mKorr2 // Не знаю как лучше. Раньше думал, что в зависмости от суммы, но теперь не знаю. Может быть брать из той колонки, для котрой выше ср.кв.откл.?
mProb2 = mKorr2 - mKorr1
REPLACE id WITH mID
REPLACE prob1 WITH mProb1
REPLACE prob2 WITH mProb2
REPLACE UrSx_Cls1 WITH mKorr1
REPLACE UrSx_Cls2 WITH mKorr2
mKorr1Max = MAX(mKorr1Max, mProb1)
mKorr1Min = MIN(mKorr1Min, mProb1)
mKorr2Max = MAX(mKorr2Max, mProb2)
mKorr2Min = MIN(mKorr2Min, mProb2)
SELECT (aRsp2i[ik])
DBSKIP(1)
ENDDO
****** Сделать нормировку prob к 1-0
SELECT (aKaggle_i[ik])
DBGOTOP()
DO WHILE .NOT. EOF()
REPLACE ProbN1 WITH (Prob1 - mKorr1Min) / (mKorr1Max - mKorr1Min) // Нормированная (итоговая) релевантность объекта с классом 1
REPLACE ProbN2 WITH (Prob2 - mKorr2Min) / (mKorr2Max - mKorr2Min) // Нормированная (итоговая) релевантность объекта с классом 2
DBSKIP(1)
ENDDO
NEXT
FOR ik = 1 TO LEN(aRsp2k)
CLOSE ALL
USE (aRsp2k[ik]) EXCLUSIVE NEW
INDEX ON NAME_OBJ+NAME_CLS TO (aRsp2k[ik])
CLOSE ALL
USE (aRsp2k[ik]) INDEX (aRsp2k[ik]) EXCLUSIVE NEW
USE (aKaggle_k[ik]) EXCLUSIVE NEW
mKorr1Max = -9999 // Max.знач.ур.сходства с классом 1
mKorr1Min = +9999 // Min.знач.ур.сходства с классом 1
mKorr2Max = -9999 // Max.знач.ур.сходства с классом 2
mKorr2Min = +9999 // Min.знач.ур.сходства с классом 2
mClass1Sum = 0
mClass2Sum = 0
SELECT (aRsp2k[ik])
DBGOTOP()
mIdErr = '' // Отсутствующие id
mIdOld = VAL(Name_obj)
DO WHILE .NOT. EOF()
mID = ALLTRIM(Name_obj)
mKorr1 = Korr // ################
DBSKIP(1)
mKorr2 = Korr // ################
mClass1Sum = mClass1Sum + mKorr1
mClass2Sum = mClass2Sum + mKorr2
// mKorr1 уровень сходства с классом: 1
// mKorr2 уровень сходства с классом: 2
SELECT (aKaggle_k[ik])
APPEND BLANK
mProb1 = mKorr1 - mKorr2
mProb2 = mKorr2 - mKorr1
REPLACE id WITH mID
REPLACE prob1 WITH mProb1
REPLACE prob2 WITH mProb2
REPLACE UrSx_Cls1 WITH mKorr1
REPLACE UrSx_Cls2 WITH mKorr2
mKorr1Max = MAX(mKorr1Max, mProb1)
mKorr1Min = MIN(mKorr1Min, mProb1)
mKorr2Max = MAX(mKorr2Max, mProb2)
mKorr2Min = MIN(mKorr2Min, mProb2)
SELECT (aRsp2k[ik])
DBSKIP(1)
ENDDO
SELECT (aKaggle_k[ik])
DBGOTOP()
DO WHILE .NOT. EOF()
REPLACE ProbN1 WITH (Prob1 - mKorr1Min) / (mKorr1Max - mKorr1Min) // Нормированная (итоговая) релевантность объекта с классом 1
REPLACE ProbN2 WITH (Prob2 - mKorr2Min) / (mKorr2Max - mKorr2Min) // Нормированная (итоговая) релевантность объекта с классом 2
DBSKIP(1)
ENDDO
NEXT
ENDIF
ENDIF
mCountF = ADIR("Kaggle_*.DBF") // Кол-во TXT-файлов
IF mCountF > 0
PRIVATE aFileName[mCountF], aFileSize[mCountF] // Имена и размеры файлов
ADIR("Kaggle_*.DBF", aFileName, aFileSize)
FOR ff=1 TO mCountF
mFileName = SUBSTR(aFileName[ff], 1, AT('.',aFileName[ff])-1)
CLOSE ALL
USE (mFileName) EXCLUSIVE NEW
SELECT (mFileName)
********** Открыть процесс печати выходной формы
set device to printer;set printer on;set printer to (mFileName+'_1.csv');set console off // Можно брать в другой файл из ProbN1
??'SK_ID_CURR,TARGET'
DBGOTOP()
DO WHILE .NOT. EOF()
?ALLTRIM(ID)+','+ALLTRIM(STR(ROUND(ProbN1,mDeci))) // Можно брать в другой файл из ProbN1
DBSKIP(1)
ENDDO
********** Закрыть процесс печати выходной формы
Set device to screen;Set printer off;Set printer to;Set console on
********** Открыть процесс печати выходной формы
set device to printer;set printer on;set printer to (mFileName+'_2.csv');set console off // Можно брать в другой файл из ProbN1
??'SK_ID_CURR,TARGET'
DBGOTOP()
DO WHILE .NOT. EOF()
?ALLTRIM(ID)+','+ALLTRIM(STR(ROUND(ProbN2,mDeci))) // Можно брать в другой файл из ProbN1
DBSKIP(1)
ENDDO
********** Закрыть процесс печати выходной формы
Set device to screen;Set printer off;Set printer to;Set console on
NEXT
DC_Impl(oScr)
aMess := {}
AADD(aMess,L('4.1.9. Подготовка результатов распознавания в форме CSV-файлов стандарта http://kaggle.com завершена успешно!'))
AADD(aMess,L(''))
AADD(aMess,L('Результаты распознавания находятся в папке: "'+M_PathAppl+'" в файлах:'))
AADD(aMess,L(''))
AADD(aMess,L('Kaggle_Inf1i_1.csv, Kaggle_Inf2i_1.csv, Kaggle_Inf3i_1.csv, Kaggle_Inf4i_1.csv, Kaggle_Inf5i_1.csv, Kaggle_Inf6i_1.csv, Kaggle_Inf7i_1.csv, Kaggle_Prc1i_1.csv, Kaggle_Prc2i_1.csv'))
AADD(aMess,L('Kaggle_Inf1i_2.csv, Kaggle_Inf2i_2.csv, Kaggle_Inf3i_2.csv, Kaggle_Inf4i_2.csv, Kaggle_Inf5i_2.csv, Kaggle_Inf6i_2.csv, Kaggle_Inf7i_2.csv, Kaggle_Prc1i_2.csv, Kaggle_Prc2i_2.csv'))
AADD(aMess,L(''))
AADD(aMess,L('Kaggle_Inf1k_1.csv, Kaggle_Inf2k_1.csv, Kaggle_Inf3k_1.csv, Kaggle_Inf4k_1.csv, Kaggle_Inf5k_1.csv, Kaggle_Inf6k_1.csv, Kaggle_Inf7k_1.csv, Kaggle_Prc1k_1.csv, Kaggle_Prc2k_1.csv'))
AADD(aMess,L('Kaggle_Inf1k_2.csv, Kaggle_Inf2k_2.csv, Kaggle_Inf3k_2.csv, Kaggle_Inf4k_2.csv, Kaggle_Inf5k_2.csv, Kaggle_Inf6k_2.csv, Kaggle_Inf7k_2.csv, Kaggle_Prc1k_2.csv, Kaggle_Prc2k_2.csv'))
AADD(aMess,L(''))
AADD(aMess,L('Если в модели бинарной классификации получены результаты: {Xi}, обеспечивающие достоверность (A), то при замене (Xi => 1-Xi) для всех i будет получена достоверность (1-A)'))
AADD(aMess,L('Например, если в модели Kaggle_Inf3i_1.csv была получена ROC-достоверность 0.337, то в модели Kaggle_Inf3i_2.csv она будет 0.662.'))
AADD(aMess,L(''))
AADD(aMess,L('PS. Проверьте наименование полей в CSV-файлах. Они могут отличаться в разных задачах.'))
LB_Warning(aMess)
ENDIF
DC_Impl(oScr)
**************************************************************
***** БД, открытые перед запуском главного меню
***** Восстанавливать их после выхода из функций главного меню
**************************************************************
CLOSE ALL
DIRCHANGE(Disk_dir) // Перейти в папку с исполнимым модулем системы
USE PathGrAp EXCLUSIVE NEW
USE Appls EXCLUSIVE NEW
USE Users EXCLUSIVE NEW
Running(.F.)
RETURN NIL