지난 포스팅에 이어 Window Loop Start와 Generic Loop Start 노드에 대해 알아보겠다.
1. 활용할 데이터에 대한 설명 및 첨부파일과
2. Loop 노드에 대한 기본적인 설명
3. Counting Loop Start 노드에 대한 설명
4. Flow Varaibles에 대한 설명은 아래 링크에 있으며
2024.08.28 - [KNIME] - [KNIME] Loop 실습(1)
Group Loop Start 노드와 Column List Loop Start 노드에 대한 설명은 아래 링크에 있다.
2024.08.28 - [KNIME] - [KNIME] Loop 실습(2)
4. Window Loop Start
이번에는 Window Loop Start 노드에 대해 알아보겠다.
행을 기준으로 지정해준 window size만큼, step size씩 밀면서 데이터를 가져오거나
혹은 시간 컬럼을 기준으로 정해준 시간만큼, 정해준 step size씩 밀면서 데이터를 가져오는 노드이다.
모델 학습 기법 중 시계열 데이터에 적용하는 Sliding Window 기법을 사용할 때 활용 할 수 있는 노드이다.
Window Loop Start 노드를 가져와 연결해준다.
옵션창을 들어가면 다음과 같이 행을 기준(Row based)으로 할지, 시간을 기준(Time based)으로 할지 선택할 수 있다.
먼저 행을 기준으로 Window size를 2로, Step size를 1로 설정해보겠다.
실행 시 첫 번째 loop에 대한 결과를 확인할 수 있다.
Window size를 2로 설정했기 때문에 위에서부터 2개 행만 불러와진 걸 확인할 수 있다.
Loop End 노드를 붙이고 실행한다.
실행 시 모든 loop의 결과가 합쳐진 결과가 나온다.
맨 오른쪽에 Iteration 컬럼이 생성되어 해당 row가 몇 번째 loop의 결과인지 알 수 있다.
맨 왼쪽에 RowID를 보면 원래 데이터 RowID 옆에 #과 몇 번째 Iteration인지도 붙어서 나온다.
Step size를 1로 설정해줬기 때문에 한 칸 씩 밀면서 데이터를 가져온다.
첫 번재 loop의 결과가 Row0, Row1이고
두 번째 loop의 결과가 Row1, Row2,
세 번째 loop의 결과가 Row2, Row3,
...
이다.
참고로 가장 마지막 행이 ? 인 이유는 Iteration 9에서 loop가 종료되는게 아니라 Iteration 10에서 loop가 종료되었기 때문이다.
즉, 가장 마지막 데이터가 window의 마지막이 아니라, 시작이 될 때까지 loop가 반복된다.
Iteration 9에서 loop가 종료되게 하려면 Window Loop Start 노드의 옵션창에서 위에 Advanced로 들어가 Limit window to tabled을 활성화시켜주면 된다.
그럼 Loop End 노드 실행 시 window가 마지막 행에 도달했을 때 더이상 loop가 진행되지 않고 잘 끝나는걸 확인할 수 있다.
Window Loop Start에서 Window size를 3으로, Step size를 2로 하면 Loop End의 결과는 다음과 같다.
위에서부터 세건의 데이터씩 불러오며, Step size가 2이므로 두칸씩 이동한다.
즉, RowID 기준으로
첫 번째 loop는 0,1,2
두 번째 loop는 2,3,4
세 번째 loop는 4,5,6
...
이다.
이번에는 행이 아니라 시간을 기준으로 실습해보겠다.
birth 컬럼과 Window Loop Start 노드를 활용하여 각 멤버가 몇년대에 태어난 사람인지에 대한 컬럼을 생성해보겠다.(1960년대, 1970년대, ...)
단, birth 컬럼이 순서대로 정렬되어있지 않은 상태에서 바로 Window Loop Start 노드를 사용하면 에러가 난다.
따라서 Sorter 노드를 활용하여 정렬을 먼저 해주어야 한다.
옵션창으로 들어가 birth 컬럼에 대해 오름차순 정렬을 해준다.
(Ascending : 오름차순, Descending : 내림차순)
그리고 나서 Window Loop Start 노드를 연결하고 Time based로 옵션을 설정한다.
birth 컬럼으로 설정하고
Window size는 10년, Step size도 10년으로 설정한다.
단, Start at을 따로 1960-01-01 로 지정해주지 않으면
가장 먼저 태어난 지석진씨의 birth(1966-02-10)을 기준으로 10년씩 짤리기때문에
1960~1969, 1970~1979, ... 이 아니라
1966~1975, 1976~1985, ... 로 기준이 나뉘게 된다.
Loop End 실행 시 다음과 같이 각 세대별로 Iteration이 나뉜것을 볼 수 있다.
Iteration 컬럼을 Math Formula 노드에 활용하여 generation 컬럼을 생성할 수 있다.
Iteration 컬럼에 10을 곱하고 1960을 더해준다.
그리고 generation 이라는 이름으로 새로운 컬럼을 생성해주도록 설정한다.
그러면 가장 오른쪽에 generation 컬럼이 생성되며, 몇년대에 태어난 사람인지 확인할 수 있다.
5. Generic Loop Start
마지막으로 Generic Loop Start 노드에 대해 알아보겠다.
다른 언어에서 while문과 동일한 역할을 하는 노드로, 그냥 무한 반복을 하는 노드이다.
따라서 그냥 Loop End 노드가 아니라 Variable Condition Loop End 노드를 사용하여 loop 종료 조건을 따로 전달해주어야한다.
이번에는 모델 학습 기법 중 시계열 데이터에 적용하는 Expanding Window 기법을 실습해 보겠다.
Generic Loop Start 노드 옆에 Row Filter 노드를 연결한다.
옵션창 켜서 Include rows by number 로 선택한다.
Include는 포함, Exclude는 제외를 의미하며
rows by attribute value는 입력한 값과 매칭되는 행을 포함하거나 제외하는 옵션이고
rows by number는 행의 범위를 기준으로 포함하거나 제외하는 옵션이며
rows by RowID는 RowID를 기준으로 포함하거나 제외하는 옵션이다.
가장 첫 번째 데이터부터 가져오되, loop가 돌면서 한 건씩 늘어나는 방식이므로 Include rows by number로 선택해주고
First row number는 1로 해준다.
그리고 Last row number를 현재 몇 번째 loop인지에 대한 값(currentIteration)을 Flow Variables로 넘겨주어 매 loop마다 하나씩 늘어나도록 설정해준다.
이렇게 설정하고 다시 Filter Criteria로 돌아오면 맨 아래에 The "RowRangeEnd" parameter is controlled by a variable. 이라는 문구가 뜬다.
즉, Last row number가 1,000 으로 설정되어있는것 처럼 보여도 사실은 Flow Variables로 설정해준 값으로 적용된다는 뜻이다.
참고로 이전 노드에서 넘겨준 Flow Variables를 본 노드에 적용하고 싶을 때는 왼쪽에 옵션을 설정해주면되고
해당 노드에서 사용한 값을 다른 노드로 넘겨주고 싶을 땐 오른쪽에 variable이름을 설정해주면 된다.
Row Filter 노드 실행 시 가장 첫 번째 loop에 대한 결과를 볼 수 있다.
Flow Variables 확인해보면 첫 번째 loop이므로 currentIteration이 0이다.
즉, Row Filter에 Last row number를 1로 설정한것과 동일한 결과가 나온다. (RowRangeEnd에 1을 더한값이 Last row number에 적용된다.)
이제 Variable Condition Loop End 노드에 종료 조건을 입력한다.
전체 데이터가 10건이므로 currentIteration = 10일때 loop를 종료하도록 한다.
실행 시 다음과 같이 매 loop 마다 데이터가 한 건 씩 추가되는 결과를 볼 수 있다.
Expanding Window 방식으로 학습 할 때 이런식으로 Generic Loop Start와 Variable Condition Loop End 노드를 활용하여 매 loop마다 train/test set 하나씩 늘어나는 데이터를 가져오고, Partitioning 노드를 활용하여 train/test set을 분리하여 학습하면 된다.
'KNIME' 카테고리의 다른 글
[KNIME] Hyper parameter optimization (1) | 2024.09.02 |
---|---|
[KNIME] Loop 실습(2) (0) | 2024.08.29 |
[KNIME] Loop 실습(1) (4) | 2024.08.28 |
[KNIME] String to Date&Time 노드 실습(format 설정) (4) | 2024.08.27 |
[KNIME] 엑셀(xlsx) 파일 읽기 :: Excel Reader (0) | 2024.08.27 |