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))