안녕하세요 MySAS홍보대사 한노아입니다.
SAS Code Node
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 20 21 |
%macro _bootstrapping_(input, outd, seed);
proc sql noprint; select count(*) as cnt into :cnt from &input ;quit;
proc surveyselect data = &input n = &cnt out = &outd(drop = NumberHits) seed = &seed method = urs noprint outhits; run;
%mend _bootstrapping_;
%_bootstrapping_(&EM_IMPORT_DATA, &EM_EXPORT_TRAIN, 1234); |
먼저 살펴볼 코드는 부스팅 실습때 이용했던 'boostrapping'매크로입니다. 위 코드에서 각 분류기에 대응되는 SAS 코드마다 랜덤시드 값(매크로 함수의 세 번째 인수)만 변경해 주어 적용하면 됩니다. 위 코드는 크게 두 스탭으로 나눠져 있는데 첫 번째 단계(3~7 줄)를 통해서 입력된 데이터의 관측치의 개수를 구하고 두 번째 단계(9~16줄)에서 Surveyselect 프로시저를 이용해 단순임의 복원추출을 진행하게 됩니다. 개별 옵션에 대한 자세한 설명은 아래 링크를 참고하시기 바랍니다.
SAS Code Node
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
%macro keepsomevars(randomseed);
proc sql; create table _temp_ as select NAME from &EM_IMPORT_DATA_CMETA where role = "INPUT" ;quit;
%let rejected_number = %eval(&sqlobs- %sysfunc(ceil(%sysfunc(sqrt(%eval(&sqlobs)))))); proc sql outobs = &rejected_number; create table _temp_ as select NAME from _temp_ order by ranuni(&randomseed) ;quit;
proc sql noprint; select * into :my_input1- :my_input&rejected_number from _temp_ ;quit;
%do i = 1 %to &rejected_number; %let &&my_input&i = %sysfunc(strip(&&my_input&i)); %put Rejected variables : &&my_input&i; %EM_METACHANGE(name = &&my_input&i, role = REJECTED); %end;
proc datasets lib = work noprint; delete _temp_; run;
%mend keepsomevars; %keepsomevars(1234); |
위 매크로는 임의로 변수를 선택하기 위한 매크로 입니다. 위 코드는 크게 3단계로 구성되어있습니다. 우선 첫 번째 단계(3~8줄)의 경우 입력된 데이터의 메타 데이터에서 역할이 INPUT으로 설정되어 있는 변수리스트의 이름을 '_temp_'데이터에 저장합니다.
두 번째 단계(10~23줄)에서는 첫 번째 단계에서 추출한 변수이름들 중 Rejected할 데이터를 '전체 데이터의 수(&sqlobs) - 루트 입력데이터의 수'를 이용해 구합니다. 그 다음 해당 변수의 수 만큼을 첫 번째 단계에서 추출한 테이블에서 임의 추출하고 추출된 변수들을 매크로 변수에 저장(INTO문을 이용)합니다.
마지막으로 위에서 추출된 변수(Rejected 시킬)들을 각가 %do-%end 루프를 이용하여 %EM_METACHAGE 매크로 함수를 이용해 역할을 'Rejected;로 변경합니다.
위 코드의 경우 기존 SAS paper[1]에서 제공하는 코드와 다소 상이 할 수 있습니다. 변경한 이유는 기존에 제공하는 코드의 경우에는 추출되는 변수의 개수가 일정하지 않아 1개의 변수만 추출되는 경우가 존재하기 때문에 위와 같이 트리의 수가 많지 않은 경우 추출되는 변수의 개수에 따라서 퍼포먼스의 편차가 너무 크기 때문에 기존 랜덤포레스트 알고리즘에서 주로 사용되는 루트(전체 입력 변수의 수)를 이용하도록 하기 위해서 입니다.
GOODNESS-OF-FIT
이번 실습의 모형 평가 결과를 살펴보면 평가오분류율면에서 로테이션 포레스트 모형이 EM에서 제공한 랜덤포레스트 모형보다 더 높은 오분류율을 나타내는 것을 알 수 있었습니다. 이러한 점으로 미뤄봤을 때 본 데이터의 경우에는 로테이션 포레스트가 일반적인 랜덤포레스트보다 더 좋은 성능을 나타내지 않는 것을 알 수 있었습니다.
CONCLUSION
이번 실습과정의 목적은 앙상블 모형을 커스터마이징 하는 방법에 대해 알아 보는 것이었습니다. 부스팅 계열 모형을 커스터 마이징 하고 싶은 경우에는 그룹처리 노드를 이용하거나 앞서 살펴본 SAS코드 노드를 적절하게 활용하면 이번 연재에서와 같이 구현이 가능합니다. 이번에 알아본 모형은 로테이션 포레스트 모형이었습니다. 기존의 랜덤포레스트 모형에 주성분분석을 이용한 차원축소 개념을 추가한 개념의 모형으로 2006년에 소개된 매우 최근 알고리즘 중 하나입니다. 결과적으로는 기존 랜덤 포레스트 모형보다 더 안 좋은 성능을 나타냈지만 트리의 개수가 8개 밖에 되지않아 사실상 정확한 비교를 했다고는 말하기 어렵습니다. 만약 트리의 개수가 일반적인 랜덤 포레스트 노드 처럼 100~150개 정도 생성하여 비교하게 된다면 더 좋은 성능을 나타낼 수 있지 않을까 하는 아쉬움이 있었습니다. 끝으로 다음 연재에서는 앞 서 부스팅 및 배깅 앙상블 방법을 이용하며 살펴 보았던 그룹처리 노드의 다양한 기능들에 대해서 알아보도록 하겠습니다.
REFERENCES
[1] http://support.sas.com/resources/papers/proceedings14/SAS133-2014.pdf
[2] http://archive.ics.uci.edu/ml/datasets/Image+Segmentation
[3] Rodriguez, Juan José, Ludmila I. Kuncheva, and Carlos J. Alonso. "Rotation forest: A new classifier ensemble method." IEEE transactions on pattern analysis and machine intelligence 28.10 (2006): 1619-1630.
Registration is now open for SAS Innovate 2025 , our biggest and most exciting global event of the year! Join us in Orlando, FL, May 6-9.
Sign up by Dec. 31 to get the 2024 rate of just $495.
Register now!