2016-11-16 1 views
0

Spark 및 MLLib를 사용한 클러스터링 연습에 사용했던 많은 네트워크 데이터 집합이 있습니다. 나는 하루 중 시간, 방향 (네트워크 안팎), 보낸 바이트 수, 수신 바이트 수 및 각 연결 기간을 나타내는 벡터 집합으로 데이터를 정규화했습니다. 총 7 개의 차원이 있습니다.네트워크 비정상 탐지를위한 Spark MLLib 클러스터링 (K-Means) 사용

KMeans를 사용하면이 데이터로 모델을 작성하기가 쉽습니다. 이 모델을 사용하여 각 입력 벡터가 "분류"되고 거리가 가장 가까운 중심으로 계산됩니다. 마지막으로 RDD (거리에 태그가 붙음)가 거리별로 정렬되고 가장 극단 값이 추출됩니다.

내 데이터의 입력 열 중 하나는 연결 uuid (고유 한 영숫자 식별자)입니다. 이 데이터를 모델을 통해 전달하고 싶습니다 (각 입력 벡터에 고유 한 태그를 남겨 둡니다). 그러나이 열을 플로트로 변환 할 수없는 경우 예외가 트리거됩니다.

여기에있는 질문은 : "어떻게 가장 효율적으로 원래의 입력 데이터로 아웃 라이어를 묶을 수 있습니까?" 입력 데이터는 크게 정규화되어 원래 입력과 유사하지 않습니다. 또한 원본 및 대상 IP 주소가 손실되었습니다. KMeans에서 모델 작성시 고려해야 할 열 (또는 반대로 무시)을 알려주는 인터페이스는 없습니다.

def get_distance(clusters): 
    def _distance_map(record): 
     cluster = clusters.predict(record) 
     centroid = clusters.clusterCenters[cluster] 
     dist = np.linalg.norm(np.array(record) - np.array(centroid)) 
     return (dist, record) 
    return _distance_map 

def parseMap(row): 
    # parses rows of data out of the input strings 

def conMap(row): 
    # normalizes the values to be used in building the model 

rdd = sc.textFile('/data2/network/201610').filter(lambda r: r[0] != '#') 
tcp = rdd.map(parseMap).filter(lambda r: r['proto'] == 'tcp') 
cons = tcp.map(conMap) # this normalizes connection data 

model = KMeans.train(cons, (24 * 7), maxIterations=25, 
        runs=1, initializationMode = "random") 

data_distance = cons.map(get_distance(model)).sortByKey(ascending=False) 
print(data_distance.take(10)) 

답변

0

K-수단 때문에 이상치에 민감 변칙적 인 데이터가 종종 혼자 클러스터에 끝나는 것을 의미한다 :

내 코드는 다음과 같이 보입니다.

이상 값을 캡처 한 클러스터를 찾아 해당 포인트를 필터링하려면 키 (클러스터)로 데이터 포인트를 계산해야합니다.

관련 문제