👩‍💻LEARN : ML&Data/Lecture

[Unsupervised Learning, Recommenders, Reinforcement Learning] #2. Anomaly detection

쟈니유 2023. 3. 28. 22:47
728x90

범인은..바로..너!


#2. Anomaly detection 

▶️ Finding unusual events 

새로운 데이터셋이 기존의 데이터 plot과 유사한 곳에 있지 않을 경우, anomaly 하다고 판단할 수 있다 

 

 

Density estimation 

  • 기존 데이터로 모델 P(x)를 학습시킨 이후 새로운 X가 데이터셋에서 나타날 확률을 P(X)라고 한다.
  • 이때 P(X)가 epsilon(작은수)보다 작을 경우 anomaly로 분류한다  

▶️ Gaussian (normal) distribution 

  • 정규분포! 평균(Mu), 표준분포(sigma, 분산은 sigma**2)로 이뤄진 종모양 분포 
  • x의 확률을 구하는 식은 p(x)이며,  x가 중심에서 멀어질수록 p(x)도 낮아진다. 

Parameter estimation 

  • dataset이 주어졌을 때 평균과 분산을 구할 수 있음 
  • x가 평균에서 멀리 있을 수록 anomaly하다고 볼 수 있다. 

 

▶️ Anomaly detection algorithm 

공식

  • n개의 feature를 가진 x의 벡터가 있다고 가정했을 때, x의 확률은 모든 p(x)를 곱한 것으로 아래와 같다. 
    • p(xn)의 확률을 나타내기 위해 평균과 분산을 함께 기재해준다 

방법

1. Anomaly에 대한 indicator가 될 수 있을 것으로 보이는 n개의 feature x를 선택한다. 

2. 모든 x에 대해 평균과 분산을 구한다 

3. 새로운 x가 주어졌을때 해당 x의 p(x)를 구하고, 만약 P(x)가 e(엡실론)보다 작으면 anomaly로 본다. 

 

 

  • feature x1,x2에 대한 확률과 분산을 구했을 때 3D 이미지로 표현되며, 해당 이미지에서 평균과 떨어져있을 수록 anomaly로 보임을 확인 

 

 

 

 

 

 

 

 

▶️ Developing and evaluating an anomaly detection system 

Developing

  • Train / cv / test set으로 나눈다
    • Train : y 는 없으며, 알고리즘을 학습시키는데에 사용한다  
    • cv : 소수의 anomaly (y label)를 포함하여 사용, cv로 사용하되 엡실론을 tune하는데 사용할 수 있다 
    • test : cv와 유사하게 소수의 anomaly를 포함하여 사용한다 

Evaluating

  • x feature들을 바탕으로 p(x)를 학습시킨다 
  • cv/test set에서 예측한다
    • p(x)가 엡실론보다 작으면 → y = 1 
    • p(x)가 엡실론과 같거나 크면 → y=0 
  • 이 때 anomaly의 수는 매우 작으므로 Skewed data 이며, 이럴 경우 다음과 같은 방법을 활용하여 평가할 수 있다.  
    • F1-score (using Precision, Recall) 
  • CV Set에서 테스트를 진행하며 F1 score 를 최대로 하는 엡실론 값을 도출할 수 있다.  

 

▶️ Choosing what features to use 

Anomaly detection에 중요한 것은 적합한 feature를 선택하는 것

 

Non gaussian features 

선택한 feature가 가우시안 분포에 해당하지 않는다면, 가우시안으로 만든다! by log(x) log(x+c), x**(1/n) 등 

 

Error analysis for anomaly detection 

대부분의 anomaly data는 하나의 feature만 보았을 때 p(x)가 엡실론보다 크게 나올 수 있다

이에 다른 feature를 함께 보면 (n차원) anomaly를 보다 쉽게 확인할 수 있다. 

이에 새로운 feature를 다른 feature들간의 조합으로도 확인할 수 있다. 

 

 

#1. 가우시안 분포 계산하기 


def estimate_gaussian(X): 

    m, n = X.shape
    
    ### START CODE HERE ### 
    
    mu = np.sum(X, axis=0) * (1/m)
    var = np.sum((X-mu)**2, axis=0) * (1/m)
    
    ### END CODE HERE ### 
        
    return mu, var
    
    
# 참고
# Returns the density of the multivariate normal
# at each data point (row) of X_train
p = multivariate_gaussian(X_train, mu, var)

#2. 엡실론값 구하기 with F1 score 

def select_threshold(y_val, p_val): 
    """
    Finds the best threshold to use for selecting outliers 
    based on the results from a validation set (p_val) 
    and the ground truth (y_val)
    
    Args:
        y_val (ndarray): Ground truth on validation set
        p_val (ndarray): Results on validation set
        
    Returns:
        epsilon (float): Threshold chosen 
        F1 (float):      F1 score by choosing epsilon as threshold
    """ 

    best_epsilon = 0
    best_F1 = 0
    F1 = 0
    
    step_size = (max(p_val) - min(p_val)) / 1000 #엡실론값 만들기용 
    
    for epsilon in np.arange(min(p_val), max(p_val), step_size):
    
        ### START CODE HERE ### 
        
        predictions = (p_val < epsilon) #반환값 = 0, 1 
        
        tp= sum((predictions == 1) & (y_val == 1)) #true-positive
        fp= sum((predictions == 1) & (y_val == 0)) #false-positive 
        fn= sum((predictions == 0) & (y_val == 1)) #false-negative 
        
        prec= tp / (tp+fp)
        rec= tp / (tp+fn)
        
        F1 = ( 2 * prec * rec ) / ( prec + rec )      
        
        ### END CODE HERE ### 
        
        if F1 > best_F1:
            best_F1 = F1
            best_epsilon = epsilon
        
    return best_epsilon, best_F1

p_val = multivariate_gaussian(X_val, mu, var)
epsilon, F1 = select_threshold(y_val, p_val)