Я подготовил несколько наборов поездов и проверок, таких как:
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;
Но я все равно хотел бы иметь лучшее и более "элегантное" решение.