Iterar pelas colunas para rodar várias regressões
Moderator: hwatanuki
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á.
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
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
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
2 posts
• Page 1 of 1
Who is online
Users browsing this forum: No registered users and 1 guest