260310 [ Day 43 ] - ML, DL - Part 2 (3)

TaeHyun·2026년 3월 10일

TIL

목록 보기
169/185

시작하며

오늘로 머신러닝 파트가 끝이 났다. 이상탐지 부분이 어려운 개념들이 많아서 진이 많이 빠졌지만 어려운만큼 이후에 도움이 될 거라고 생각해서 열심히 들었던 것 같다.

SPE 기준 이상치 확인

  • SPE(Squared Prediction Error)는 PCA 모델로 복원한 값과 실제값의 차이를 사용
    • 실무에서는 실제 고장 비율을 이용하여 상위 분위수로 임계값을 설정
  • PCA 모델로 전체 데이터 복원
    • inverse_transform : 주성분 점수를 원본 데이터 형태로 복원
X_hat = model_pca.inverse_transform(pca_score)
  • 실제값과 복원 값의 잔차 계산
residual = X_scaled - X_hat
  • 각 관측값별 SPE 계산
spe = (residual ** 2).sum(axis=1)
  • 실제 고장 비율 기준 SPE 임계값 설정
spe_threshold = np.quantile(a=spe, q=1-fail_rate)
  • SPE 기준 이상치 여부 생성
spe_outlier = (spe > spe_threshold)
  • 이상치 개수 확인
spe_outlier.sum()
# np.int64(339)
  • 이상치 행 선택 후 Taeget의 상대도수 확인
df.loc[spe_outlier, 'Target'].value_counts(normalize=True).sort_index()
# Target
# 0    0.666667
# 1    0.333333
# Name: proportion, dtype: float64

Isolation Forest 기준 이상치 확인

  • 이상치는 정상 데이터보다 특성 공간에서 고립되기 쉬운 패턴을 가진다는 가정하에 무작위 트리를 생성하여 탐지
    • 여러 개의 트리를 생성한 후 관측값별로 고립되기까지 걸린 깊이의 평균을 계산
    • 이상치는 크게 벗어난 극단값을 가지는 경우가 많아 깊이가 짧은 특징이 있음
from sklearn.ensemble import IsolationForest
  • Isolation Forest 모델 생성
iso = IsolationForest(
    n_estimators=100,
    contamination=fail_rate,
    random_state=0
)
  • 모델 학습 및 관측값별 예측값 생성
iso.fit(X=train_num)
iso_pred = iso.predict(X=train_num)
  • Isolation Forest 기준으로 이상치 여부 생성
iso_outlier = (iso_pred == -1)
  • 이상치 개수 확인
iso_outlier.sum()
# np.int64(339)
  • 이상치 행 선택 후 Taeget의 상대도수 확인
df.loc[iso_outlier, 'Target'].value_counts(normalize=True).sort_index()
# Target
# 0    0.855457
# 1    0.144543
# Name: proportion, dtype: float64

One-class SVM 기준 이상치 확인

  • 정상 데이터의 경계를 학습하여 경계 밖의 관측값을 이상치로 판단
    • 정상치는 원점에서 멀리 떨어지도록 변환
    • 이상치는 원점에 가까운 위치로 매핑
    • 커널 함수를 사용하여 비선형 패턴을 학습
from sklearn.svm import OneClassSVM
  • One-class SVM 모델 생성
ocs = OneClassSVM(nu=fail_rate)
  • 표준화된 데이터로 모델 학습 및 관측값별 예측값 생성
ocs.fit(X=X_scaled)
ocs_pred = ocs.predict(X=X_scaled)
  • 이상치 여부 생성
ocs_outlier = (ocs_pred == -1)
  • 이상치 개수 확인
ocs_outlier.sum()
# np.int64(340)
  • 이상치 행 선택 후 Taeget의 상대도수 확인
df.loc[ocs_outlier, 'Target'].value_counts(normalize=True).sort_index()
# Target
# 0    0.711765
# 1    0.288235
# Name: proportion, dtype: float64

마치며

내일은 깃허브 특강이 있는 날이다. 매번 깃허브를 그냥 구글 드라이브처럼 사용하기만 해서 협업할 때 사용하는 기능들에 대해 많이 배우면 좋겠다.

profile
Hello I'm TaeHyunAn, Currently Studying Data Analysis

0개의 댓글