настройка параметров hpneural - переменное количество скрытых слоев (в цикле do) - PullRequest
0 голосов
/ 09 января 2019

Я подготовил несколько наборов поездов и проверок, таких как:

data train;
     retain Make Model DriveTrain EngineSize Horsepower MSRP;
     set sashelp.cars(where=(Origin <> 'Asia'));
     keep Make Model DriveTrain EngineSize Horsepower MSRP;

run;

data validation;
     retain Make Model DriveTrain EngineSize Horsepower MSRP;
     set sashelp.cars(where=(Origin = 'Asia'));
     keep Make Model MSRP DriveTrain EngineSize Horsepower;
run;

На данный момент я создаю макрос для обучения модели nn с переменным числом нейронов.

%macro build_predictions();

    data validations_scores;
        set validation;
        keep Make Model MSRP;
    run;

    %do neurons = 1 % to 10;

            proc hpneural data=train;
                input Make -- Horsepower / level=nom;
                target MSRP / level=int;
                hidden &neurons.;
                train outmodel=model_neural_network maxiter=1000;
            run;

            proc hpneural data=validation;
               score model=model_neural_network out=scored_test_data;
            run;

            data scored_test_data;
                set scored_test_data(keep=P_MSRP);
                P_MSRP = ceil(P_MSRP);
                rename P_MSRP = Forecast_neurons_&neurons.;
            run;

            data validations_scores;
                set validations_scores;
                set scored_test_data;
            run;

        %end;

%mend;

%build_predictions;

Я бы хотел добавить второй цикл для построения модели с 1-5 скрытыми слоями. В процедуре hp больше слоев означает, что мне нужно добавить дополнительную строку кода. например 3 слоя с 5 нейронами будут:

proc hpneural data=train;
            input Make -- Horsepower / level=nom;
            target MSRP / level=int;
            hidden 5;
            hidden 5;
            hidden 5;
            train outmodel=model_neural_network maxiter=1000;
run;

Так в принципе, как я могу создать дополнительный макрос, который будет копировать строку от 1 до 5 раз hidden &neurons.;

Спасибо большое!

[EDIT]:

Я создал макрос, который делает это для меня:

%macro copy_lines(i, neurons);

    %global hidden_layers;

    %if &i. eq 1 %then %do;
        %let hidden_layers = %str(hidden &neurons.;); 
    %end;
    %if &i. eq 2 %then %do;
        %let hidden_layers = %str(hidden &neurons.; hidden &neurons.;);
    %end;
    %if &i. eq 3 %then %do;
        %let hidden_layers = %str(hidden &neurons.; hidden &neurons.; hidden &neurons.;);
    %end;
    %if &i. eq 4 %then %do;
        %let hidden_layers = %str(hidden &neurons.; hidden &neurons.; hidden &neurons.; hidden &neurons.;);
    %end;
    %if &i. eq 5 %then %do;
        %let hidden_layers = %str(hidden &neurons.; hidden &neurons.; hidden &neurons.; hidden &neurons.; hidden &neurons.;);
    %end;

%mend;

и работает так:

%copy_lines(3, 5);
proc hpneural data=train;
            input Make -- Horsepower / level=nom;
            target MSRP / level=int;
            &hidden_layers.         
            train outmodel=model_neural_network maxiter=1000;
run;

Но я все равно хотел бы иметь лучшее и более "элегантное" решение.

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Во втором макросе используйте цикл %do для выдачи желаемого исходного кода. В первом макросе используйте макрос invocation вместо макропеременной resolution

%macro hidden_layers (layers=, neurons=);

  %local i;
  %do i = 1 %to &layers;
    hidden &neurons;   /* macro will emit this source code &layer times */
  %end;

%mend;

Настройте исходный макрос с

            … 
            target MSRP / level=int;
            hidden &neurons.;
            train outmodel=model_neural_network maxiter=1000

до

            … 
            target MSRP / level=int;
            %hidden_layers (3, &neurons)
            train outmodel=model_neural_network maxiter=1000

Вы также можете просто выполнить цикл внутри исходного макроса (и не нужно создавать второй макрос).

%macro build_predictions
  %do neurons = 1 % to 10;
        proc hpneural data=train;
            input Make -- Horsepower / level=nom;
            target MSRP / level=int;

            %local index;
            %do index = 1 %to 3; hidden &neurons.; %end;

            train outmodel=model_neural_network maxiter=1000;
        run;
        …
    %end; %* neurons loop;
%mend;

Выше можно добавить параметр к исходному макросу, например %macro build_prediction (layers_count=), и использовать &layers_count вместо 3

0 голосов
/ 09 января 2019

Вы можете попробовать следующий подход, чтобы использовать цикл вместо того, чтобы писать одни и те же операторы несколько раз

options merror mlogic mprint symbolgen;
%macro copy_lines(i, neurons);
    %global hidden_layers_temp;
    %let hidden_layers_temp='';
    /*loop through the number of given iterations*/
    %do j=1 %to &i;
        %let hidden_layers_temp=%str(&hidden_layers_temp,hidden &neurons.;);
    %end;
    /*Remove the first 3 characters which are '',*/
    %let hidden_layers=%qsysfunc(substr(&hidden_layers_temp,4,%sysfunc(length(&hidden_layers_temp))-3));
    %put &hidden_layers;
%mend;

%copy_lines(3, 5);
%copy_lines(5, 23);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...