[이탐] 통계 기반 이상탐지 알고리즘

의서쿠·2024년 5월 14일
1

Anomaly-Detection

목록 보기
3/6
post-thumbnail

통계 기반 이상탐지

통계적 접근 방식을 사용하여 모델이 데이터의 '정상적인' 행동을 학습하고 통계적으로 이례적인 행동을 보이는 데이터 포인트를 이상치로 식별합니다.

GMM (Gaussian Mixture Models)

  • 링크: https://scikit-learn.org/stable/modules/generated/sklearn.mixture.GaussianMixture.html

  • 정의: Gaussian Mixture Models(GMM)은 데이터를 여러 가우시안 분포의 혼합으로 모델링하여 각 데이터 포인트가 속할 확률을 계산합니다. 이를 통해 데이터를 클러스터링하거나 이상치를 탐지할 수 있습니다.

  • 적합한 데이터: 데이터가 하나 이상의 정규 분포를 따르는 것으로 가정할 때 효과적이며, 데이터의 잠재적 클러스터를 식별하는 데 유용합니다.

  • sklearn 함수: sklearn.mixture.GaussianMixture

    • 함수 설명:

      • GaussianMixture는 가우시안 혼합 모델을 사용하여 데이터의 확률 분포를 추정하는 클래스입니다. EM(Expectation-Maximization) 알고리즘을 사용하여 각 가우시안 성분의 파라미터를 최적화합니다.
      • 이 알고리즘은 데이터가 여러 개의 가우시안 분포로 구성되어 있다고 가정하고, 각 데이터 포인트가 특정 가우시안 분포에 속할 확률을 계산합니다.
    • 매개변수:

      • n_components (int, default=1): 혼합 성분의 수를 정의합니다. 클러스터의 수와 대응합니다.
      • covariance_type (str, default='full'): 공분산 매트릭스의 형태를 정의합니다. 'full', 'tied', 'diag', 'spherical' 중 선택할 수 있습니다.
      • tol (float, default=1e-3): EM 알고리즘의 수렴 임계값입니다. 이 값 이하로 로그 가능도 변화가 작아지면 알고리즘이 수렴합니다.
      • reg_covar (float, default=1e-6): 공분산 매트릭스에 추가되는 정규화 항입니다. 공분산 매트릭스가 양의 정부호성을 갖도록 보장합니다.
      • max_iter (int, default=100): EM 알고리즘의 최대 반복 횟수입니다.
      • n_init (int, default=1): 초기화를 수행할 횟수입니다. 가장 좋은 결과를 선택합니다.
      • init_params (str, default='kmeans'): 초기화 방법을 정의합니다. 'kmeans', 'k-means++', 'random', 'random_from_data' 중 선택할 수 있습니다.
      • weights_init (array-like, default=None): 초기 가중치 배열입니다. 제공되지 않으면 init_params 방법을 사용하여 초기화됩니다.
      • means_init (array-like, default=None): 초기 평균 배열입니다. 제공되지 않으면 init_params 방법을 사용하여 초기화됩니다.
      • precisions_init (array-like, default=None): 초기 정밀도(공분산의 역행렬) 배열입니다. 제공되지 않으면 init_params 방법을 사용하여 초기화됩니다.
      • random_state (int, RandomState instance or None, default=None): 난수 생성 시드를 설정하여 결과를 재현 가능하게 합니다.
      • warm_start (bool, default=False): True로 설정하면 이전에 학습된 결과를 초기화에 사용합니다.
      • verbose (int, default=0): 학습 과정의 진행 상황을 출력합니다.
      • verbose_interval (int, default=10): 몇 번째 반복마다 출력을 할지 설정합니다.
    • 속성:

      • weights_: 각 혼합 성분의 가중치 배열입니다.
      • means_: 각 혼합 성분의 평균 배열입니다.
      • covariances_: 각 혼합 성분의 공분산 행렬 배열입니다.
      • precisions_: 각 혼합 성분의 정밀도 행렬 배열입니다.
      • precisions_cholesky_: 각 혼합 성분의 정밀도 행렬의 Cholesky 분해입니다.
      • converged_: 모델이 수렴했는지 여부를 나타냅니다.
      • n_iter_: 수렴하는 데 사용된 반복 횟수입니다.
      • lower_bound_: EM 알고리즘에서 계산된 로그 가능도의 하한 값입니다.
      • n_features_in_: 학습 시 사용된 특성의 수입니다.
      • feature_names_in_: 학습 시 사용된 특성 이름 배열입니다.
    • 메서드:

      • aic(X): 주어진 데이터 X에 대한 현재 모델의 Akaike 정보 기준(AIC)을 계산합니다.
      • bic(X): 주어진 데이터 X에 대한 현재 모델의 베이지안 정보 기준(BIC)을 계산합니다.
      • fit(X[, y]): EM 알고리즘을 사용하여 모델 파라미터를 추정합니다.
      • fit_predict(X[, y]): 주어진 데이터 X를 사용하여 모델 파라미터를 추정하고 레이블을 예측합니다.
      • get_metadata_routing(): 이 객체의 메타데이터 라우팅을 가져옵니다.
      • get_params([deep]): 이 추정기의 파라미터를 가져옵니다.
      • predict(X): 학습된 모델을 사용하여 주어진 데이터 샘플 X의 레이블을 예측합니다.
      • predict_proba(X): 각 샘플에 대한 구성 요소의 밀도를 평가합니다.
      • sample([n_samples]): 학습된 가우시안 분포에서 랜덤 샘플을 생성합니다.
      • score(X[, y]): 주어진 데이터 X에 대한 샘플 당 평균 로그 가능도를 계산합니다.
      • score_samples(X): 각 샘플에 대한 로그 가능도를 계산합니다.
      • set_params(**params): 이 추정기의 파라미터를 설정합니다.
    • 예시:

      from sklearn.mixture import GaussianMixture
      import numpy as np
      
      # 예제 데이터
      X = np.array([[1, 2], [1, 4], [1, 0],
                    [10, 2], [10, 4], [10, 0]])
      
      # GMM 모델 생성 및 적합
      gm = GaussianMixture(n_components=2, random_state=0).fit(X)
      
      # 각 혼합 성분의 평균 출력
      print(gm.means_)
      
      # 예측 라벨 출력
      print(gm.predict([[0, 0], [12, 3]]))

