Recent Posts
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- kotlin
- 티스토리챌린지
- 달인막창
- JanusWebRTC
- 코루틴 빌더
- table not found
- 겨울 부산
- pytest
- Value too long for column
- terminal
- JanusWebRTCServer
- taint
- PersistenceContext
- preemption #
- JanusGateway
- 자원부족
- k8s #kubernetes #쿠버네티스
- 개성국밥
- vfr video
- PytestPluginManager
- tolerated
- 코루틴 컨텍스트
- JanusWebRTCGateway
- 깡돼후
- 헥사고날아키텍처 #육각형아키텍처 #유스케이스
- 오블완
- VARCHAR (1)
- Spring Batch
- mp4fpsmod
- python
Archives
너와 나의 스토리
[ML] 'Robust Random Cut Forest for anomaly detection' 설명 및 library (Online Anomaly Detection) 본문
Data Analysis/Machine learning
[ML] 'Robust Random Cut Forest for anomaly detection' 설명 및 library (Online Anomaly Detection)
노는게제일좋아! 2019. 9. 9. 20:55반응형
Robust random cut trees
- Random: 우리가 가지고 있는 데이터들로부터 임의로 뽑아냄.
- Cut: 같은 수의 점들로 부분집합을 만들어서 tree를 구성.
- Forest: 만들어진 여러 트리들을 모두 고려해서 anomaly 여부를 결정.
- binary tree이다.
- Stream data를 처리할 수 있으며, 고차원 데이터에도 적합.
- 이상치 점수를 매겨 통계적으로 이상치 판단.
- 포인트 셋에서 이상치(outlier)들을 탐지하는 데 사용할 수 있는 이분 탐색 트리이다. 루트에 가까운 점은 이상치일 가능성이 높다.
Amazon SageMaker의 Random Cut Forest(RCF) 알고리즘
- 트리 만들기:
- 트리는 숫자 데이터를 순서대로 저장한다. (이진 트리)
- 이상치 판단: 데이터 'A'가 이상치인지 알아보자
- 기존 데이터에서 랜덤 샘플링해서 뽑은 데이터 몇 개와 A를 둔다.
- 데이터가 있는 공간을 랜덤 하게 2등분 한다.
- root는 (랜덤 샘플링한 데이터 + A)모든 데이터를 가지고 있는 노드이다. 여기에 [3]에서 나눈 데이터를 각각 자식 노드로 둔다.
- 나눠진 영역에 A만 남을 때까지 계속해서 랜덤 하게 분할하며 트리를 생성한다.
- 세분화한 횟수가 적을수록(A만 있는 노드의 depth가 낮을수록) A는 데이터 셋에 대한 anomaly일 가능성이 높다.
- anomaly score: 이 확률(이상치일 확률)을 측정
- anomaly socre가 높다는 것은 anomaly일 가능성이 높다는 것을 나타냄
- trees를 forest로 combine
- [1~5] 과정을 통해 여러 개의 트리를 만들어 forest를 구성하고 전체적으로 반영한다.
- 통상 평균값에서 3 표준편차 범위를 넘을 경우 이상치로 간주(데이터가 정규분포를 따른다고 가정)
- Amazon SageMaker의 RCF 알고리즘
- 우선 학습 데이터에서 임의로 샘플을 추출하여 작업을 수행한다. 만약 학습 데이터가 지나치게 커서 머신 한 대에 올리기 어려운 경우, reservoir sampling 기법을 이용하여 데이터 스트림으로부터 샘플 데이터를 효율적으로 추출한다.
- reservoir sampling 기법: 입력 데이터를 주어진 파일에 대해 오프셋 탐색을 이용하여 선택된 데이터만을 샘플로 선정해 메모리에 적재하므로 대용량 데이터에 대해 효과적으로 샘플링 가능.
- 이를 통해서 서브 샘플 데이터들이 Random Cut Forest를 구성하는 트리 각각에 분포하게 된다.
- 각각의 서브 샘플 데이터는 바운딩 박스를 랜덤하게 분할하는 식으로 만들어진 이진트리를 구성하게 되는데, 이러한 트리 구성은 각 리프 노드(즉, 터미널 노드)가 데이터를 하나만 담고 있는 바운딩 박스로 만들어질 때까지 계속 반복된다.
- 입력 데이터에 할당된 이상치 스코어는 포레스트를 구성하는 트리의 평균 깊이와 반비례한다.
- 우선 학습 데이터에서 임의로 샘플을 추출하여 작업을 수행한다. 만약 학습 데이터가 지나치게 커서 머신 한 대에 올리기 어려운 경우, reservoir sampling 기법을 이용하여 데이터 스트림으로부터 샘플 데이터를 효율적으로 추출한다.
- 더 자세한 내용 - 참고
전처리 방법: shingling
- 이상 탐지 알고리즘에서, shingling은 연속성을 지닌 데이터에서 길이 s만큼의 시퀀스를 s-차원의 벡터로 변환함으로써 1차원 데이터를 s-차원 데이터로 바꾸는 기술이다.
- 이렇게 하면 정기적으로 나타나는 변화를 탐지하기 좋고, 이상치 스코어의 원래 값에서 작은-규모의 노이즈를 필터링하는데 효과적이다.
- shingle 사이즈가 너무 작을 경우, Random Cut Forest 알고리즘이 데이터의 작은 변화에도 심하게 영향을 받을 수 있다. 반면에 사이즈가 너무 크면, 작은 크기의 이상치를 탐지하지 못할 수 있다.
Library 사용법
1. 설치
pip install rrcf
2. 빈 트리 생성
def create_forest(num_trees):
forest = []
for _ in range(num_trees):
tree = rrcf.RCTree()
forest.append(tree)
return forest
3. 이상치 탐지
#check anomaly with RRCF
def anomaly_detection(self, data):
for tree in self.forest:
if len(tree.leaves) > self.tree_size:
tree.forget_point(self.idx-self.tree_size)
tree.insert_point(data, index=self.idx)
if not self.idx in self.avg_codisp:
self.avg_codisp[self.idx] = 0
self.avg_codisp[self.idx] += tree.codisp(self.idx) / self.num_trees
# avg_codisp은 (각 tree 이 point를 anomaly로 생각하는 정도)의 평균
mean = np.array(list(self.avg_codisp.values())).mean()
std = np.array(list(self.avg_codisp.values())).std()
z = (self.avg_codisp[self.idx] - mean)/std
self.idx += 1
if z > 3.0 or z < -3.0 :
return self.previous_train_batch.mean()
# if abs(z-score) is over 3.0
# replace the value with the mean of whole data we met
else :
return data
#if not over 3.0, then no need to replace the value
참고:
- Amazon SageMaker에서의 점진적 훈련:
https://docs.aws.amazon.com/ko_kr/sagemaker/latest/dg/incremental-training.html
- RCF 알고리즘 library:
https://github.com/kLabUM/rrcf
- AWS Sagemaker 설명:
https://freecontent.manning.com/the-randomcutforest-algorithm/
반응형
'Data Analysis > Machine learning' 카테고리의 다른 글
[ML] Bootstrap / Bagging (0) | 2019.09.16 |
---|---|
[ML] Online bagging (0) | 2019.09.16 |
Amazon SageMaker / Jupyter 노트북 인스턴스 생성 및 실행 / 커널 설치 / mxnet_p36 (0) | 2019.09.09 |
[ML] MondrianForestRegression으로 time series 주식 가격 예측하기 - feature 1개일 때 / 2개일 때 (0) | 2019.09.06 |
[ML] Mondrian Forest - API reference / Properties (0) | 2019.09.04 |
Comments