Fri Oct 22, 2021 12:48 am
Login Register Lost Password? Contact Us


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