●○○개념 확인설계
두 과제를 놓고 지도학습 분류와 이상 탐지 중 하나를 골라야 한다.
A) 스팸 필터. 라벨된 스팸이 수백만 건 쌓여 있고 새 스팸도 기존과 닮았다
B) 신종 침입 탐지. 공격자가 수법을 계속 바꾼다
어떻게 나누는 것이 맞는가?
둘 다 이상 탐지다. 정상의 생김새를 배우는 쪽이 언제나 더 안전하다.
이상 사례가 충분하고 유형이 안정적이면 그것을 직접 배우는 쪽이 더 정확하다. 정상만 배우는 것은 재료가 없을 때의 선택이다.
둘 다 분류다. 이상 탐지는 라벨이 하나도 없을 때만 쓰는 최후의 수단이다.
이상 탐지도 임계값을 고를 때 소량의 라벨을 쓴다. 라벨 유무가 아니라 이상 사례의 수와 유형의 안정성이 기준이다.
정답A는 분류, B는 이상 탐지다. 이상 사례의 확보량과 유형의 안정성으로 갈린다.
분류기는 학습한 패턴만 잡으므로 수법이 바뀌면 조용히 통과시킨다. 정상의 생김새를 배워두면 수법이 무엇이든 정상이 아니라는 판정은 그대로 나온다.
A는 이상 탐지, B는 분류다. 데이터가 많을수록 분포를 정확히 추정할 수 있기 때문이다.
방향이 반대다. 이상 사례가 풍부한 A야말로 그 패턴을 직접 배울 수 있는 경우다.
해설
둘 중 어느 쪽이 맞는지는 이상 사례를 얼마나 확보했는지, 그리고 앞으로 나타날 이상이 지금까지 본 것과 비슷할지로 갈린다. 라벨이 충분하고 새 사례가 기존과 닮았다면 이상의 생김새를 직접 배우는 분류기가 낫다. 반대로 이상이 극소수이거나 유형을 미리 알 수 없다면 정상의 생김새를 배우고 그 바깥을 이상으로 판정하는 쪽으로 간다. 정상 데이터는 얼마든지 쌓여 있으니 재료 걱정이 없고, 처음 보는 유형도 정상이 아니라는 이유만으로 걸린다. 더 근본적인 갈림길은 유형 쪽에 있다. 분류기는 학습한 패턴만 잡으므로 공격자가 수법을 바꾸는 순간 그 패턴은 학습 데이터에 없는 것이 되고 모델은 조용히 통과시킨다.
이 내용 다시 읽기 →●●○상황 적용진단
평균 (50, 100), x1 분산 25, x2 분산 36, 공분산 20인 데이터에서 두 점의 밀도를 쟀다.
점 독립 가우시안 다변량 가우시안
(55, 108) 0.001323 0.002894
(55, 92) 0.001323 0.000118
독립 모델이 두 점에 같은 값을 매긴 이유는 무엇인가?
정답편차를 제곱 해 더하는 순간 부호가 사라져 두 특성 사이의 관계 정보가 지워지기 때문이다.
두 점 모두 첫 특성의 편차가 5, 둘째 특성의 편차가 절댓값 8이다. 어떤 임계값을 고르더라도 두 점은 같이 통과하거나 같이 걸린다.
두 점의 유클리드 거리가 같아 어떤 밀도 모델에서도 같은 값이 나오기 때문이다.
다변량 모델은 같은 유클리드 거리에서도 25배 가까운 차이를 냈다. 거리가 같다고 밀도가 같아지지 않는다.
독립 가정에서는 분산이 무시되고 편차의 절댓값만 반영되기 때문이다.
분산은 각 항의 분모로 그대로 들어간다. 지워지는 것은 분산이 아니라 두 특성 사이의 관계다.
두 특성의 분산이 25와 36으로 비슷해 가중치 차이가 상쇄됐기 때문이다.
분산이 크게 달라도 같은 값이 나온다. 상쇄가 아니라 부호 정보가 애초에 계산에 들어가지 않는 것이 원인이다.
해설
특성마다 가우시안을 따로 세워 곱하면 각 특성을 혼자 보면 정상 범위인데 조합이 이상한 경우를 통과시킨다. 두 점 모두 첫 특성의 편차가 5, 둘째 특성의 편차가 절댓값 8이라 제곱해서 더하는 순간 부호가 사라지고 완전히 같은 밀도가 나온다. 어떤 임계값을 고르더라도 둘은 같이 통과하거나 같이 걸린다. 다변량 가우시안은 공분산 행렬로 이 관계를 담아, 첫 특성이 크면 둘째도 커야 한다는 사실을 알고 있으므로 그 관계를 거스른 점을 훨씬 드문 사건으로 취급한다. 두 모델은 별개의 알고리즘이 아니라 같은 식에 다른 공분산을 넣은 것이다. 비대각 원소를 0으로 만드는 순간 다변량 가우시안은 독립 가우시안의 곱과 정확히 같아진다.
이 내용 다시 읽기 →●●○상황 적용함정
IsolationForest(contamination=0.06)으로 학습 데이터 1,000건을 판정했더니 정확히 60건이 이상으로 찍혔다. 실제 이상은 20건이고 그중 19건이 잡혔다.
이 결과를 어떻게 읽어야 하는가?
재현율 95%로 매우 우수하므로 이 설정을 그대로 배포하면 된다.
찍힌 개수가 이미 정해져 있으므로 이 숫자만으로는 성능을 판단할 수 없다. 정밀도는 19를 60으로 나눈 값에 불과하다.
모델이 실제 이상 비율을 20건에서 60건으로 과대 추정했으므로 값을 0.02로 낮춰야 한다.
이 값은 모델이 추정하는 대상이 아니라 사람이 지정하는 컷이다. 과대 추정이라는 표현이 성립하지 않는다.
학습 데이터에 이상이 60건 있다는 뜻이므로 라벨이 40건 누락됐는지 확인해야 한다.
찍힌 60건은 데이터의 사실이 아니 라 지정한 비율의 결과다. 라벨 누락을 의심할 근거가 되지 못한다.
정답이 파라미터가 임계값 그 자체라 60건은 지정한 비율의 결과일 뿐이다.
sklearn은 학습 데이터의 점수 분포에서 이 비율의 백분위수를 잘라 경계로 삼으므로 실제 이상이 몇 개든 정확히 그 비율만큼 찍힌다. 성능을 물으려면 그 60건 안에 진짜 이상이 몇 개인지를 봐야 한다.
해설
이 파라미터는 이름만 보면 데이터에 이상이 얼마나 섞였는지 모델에 귀띔해 주는 값 같지만 실제로는 임계값 그 자체다. sklearn은 학습 데이터의 점수 분포에서 지정한 비율의 백분위수를 잘라 경계로 삼으므로, 0.06을 주면 실제로 이상이 몇 개든 정확히 6%가 이상으로 찍힌다. 그래서 몇 개 중 몇 개를 잡았다는 숫자를 성능으로 읽으면 안 된다. 찍힌 개수는 이미 정해져 있고 진짜 물어야 할 것은 그 개수 안에 진짜 이상이 들어 있느냐다. 이상 비율을 모른다면 자동 설정으로 두고 점수를 직접 정렬해 자를 지점을 고르는 편이 낫다. 다른 알고리즘의 비슷한 파라미터도 같은 자리를 차지하므로 이름이 아니라 구현이 그 값을 어떻게 쓰는지 확인해야 한다.
이 내용 다시 읽기 →●●●분석과 판단함정
for eps in np.logspace(-12, -2, 200):
f1 = f1_score(y_val, (p_val < eps).astype(int))
...후보를 등간격이 아니라 로그 간격으로 잡는 이유는 무엇인가?
F1 점수가 로그 스케일에서만 단조로워 최댓값을 안정적으로 찾을 수 있기 때문이다.
F1은 어느 스케일에서도 단조롭지 않다. 여러 봉우리가 생길 수 있어 후보를 훑는 방식을 쓰는 것이다.
정답밀도가 평균에서 조금만 멀어져도 자릿수 단위로 떨어져 등간격으로는 후보가 큰 값 쪽에만 몰리기 때문이다.
선형 등간격으로 훑으면 200개 후보가 전부 큰 값 근처에 놓여, 정작 이상을 갈라내는 아주 작은 자리는 한 번도 시험해 보지 못한다. 자릿수마다 후보를 고르게 놓아야 한다.
밀도값이 음수가 될 수 있어 로그 스케일로 부호를 통일해야 하기 때문이다.
확률 밀도는 언제나 양수다. 부호 문제는 생기지 않는다.
임계값은 확률이므로 0과 1 사이로 정규화해야 하는데 로그 간격이 그 역할을 하기 때문이다.
로그 간격은 후보의 배치를 정할 뿐 정규화와 무관하다. 밀도는 애초에 1을 넘을 수도 있는 값이다.
해설
확률 밀도는 평균에서 조금만 멀어져도 자릿수 단위로 떨어진다. 선형 등간격으로 후보를 훑으면 200개가 전부 큰 값 쪽에 몰려서, 정작 정상과 이상을 갈라내는 아주 작은 자리는 한 번도 시험해 보지 못한다. 자릿수마다 후보를 고르게 놓아야 실제로 유효한 구간을 탐색한다. 임계값을 고르는 절차 자체도 짚어둘 만하다. 정상 데이터만으로 파라미터를 추정하고, 정상과 이상이 섞인 소량의 라벨 데이터에서 후보를 훑어 값을 고르고, 손대지 않은 테스트 세트에서 최종 성능을 잰다. 후보를 고를 때 정확도를 기준으로 삼으면 안 된다. 검증 세트도 정상이 압도적으로 많아 아무것도 탐지하지 않는 값이 1등을 차지하기 때문이다.
이 내용 다시 읽기 →●●○상황 적용설계
주택 위치 데이터에 이상 탐지를 걸려 한다. 도심에서는 집들이 수십 미터 간격으로 붙어 있고 교외에서는 수백 미터씩 떨어져 있다.
교외에서 이웃과 500m 떨어진 집 → 정상
도심에서 이웃과 500m 떨어진 집 → 이상
이 판정을 낼 수 있는 방법은 무엇이고 근거는 무엇인가?
다변량 가우시안이다. 공분산 행렬이 방향별 퍼짐을 담으므로 지역마다 다른 기준이 적용된다.
공분산은 데이터 전체에 하나뿐이라 여전히 전역 기준이다. 지역별로 기준이 갈리지 않는다.
Isolation Forest다. 무작위 분할이 밀집 지역과 성긴 지역에서 각각 다른 깊이를 만들기 때문이다.
경로 길이가 밀도를 반영하기는 하지만 그 값을 데이터 전체 기준으로 비교한다. 교외의 집들은 전체적으로 짧은 경로를 갖게 된다.
One-Class SVM이다. 커널 트릭으로 도심과 교외를 각각 감싸는 두 영역을 만들 수 있기 때문이다.
두 영역을 감쌀 수는 있지만 각 영역 안에서 얼마나 떨어져야 이상인지는 여전히 하나의 기준으로 정해진다.
정답LOF다. 전체 분포가 아니라 각 점의 이웃을 기준으로 한 상대 밀도를 보기 때문이다.
어떤 점의 밀도를 그 점의 이웃들이 가진 밀도와 견주므로, 이웃들이 자기보다 훨씬 빽빽할 때만 이상으로 판정한다. 밀도가 서로 다른 덩어리가 섞여도 각 덩어리의 기준으로 판정한다.
해설
LOF의 강점은 이름에 붙은 Local에 있다. 어떤 점의 밀도를 그 점의 이웃들이 가진 밀도와 견주는 것이 전부이고, 이웃들이 자기보다 훨씬 빽빽하면 값이 1보다 크게 나오고 이웃과 비슷하면 1 근처가 된다. 전체 분포가 아니라 각 점의 이웃을 기준으로 한 상대 밀도를 보므로 밀도가 서로 다른 여러 덩어리가 섞인 데이터에서도 각 덩어리의 기준으로 판정한다. 전역 임계값 하나로는 이 구분을 낼 수 없다. 참조할 이웃 수가 유일한 손잡이인데 작으면 노이즈 한 점에 휘둘리고 크면 국소성이라는 장점이 사라진다. 방법을 고를 때 물어야 할 것은 알고리즘 이름이 아니라 정상 영역이 어떤 모양인가다. 밀도가 불균일하면 LOF, 특성이 적고 정규분포에 가까우면 확률값을 그대로 쓸 수 있는 가우시안 모델이 낫다.
이 내용 다시 읽기 →●●●분석과 판단구조
Isolation Forest의 이상 점수다.
s(x) = 2^( -E[h(x)] / c(m) )
E[h(x)]는 트리들에서 잰 평균 경로 길이, c(m)은 표본 m개짜리 이진 탐색 트리에서 탐색이 실패할 때의 평균 경로 길이다.
c(m)으로 나누는 이유는 무엇인가?
트리마다 무작위 분할이 달라 경로 길이의 분산이 큰데 그 흔들림을 평균으로 눌러주기 위해서다.
흔들림을 줄이는 것은 트리를 여러 개 만들어 평균을 내는 단계가 담당한다. 이 나눗셈은 다른 일을 한다.
경로 길이가 정수라 연속값으로 바꾸어야 지수 함수에 넣을 수 있기 때문이다.
평균을 내는 순간 이미 연속값이고, 정수라도 지수 함수에 넣는 데 문제가 없다.
정답표본이 많아지면 트리가 자연히 깊어지므로 그 효과를 상쇄해 점수를 데이터 크기와 무관하게 만들기 위해서다.
정규화가 없으면 같은 정도로 고립된 점이라도 데이터가 클수록 큰 경로 길이를 갖는다. 나눠 주면 경로가 짧을수록 점수가 1에 가까워지는 해석이 데이터 크기와 상관없이 유지된다.
이상 점수를 확률로 해석할 수 있도록 전체 합을 1로 맞추기 위해서다.
점수의 합이 1이 되지 않고 확률도 아니다. 상대적인 고립 정도를 나타내는 값이다.
해설
Isolation Forest는 특성 하나를 무작위로 고르고 그 값 범위에서 분할 지점을 무작위로 잡는 일을 한 점만 남을 때까지 반복한다. 이상치는 다른 점들과 떨어져 있어 몇 번 자르지 않아도 혼자 남고, 밀집 지역의 점은 이웃을 떼어내느라 훨씬 많은 분할을 거친다. 한 트리의 결과는 무작위 분할에 좌우되므로 트리 여러 개의 평균 경로 길이를 쓴다. 그런데 표본이 많아지면 트리가 자연히 깊어져 경로 길이가 함께 커지므로, 같은 크기의 이진 탐색 트리에서 기대되는 평균 경로 길이로 나눠 그 효과를 상쇄한다. 그 결과 경로가 짧을수록 점수가 1에 가까워지는 해석이 데이터 크기와 무관하게 유지된다. 분포를 전혀 가정하지 않고 빠르며 파라미터가 적어 기준선으로 먼저 돌려보기 좋은 방법이다.
이 내용 다시 읽기 →