Wed Jun 29, 2022 12:34 pm
Login Register Lost Password? Contact Us

Please Note: The HPCC Systems forums are moving to Stack Overflow. We invite you to post your questions on Stack Overflow utilizing the tag hpcc-ecl (https://stackoverflow.com/search?tab=newest&q=hpcc-ecl). This legacy forum will be active and monitored during our transition to Stack Overflow but will become read only beginning September 1, 2022.



Iterar pelas colunas para rodar várias regressões

Fórum em português para questões gerais e suporte relacionados a ECL/HPCC Systems.

Moderator: hwatanuki

Fri May 21, 2021 6:49 pm Change Time Zone

Eu tenho um dataset com cerca de 30 colunas e gostaria de rodar diversos modelos de regressão logística, com diferentes combinações de colunas, para analisar seus resultados. Por exemplo, suponhamos que eu já tenha 3 variáveis fixas e queira rodar 27 modelos de regressão logística, cada um com as 3 fixas mais uma das restantes (etapa 1). Depois, escolho a melhor e rodo mais 26 modelos, cada um com 4 fixas mais uma das restantes (etapa 2). Existe alguma forma de automatizar esse processo?
A escolha da variável fixa não precisa necessariamente ser automatizada, se apenas cada etapa fosse automatizada, já me ajudaria bastante. Nesse caso seria importante que a matriz de confusão de cada regressão fosse mostrada na forma de um OUTPUT para que eu possa analisar manualmente qual será a próxima variável escolhida.
Agradeço desde já.
AndreFB
 
Posts: 3
Joined: Wed Mar 24, 2021 5:51 pm

Tue May 25, 2021 2:38 am Change Time Zone

Olá AndreFB,

Pensei em usar uma MACRO e recursos de template language (https://learn.lexisnexis.com/Activity/1342) para automatizar pelo menos o processo de geração do código para cada iteração do processo que você descreve.

A MACRO do exemplo abaixo gera amostras de treinamento e teste para regressões logísticas baseadas em diferentes combinações das variáveis independentes e produz como resultado final a matriz de confusão de cada regressão.

Esse exemplo considera que você esta na iteração 4 e, portanto, já estabeleceu as três primeiras variáveis independentes do modelo. Após rodar a iteração 4 e escolher a 4º variável independente do modelo, basta usar o mesmo código para incluir a quarta variável e rodar a iteração 5; e assim sucessivamente... O processo inverso também é valido para rodar iterações com menos variáveis.

HTH,
hwatanuki

Code: Select all
EXPORT MacGenStepWiseIter4 (v1,v2,v3):= MACRO    //update the number of input tokens
                                                 //based on your iteration number.
                                                 //For instance, for iteration no 5,
                                                 //use "(v1,v2,v3,v4)"

// sample dataset
myrec := RECORD
UNSIGNED id;
REAL field1;
REAL field2;
REAL field3;
REAL field4;
REAL field5;
REAL label;
END;

myds := DATASET([{1,5.0,6.0,7.0,8.0,9.0,0},
                 {2,10.0,12.0,14.0,16.0,18.0,0},
                 {3,15.0,18.0,21.0,24.0,27.0,0},
                 {4,20.0,18.0,21.0,24.0,27.0,1},
                 {5,25.0,30.0,21.0,24.0,27.0,1},
                 {6,30.0,36.0,42.0,24.0,27.0,1},
                 {7,35.0,42.0,49.0,56.0,63.0,0},
                 {8,40.0,42.0,49.0,56.0,63.0,1},
                 {9,45.0,54.0,49.0,56.0,63.0,1},
                 {10,50.0,60.0,70.0,80.0,90.0,0}
      ],myrec);

// myds := $.MyFile;            //update to use your own input DS
// myrec:=RECORDOF(myds);
                        
#EXPORTXML(layout,myrec);
#DECLARE(myset);
#DECLARE(Ndx);
#SET(Ndx,0);
#FOR(layout);
#FOR(Field);
  #IF(%'{@label}'%<>'id'); // rename the 'id' string value to match your recid fieldname
   #SET(Ndx,%Ndx% + 1);
   #IF(%Ndx%=1);
    #SET(myset,'IMPORT $; \n IMPORT ML_Core; \n IMPORT ML_Core.Types; \n IMPORT LogisticRegression as LR; \n MySetFld := [');
      #APPEND(myset,'myds.'+%'{@label}'%);
     #ELSE
      #APPEND(myset,','+ 'myds.'+%'{@label}'%);
     #END
  #END
#END
#END
#APPEND(myset,'];\nCntFld := COUNT(MySetFld);');

#DECLARE(Iteration);
#SET(Iteration,4);    //update the symbol value for other iterations.
                      //For instance, for iteration no 5, use "#SET(Iteration,5);".
#DECLARE(Combination);
#SET(Combination,0);
#DECLARE(MainCode);
#SET(MainCode,'');
#DECLARE(var1);
#DECLARE(var2);
#DECLARE(var3);        //include or remove var´s according to your iteration number.
                       //For instance, for iteration no 5, include "#DECLARE(var4);".
#DECLARE(TotVar);
#SET(var1,v1);
#SET(var2,v2);
#SET(var3,v3);                 //include or remove symbol values according to your
                               //iteration number. For instance, for iteration no 5,
                               //include "#SET(var4,v4);".
#SET(TotVar,%Iteration%+1);
#LOOP
#IF(%Combination%<%Ndx%-1);
   #SET(Combination,%Combination% + 1);
   #IF(%Combination%<>%Var1%);
    #IF(%Combination%<>%Var2%);
     #IF(%Combination%<>%Var3%);      //include or remove var´s according to your
                                      //iteration number. For instance, for iteration                                           
                                      //no 5, include "#IF(%Combination%<>%Var4%);".
      #APPEND(MainCode,'myTrainData'+%'iteration'%+'_'+%'combination'%+' :=
              TABLE(myds[1..7],{myds.id, '+             //update the size of the
                                                        //training sample
                          'MySetFld['+%'var1'%+'], '+
                'MySetFld['+%'var2'%+'], '+
                'MySetFld['+%'var3'%+'], '+  //include or remove var´s
                                                            //according to your
                                                            //iteration number. For
                                                            //instance, for iteration
                                                            //no 5, include
                                                        //"'MySetFld['+%'var4'%+'],'+".
                'MySetFld['+%'combination'%+'], '+
                          'MySetFld[CntFld]}); \n');
    #APPEND(MainCode,'ML_Core.ToField(myTrainData'+%'iteration'%+'_'+%'combination'%+',
                      myTrainDataNF'+%'iteration'%+'_'+%'combination'%+'); \n');
    #APPEND(MainCode,'XTrain'+%'iteration'%+'_'+%'combination'%+' :=             myTrainDataNF'+%'iteration'%+'_'+%'combination'%+'(number < '+%'TotVar'%+'); \n' +
                     'YTrain'+%'iteration'%+'_'+%'combination'%+' := PROJECT(myTrainDataNF'+%'iteration'%+'_'+%'combination'%+'(number =' +%'TotVar'%+'), '+
       'TRANSFORM(Types.DiscreteField, '+                                                                                                 
       'SELF.number := 1, '+
       'SELF := LEFT)); \n');
                                                        
   #APPEND(MainCode,'mod_bi'+%'iteration'%+'_'+%'combination'%+' :=          LR.BinomialLogisticRegression().getModel(XTrain'+%'iteration'%+'_'+%'combination'%+', '+
      YTrain'+%'iteration'%+'_'+%'combination'%+');\n');     

   #APPEND(MainCode,
     'myTestData'+%'iteration'%+'_'+%'combination'%+' := TABLE(myds[8..10],{myds.id, '+           //update the size of the test sample
     'MySetFld['+%'var1'%+'], '+
     'MySetFld['+%'var2'%+'], '+
     'MySetFld['+%'var3'%+'], '+   //include or remove var´s according to your
                                        //iteration number. For instance, for
                                        //iteration no 5, include     
                                        //"'MySetFld['+%'var4'%+'], '+".
     'MySetFld['+%'combination'%+'], '+
     'MySetFld[CntFld]});\n');
                                                                                                                              
      #APPEND(MainCode,
             'ML_Core.ToField(myTestData'+%'iteration'%+'_'+%'combination'%+', '+
        'myTestDataNF'+%'iteration'%+'_'+%'combination'%+'); \n');
                                             
      #APPEND(MainCode,
        'XTest'+%'iteration'%+'_'+%'combination'%+' := myTestDataNF'+%'iteration'%+'_'+%'combination'%+'(number <' +%'TotVar'%+'); \n' +
             'YTest'+%'iteration'%+'_'+%'combination'%+' := PROJECT(myTestDataNF'+%'iteration'%+'_'+%'combination'%+'(number =' +%'TotVar'%+'), '+
      'TRANSFORM(Types.DiscreteField, '+
                  'SELF.number := 1, '+
                  'SELF := LEFT)); \n');
                                                                                                      
      #APPEND(MainCode,
             'predict'+%'iteration'%+'_'+%'combination'%+' :=