✍️ 이 예제는 GaussianMixture를 사용하여 데이터를 두 개의 가우시안 성분으로 모델링하고, 새로운 데이터 포인트의 클러스터를 예측하는 방법을 보여줍니다. GMM은 데이터의 잠재적인 분포를 학습하고 이를 통해 클러스터링이나 이상치 탐지를 수행하는 데 매우 유용합니다.

PCA (Principal Component Analysis)

  • 링크: https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html

  • 정의: PCA(Principal Component Analysis)는 데이터의 주성분을 분석하여 차원을 축소하는 기법입니다. 이를 통해 데이터의 주요 변동성을 캡처하고, 원 데이터와 재구성된 데이터 간의 차이를 통해 이상치를 탐지할 수 있습니다.

  • 적합한 데이터: 고차원 데이터셋에서 주요 변동성을 파악하고 차원의 저주를 줄이고자 할 때 유용합니다. 주로 데이터 시각화, 노이즈 제거, 특징 추출 등에 사용됩니다.

  • sklearn 함수: sklearn.decomposition.PCA

    • 함수 설명:

      • PCA는 특이값 분해(Singular Value Decomposition, SVD)를 사용하여 데이터를 낮은 차원으로 투영하는 선형 차원 축소 기법입니다. 입력 데이터는 각 특성에 대해 중심화되며, SVD를 통해 주성분을 추출합니다.
      • LAPACK 구현의 전체 SVD 또는 데이터의 형태와 추출할 성분의 수에 따라 확률적 SVD를 사용합니다.
    • 매개변수:

      • n_components (int, float or 'mle', default=None): 유지할 주성분의 수입니다. 기본적으로 모든 성분을 유지합니다.
      • copy (bool, default=True): True로 설정하면 fit 시 입력 데이터를 복사하고, False로 설정하면 데이터를 덮어씁니다.
      • whiten (bool, default=False): True로 설정하면 주성분 벡터를 단위 분산을 가지도록 스케일링합니다. 이는 예측 정확도를 높일 수 있습니다.
      • svd_solver (str, default='auto'): SVD를 계산할 방법입니다. 'auto', 'full', 'arpack', 'randomized' 중 선택할 수 있습니다.
      • tol (float, default=0.0): 'arpack' SVD 솔버의 특이값에 대한 허용 오차입니다.
      • iterated_power (int or 'auto', default='auto'): 'randomized' SVD 솔버에서 파워 방법의 반복 횟수입니다.
      • n_oversamples (int, default=10): 'randomized' SVD 솔버에서 추가로 샘플링할 무작위 벡터의 수입니다.
      • power_iteration_normalizer (str, default='auto'): 'randomized' SVD 솔버의 파워 반복 정규화 방법입니다.
      • random_state (int, RandomState instance or None, default=None): 난수 생성을 제어하여 결과를 재현 가능하게 합니다.
    • 속성:

      • components_: 주성분 벡터 배열입니다.
      • explained_variance_: 선택된 각 성분에 의해 설명된 분산의 양입니다.
      • explained_variance_ratio_: 선택된 각 성분에 의해 설명된 분산의 비율입니다.
      • singular_values_: 선택된 각 성분에 해당하는 특이값입니다.
      • mean_: 각 특성의 경험적 평균입니다.
      • n_components_: 추정된 주성분의 수입니다.
      • n_samples_: 훈련 데이터의 샘플 수입니다.
      • noise_variance_: 추정된 노이즈 공분산입니다.
      • n_features_in_: 학습 시 본 특성의 수입니다.
      • feature_names_in_: 학습 시 본 특성 이름 배열입니다.
    • 메서드:

      • fit(X[, y]): 주어진 데이터 X로 모델을 학습시킵니다.
      • fit_transform(X[, y]): 주어진 데이터 X로 모델을 학습시키고, 차원 축소를 적용합니다.
      • get_covariance(): 생성 모델을 사용하여 데이터의 공분산을 계산합니다.
      • get_feature_names_out([input_features]): 변환된 출력 특성 이름을 가져옵니다.
      • get_metadata_routing(): 이 객체의 메타데이터 라우팅을 가져옵니다.
      • get_params([deep]): 이 추정기의 파라미터를 가져옵니다.
      • get_precision(): 생성 모델을 사용하여 데이터의 정밀도 행렬을 계산합니다.
      • inverse_transform(X): 데이터를 원래의 공간으로 변환합니다.
      • score(X[, y]): 모든 샘플의 평균 로그 가능도를 반환합니다.
      • score_samples(X): 각 샘플의 로그 가능도를 반환합니다.
      • set_output(*[, transform]): 출력 컨테이너를 설정합니다.
      • set_params(**params): 이 추정기의 파라미터를 설정합니다.
      • transform(X): 주어진 데이터 X에 차원 축소를 적용합니다.
    • 예시:

      from sklearn.decomposition import PCA
      import numpy as np
      
      # 예제 데이터
      X = np.array([[-1, -1], [-2, -1], [-3, -2],
                    [1, 1], [2, 1], [3, 2]])
      
      # PCA 모델 생성 및 적합
      pca = PCA(n_components=2)
      pca.fit(X)
      
      # 설명된 분산 비율 출력
      print(pca.explained_variance_ratio_)
      
      # 특이값 출력
      print(pca.singular_values_)
      
      # 새로운 데이터에 대한 주성분 투영
      X_new = pca.transform([[0, 0], [12, 3]])
      print(X_new)

✍️ 이 예제는 PCA를 사용하여 데이터의 주성분을 추출하고, 새로운 데이터 포인트를 주성분 공간에 투영하는 방법을 보여줍니다. PCA는 데이터의 주요 변동성을 파악하고 차원을 축소하여 데이터 분석 및 시각화에서 유용하게 활용될 수 있습니다.

profile
Always be passionate ✨

0개의 댓글