HPNeural参数调优:寻求可变隐藏层数的优雅SAS宏实现方案
优化SAS宏生成多层隐藏层语句的简洁方案
你之前实现的%copy_lines宏虽然能完成需求,但硬编码层数判断的写法不够灵活,也不够优雅。我们可以用动态循环宏来实现更简洁的多层隐藏层语句生成,不管是1到5层还是更多层,都能轻松适配。
优化后的动态隐藏层生成宏
%macro generate_hidden_layers(num_layers, neurons_per_layer); %do i = 1 %to &num_layers.; hidden &neurons_per_layer.; %end; %mend generate_hidden_layers;
这个宏的逻辑非常直观:通过%do循环从1遍历到指定的层数num_layers,每次循环输出一条hidden &neurons_per_layer.;语句,完全不需要硬编码每一层的情况,扩展性拉满。
整合到神经网络训练流程中
接下来把这个宏整合到你原有的模型训练宏里,添加外层循环遍历1到5层隐藏层,同时保留原有的神经元数量循环,还做了几个细节优化:
%macro build_predictions(); data validations_scores; set validation; keep Make Model MSRP; run; /* 外层循环:遍历1-5层隐藏层 */ %do num_layers = 1 %to 5; /* 内层循环:遍历1-10个神经元 */ %do neurons = 1 %to 10; proc hpneural data=train; input Make -- Horsepower / level=nom; target MSRP / level=int; /* 调用宏生成对应层数和神经元数的hidden语句 */ %generate_hidden_layers(&num_layers., &neurons.) /* 给模型命名加上层数和神经元数,避免覆盖 */ train outmodel=model_neural_network_&num_layers._&neurons. maxiter=1000; run; proc hpneural data=validation; score model=model_neural_network_&num_layers._&neurons. 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_layers&num_layers._neurons&neurons.; run; data validations_scores; set validations_scores; set scored_test_data; run; %end; %end; %mend; %build_predictions;
关键优化点:
- 模型命名新增
&num_layers._&neurons.后缀,避免不同参数组合的模型互相覆盖 - 预测列名新增层数标识,后续查看验证结果时能快速区分不同模型的表现
- 生成隐藏层的宏完全动态,后续如果需要支持更多层数(比如到10层),只需要修改外层循环的上限即可,不需要改动宏本身
单独调用测试
如果想单独验证宏的效果,比如生成3层各5个神经元的语句,直接这样调用即可:
proc hpneural data=train; input Make -- Horsepower / level=nom; target MSRP / level=int; %generate_hidden_layers(3,5) train outmodel=model_neural_network maxiter=1000; run;
这会生成和你手动写3条hidden 5;完全一致的代码。
内容的提问来源于stack exchange,提问作者Mateusz Konopelski
相关产品推荐
相关产品推荐