LR.BinomialLogisticRegression().Classify(mod_bi'+%'iteration'%+'_'+%'combination'%+', '+
'XTest'+%'iteration'%+'_'+%'combination'%+'); \n');
     
     #APPEND(MainCode,
            'conf_matrix'+%'iteration'%+'_'+%'combination'%+' :=
             LR.Confusion(Ytest'+%'iteration'%+'_'+%'combination'%+','+
             'predict'+%'iteration'%+'_'+%'combination'%+'); \n' +
             'bin_matrix'+%'iteration'%+'_'+%'combination'%+' := LR.BinomialConfusion(conf_matrix'+%'iteration'%+'_'+%'combination'%+'); \n' +
             'OUTPUT(bin_matrix'+%'iteration'%+'_'+%'combination'%+',
             NAMED(\'Accuracy'+%'iteration'%+'_'+%'combination'%+'\')); \n');
     #END
    #END
    #END
  #ELSE
    #BREAK
  #END
#END


GenCode := %'myset'% + '\n' + %'MainCode'%;
OUTPUT(GenCode);

%myset%;
%MainCode%;

ENDMACRO;
hwatanuki
 
Posts: 28
Joined: Mon Apr 15, 2019 1:22 am


Return to Português

Who is online

Users browsing this forum: No registered users and 1 guest

cron