SlideShare a Scribd company logo
1 of 47
Download to read offline
2018년 06월
스플렁크 머신러닝 연동
( Splunk + R/Python )
타임게이트 연구소
Agenda
• 개요
1) 머신 러닝 (Machine Learning)과 테스트 데이터(Kaggle)
• 스플렁크(Splunk)와 R 연동
1) 네트워크 침입(Network Intrusion) 탐지 데이터
2) R 모델 훈련 및 저장
3) 스플렁크(Splunk)와 R 연동
• 스플렁크(Splunk)와 파이썬(Python) 연동
1) 자전거 렌탈(Bike Rental) 예측 데이터
2) 스플렁크(Splunk) 머신러닝 툴킷(Splunk MLTK – Machine Learning Toolkit)
3) 모델 훈련, 저장 및 예측
• 요약
개요
머신러닝 (Machine Learning)과 테스트 데이터(Kaggle)
기계학습
기계학습(Machine Learning)
패턴・규칙・관계 등과 같은 특징을 추출하여 규칙을 생성
기계학습(Machine Learning)
패턴・규칙・관계 등과 같은 특징을 추출하여 규칙을 생성
기계기계 사람사람 교통교통 자동차자동차 정보 시스템정보 시스템의료의료
검색검색 분류분류 판별판별 감지감지 예측예측
추론추론 판단판단최적화최적화
의사결정의사결정 기기 제어기기 제어어드바이스어드바이스
예측 모델링
- 예측 모델 : 예측하고자 하는 일이 발생할 가능성을 예측 점수로 산출
캐글(Kaggle) – 데이터분석 경쟁, 2010설립, 2017년 Google 인수
발췌 : https://www.kaggle.com/competitions
Splunk와 분석툴(R, Python) 연동
Splunk와 R 연동
네트워크 침입(Network Intrusion) 탐지
네트워크 침입탐지 – 비정상적인 활동 감지
발췌 : https://www.kaggle.com/what0919/intrusion-detection
네트워크 침입탐지 – 비정상적인 활동 감지
발췌 : https://www.kaggle.com/what0919/intrusion-detection
공격유형
• normal
• dos
• Probe
• R2l
• u2r
4가지 공격 유형
• Probe :
– 실제 공격을 시도하기 전 시스템의 사전자료(포트 등)를 수집 : port scanning
• DoS : Denial of Service.
– 서비스 거부 공격 : SYN Flood
• U2R : User to Root.
– 관리자(root) 권한을 얻으려 시도하는 패킷 : 버퍼 오버플로우 (Buffer Overflow)
• R2L : Remote to Local.
– 권한 없는 사용자가 외부에서 접근 시도하는 패킷 : 암호추측
구성도
스플렁크
(Splunk)
Splunk R Analytics App – OpenCPU 기반 R 연동
발췌 : https://splunkbase.splunk.com/app/3339/#/details
OpenCPU – R 연동을 위한 API
발췌 : https://www.opencpu.org
R 모델 훈련 및 저장 – R 서버 스크립트
########### 4가지 공격유형
# DOS : 서비스 거부 ==> syn flood
# R2L : 원격에서 무단 access ==> 암호추측
# U2R : 로컬 슈퍼유저 권한 access ==> 다양한 버퍼 overflow 공격
# probe : 감시 및 기타 probing ==> 포트 스캐닝
library(dplyr)
library(ggplot2)
library(randomForest)
##### 데이터 로딩
train_data <- read.csv("Train_data.csv")
test_data <- read.csv("test_data.csv")
#### 입력 선택 및 훈련(RandomForest)
fea <- train_data %>% select(-xAttack)
trained_model <- randomForest(fea, train_data$xAttack, ntree=200,
importance=T)
trained_model
importance(trained_model)
summary(trained_model)
######### 훈련된 Model 저장
saveRDS(trained_model,file="trained_model_200")
################ feature 중요도 Grapth
imp <- importance(trained_model, type=1)
featureImportance <- data.frame(Feature=row.names(imp),
Importance=imp[,1])
ggplot(featureImportance, aes(x=reorder(Feature, Importance),
y=Importance)) +
geom_bar(stat="identity", fill="#53cfff") +
coord_flip() +
theme_light(base_size=20) +
xlab("") +
ylab("Importance") +
ggtitle("Random Forest Feature Importancen") +
theme(plot.title=element_text(size=18))
######### 저장된 모델을 불러와 예측
read_model <- readRDS(file="trained_model_200")
test_fea <- test_data %>% select(-xAttack)
test_data$predict <- predict(read_model,test_fea)
###### 예측된 결과 평가
mean( test_data$xAttack == test_data$predict)
test_data %>%
ggplot(aes(x=xAttack, y=predict, color=xAttack)) +
geom_point(position="jitter")
R 모델 훈련 및 저장 – 훈련 결과
R 모델 훈련 및 저장 – 훈련 결과
R 모델 훈련 및 저장 – 테스트 데이터
75% 정확도
Splunk 연동 – R 서버 스크립트
OpenCPU 실행
스크립트
OpenCPU 수행 결과
5656 Port 대기중
Splunk 연동 – Splunk 스크립트
| inputlookup test_data.csv | runrdo script="
library(dplyr);
library(ggplot2);
library(randomForest);
test_data <-data.frame(dataset);
test_data$xAttack <- as.factor(test_data$xAttack);
test_data$protocol_type <- as.factor(test_data$protocol_type);
read_model <- readRDS(file='c:temptrained_model_50');
fea <- test_data %>% select(-xAttack);
test_predict <- data.frame(xAttack = test_data$xAttack);
test_predict$predict <- predict(read_model,fea);
print(table(test_predict));
accuracy <- mean( test_predict$xAttack == test_predict$predict);
# print('Correct Answers = ');
# print(accuracy);
# test_predict %>% ggplot(aes(x=xAttack, y=predict, color=xAttack)) +
geom_point(position='jitter');
return(as.data.frame(test_predict));
" getResults=t | chart count over predict by xAttack
Splunk 연동 – Splunk 스크립트
Splunk 연동 – 수행결과
Splunk 연동 – 수행결과
Splunk와 파이썬(Python) 연동
자전거 렌탈(Bike Rental) 예측
자전거 대여 데이터 – Washington D.C 데이터
발췌 : https://www.kaggle.com/c/bike-sharing-demand/data
자전거 대여 데이터 – Washington D.C 데이터
발췌 : https://www.kaggle.com/c/bike-sharing-demand/data
Splunk ML Toolkit App – Python SciKit 기반 ML
발췌 : https://splunkbase.splunk.com/app/2890/#/overview
Splunk ML Toolkit App – App 화면
Splunk ML Toolkit App – App 화면
모델 생성, 훈련, 저장 가능
Splunk ML Toolkit App – App 화면
Splunk ML Toolkit App – 모델 생성 및 훈련
알고리즘, 예측할 값, 입력 값,
데이터분할 비율 선택
훈련시작 (fit)
Splunk ML Toolkit App – 훈련 결과
예측
기여도
모델 적합도
(28% → 너무낮음)
예측값이 벗어나는 정도
(표준 에러)
정확도 향상을 위한 탐색 및 전처리 – R 스크립트(1)
library(dplyr)
library(ggplot2)
library(randomForest)
library(readr)
library(gridExtra)
############## Bike Rentals Model Training
########### 1'st 날짜를 그냥 통채로...
df_train = read_csv("BikeRentals_train.csv")
### _date를 time 으로 변경
names(df_train)[1] <- c("time")
fea_1 <- df_train %>% select(-count, -casual, -registered)
trained_1 <- randomForest(fea_1, df_train$count, ntree=200, importance=T)
trained_1
importance(trained_1)
summary(trained_1)
############## Bike Rentals Model Training
#################### 2'nd 날짜를 쪼갠다.....
df_train_2 <- df_train
### _date 를 Year, Month, Date, Hour로 쪼개서 저장..
### month와 hour만 필요할 듯....
df_train_2$year <- format(as.POSIXct(my_date$time), "%Y")
df_train_2$month <- format(as.POSIXct(my_date$time), "%m")
df_train_2$day <- format(as.POSIXct(my_date$time), "%d")
df_train_2$hour <- format(as.POSIXct(my_date$time), "%H")
### month, date, hour 추가하여 RandomForest ..
###
fea_2 <- df_train_2 %>% select(-count, -casual, -registered, -year, -time, -holiday)
trained_2 <- randomForest(fea_2, df_train_2$count, ntree=200, importance=T)
trained_2
importance(trained_2)
summary(trained_2)
############## Bike Rentals Model Training
########### 3'rd working day와 not working day로 시간 분리.
### working day : 0 ~ 24, no working day : 24~48..
df_train_3 <- df_train_2
p1 <- df_train_3 %>% filter( workingday == 1 ) %>%
ggplot(aes(x=hour, y= count)) +
geom_point(color="green", position="jitter") +
geom_boxplot(color="red", fill="transparent")
p2 <- df_train_3 %>% filter( workingday == 0 & holiday == 0 ) %>%
ggplot(aes(x=hour, y= count)) +
geom_point(color="green", position="jitter") +
geom_boxplot(color="red", fill="transparent")
p3 <- df_train_3 %>% filter( holiday == 1 ) %>%
ggplot(aes(x=hour, y= count)) +
geom_point(color="green", position="jitter") +
geom_boxplot(color="red", fill="transparent")
grid.arrange(p1,p2,p3)
#### 새로운 시간 생성 : new_hour = (1-workingday)*24 + hour
df_train_3$new_hour <- as.numeric(df_train_3$hour) + 24*(1-df_train_3$workingday)
### hour와, workingday를 빼고...new_hour로 RandomForest ..
###
fea_3 <- df_train_3 %>% select(-count, -casual, -registered, -year, -time, -holiday, -hour, -workingday)
trained_3 <- randomForest(fea_3, df_train_3$count, ntree=200, importance=T)
trained_3
importance(trained_3)
summary(trained_3)
정확도 향상을 위한 탐색 및 전처리 – R 스크립트(2)
######### 시각화
df_train_3 %>%
ggplot(aes(x=as.factor(new_hour), y= count)) +
geom_point(color="green", position="jitter") +
geom_boxplot(color="red", fill="transparent", outlier.color = "blue")
df_train_31 <- df_train_3
df_train_31$predicted <- trained_3$predicted
df_train_31$predicted
df_train_31 %>%
ggplot(aes(x=as.factor(new_hour), y= count)) +
geom_point(color="green", position="jitter") +
geom_boxplot(aes(y=predicted),color="red", fill="transparent")
write_csv(df_train_31,"BikeRentals_t31.csv")
########################################
########## 결과 비교
print(trained_1)
print(trained_2)
print(trained_3)
####--- imp_1
df_imp_1 <- as.data.frame(importance(trained_1))
df_imp_1$cols <- c( factors = rownames(importance(trained_1)) )
as.integer(df_imp_1$`%IncMSE`)
names(df_imp_1)[1] <- c("percent")
pi_1 <- df_imp_1 %>% ggplot(aes(reorder(x=cols, percent), y=percent, fill=cols)) +
geom_bar(stat="identity") +
geom_text(aes(y=percent+5,label=round(percent,1)))
####--- imp_2
df_imp_2 <- as.data.frame(importance(trained_2))
df_imp_2$cols <- c( factors = rownames(importance(trained_2)) )
as.integer(df_imp_2$`%IncMSE`)
names(df_imp_2)[1] <- c("percent")
pi_2 <- df_imp_2 %>% ggplot(aes(reorder(x=cols, percent), y=percent, fill=cols)) +
geom_bar(stat="identity") +
geom_text(aes(y=percent+5,label=round(percent,1)))
####--- imp_3
df_imp_3 <- as.data.frame(importance(trained_3))
df_imp_3$cols <- c( factors = rownames(importance(trained_3)) )
as.integer(df_imp_3$`%IncMSE`)
names(df_imp_3)[1] <- c("percent")
pi_3 <- df_imp_3 %>% ggplot(aes(reorder(x=cols, percent), y=percent, fill=cols)) +
geom_bar(stat="identity") +
geom_text(aes(y=percent+5,label=round(percent,1)))
grid.arrange(pi_1, pi_2, pi_3)xAttack
데이터 탐색 (시각화) – 시간에 따른 변화, 휴일과 평일이 구분됨
workingday
!workingday & !holiday
holiday
R 스크립트 수행 결과(1) – 52% 정확도 (tree 수를 200개로 늘림)
R2 = 0.523
RMSE = sqrt(15651.8) = 125.1
R 스크립트 수행 결과(2) – 85% 정확도 (날짜에서 시간을 뽑아내서 입력값으로 사용)
R2 = 0.8511
RMSE = sqrt(4886) = 69.9
R 스크립트 수행 결과(3) – 86% 정확도 (휴일 시간을 24~48시로 변환  new_hour)
R2 = 0.8604
RMSE = sqrt(4581) = 67.7
Splunk ML Toolkit App – 모델 생성 및 훈련 (2nd)
time 대신
new_hour 입력
훈련시작 (fit)
Splunk ML Toolkit App – 훈련 결과 (2nd)
모델 적합도
(86.3%)
예측값이 벗어나는 정도
(표준 에러)
예측
기여도
Splunk ML Toolkit App – 훈련된 모델을 ‘Model_BikeRentals’ 로저장
저장할 이름
(Model_BikeRentals)
SPL 확인
Splunk ML Toolkit App – 저장된 모델 확인하고 전역에서 사용 가능하도록 변경
저장된 모델
(Model_BikeRentals)
모델 공유범위
Splunk ML Toolkit App – 저장된 모델 적용 (0~24 : 평일, 24~48 : 휴일)
저장된 모델 적용
(apply)
요약
Splunk와 ML 툴 연동
• R연동 – API 호출 방식
• Python 연동 – 라이브러리 호출 방식
• 훈련(fit) 과정 vs 적용(apply) 과정
– 개발/테스트 환경에서 훈련 및 최적화된 모델을 저장
– 운영환경에서 저장된 모델 적용
• 훈련 데이터 선택과 전처리(Pre-Processing)
– 결측 데이터, 형식 변환, 데이터 분할, 1차 가공 필요
– 연관성 확인을 위한 탐색 및 논리적 추론, 검증 필요
참고자료
• 스플렁크 머신러닝 툴킷 (ML Toolkit)
– https://splunkbase.splunk.com/app/2890/
– https://splunkbase.splunk.com/app/2881/ ∼ /2884
• 스플렁크 R Analytics
– https://splunkbase.splunk.com/app/3339/
Address
서울특별시 성동구 아차산로 17
11층 (성수동 1가, 서울숲엘타워)
우편번호 04789
Telephone
Tel : (02)575-0409
Fax: (02)6003-1987

More Related Content

What's hot

문과생 대상 파이썬을 활용한 데이터 분석 강의
문과생 대상 파이썬을 활용한 데이터 분석 강의문과생 대상 파이썬을 활용한 데이터 분석 강의
문과생 대상 파이썬을 활용한 데이터 분석 강의Kwangyoun Jung
 
HR Analytics - 퇴직가능성예측모델
HR Analytics - 퇴직가능성예측모델HR Analytics - 퇴직가능성예측모델
HR Analytics - 퇴직가능성예측모델Seong-Bok Lee
 
PYCON 2017 발표자료 한성준
PYCON 2017 발표자료 한성준PYCON 2017 발표자료 한성준
PYCON 2017 발표자료 한성준sungjun han
 
Python 활용: 이미지 처리와 데이터 분석
Python 활용: 이미지 처리와 데이터 분석Python 활용: 이미지 처리와 데이터 분석
Python 활용: 이미지 처리와 데이터 분석용 최
 
파이썬 라이브러리로 쉽게 시작하는 데이터 분석
파이썬 라이브러리로 쉽게 시작하는 데이터 분석파이썬 라이브러리로 쉽게 시작하는 데이터 분석
파이썬 라이브러리로 쉽게 시작하는 데이터 분석Heekyung Yoon
 

What's hot (8)

문과생 대상 파이썬을 활용한 데이터 분석 강의
문과생 대상 파이썬을 활용한 데이터 분석 강의문과생 대상 파이썬을 활용한 데이터 분석 강의
문과생 대상 파이썬을 활용한 데이터 분석 강의
 
파이썬 데이터 분석 (18년)
파이썬 데이터 분석 (18년)파이썬 데이터 분석 (18년)
파이썬 데이터 분석 (18년)
 
Python - Module
Python - ModulePython - Module
Python - Module
 
HR Analytics - 퇴직가능성예측모델
HR Analytics - 퇴직가능성예측모델HR Analytics - 퇴직가능성예측모델
HR Analytics - 퇴직가능성예측모델
 
파이썬으로 익히는 딥러닝
파이썬으로 익히는 딥러닝파이썬으로 익히는 딥러닝
파이썬으로 익히는 딥러닝
 
PYCON 2017 발표자료 한성준
PYCON 2017 발표자료 한성준PYCON 2017 발표자료 한성준
PYCON 2017 발표자료 한성준
 
Python 활용: 이미지 처리와 데이터 분석
Python 활용: 이미지 처리와 데이터 분석Python 활용: 이미지 처리와 데이터 분석
Python 활용: 이미지 처리와 데이터 분석
 
파이썬 라이브러리로 쉽게 시작하는 데이터 분석
파이썬 라이브러리로 쉽게 시작하는 데이터 분석파이썬 라이브러리로 쉽게 시작하는 데이터 분석
파이썬 라이브러리로 쉽게 시작하는 데이터 분석
 

Similar to 스플렁크 Machine Learning Integration

파이썬 스터디 2주차
파이썬 스터디 2주차파이썬 스터디 2주차
파이썬 스터디 2주차Han Sung Kim
 
TABLE ACCESS 패턴을 이용한 SQL 튜닝_Wh oracle
TABLE ACCESS 패턴을 이용한 SQL 튜닝_Wh oracleTABLE ACCESS 패턴을 이용한 SQL 튜닝_Wh oracle
TABLE ACCESS 패턴을 이용한 SQL 튜닝_Wh oracle엑셈
 
Python machine learning Ch.4
Python machine learning Ch.4Python machine learning Ch.4
Python machine learning Ch.4PartPrime
 
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013Esun Kim
 
DEVIEW-FULL-감독판.pptx
DEVIEW-FULL-감독판.pptxDEVIEW-FULL-감독판.pptx
DEVIEW-FULL-감독판.pptxhanbeom Park
 
20150212 c++11 features used in crow
20150212 c++11 features used in crow20150212 c++11 features used in crow
20150212 c++11 features used in crowJaeseung Ha
 
R 프로그램의 이해와 활용 v1.1
R 프로그램의 이해와 활용 v1.1R 프로그램의 이해와 활용 v1.1
R 프로그램의 이해와 활용 v1.1happychallenge
 
Deview 2019 눈발자국
Deview 2019 눈발자국Deview 2019 눈발자국
Deview 2019 눈발자국hanbeom Park
 
KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613
KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613
KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613KTH, 케이티하이텔
 
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)JiandSon
 
R 스터디 세번째
R 스터디 세번째R 스터디 세번째
R 스터디 세번째Jaeseok Park
 
12. Application - Python + Pandas
12. Application - Python + Pandas12. Application - Python + Pandas
12. Application - Python + Pandasmerry7
 
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로Jaeseung Ha
 
함수형 사고 - Functional thinking
함수형 사고 - Functional thinking함수형 사고 - Functional thinking
함수형 사고 - Functional thinking재문 심
 
R 스터디 첫번째
R 스터디 첫번째R 스터디 첫번째
R 스터디 첫번째Jaeseok Park
 
Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기지수 윤
 

Similar to 스플렁크 Machine Learning Integration (20)

파이썬 스터디 2주차
파이썬 스터디 2주차파이썬 스터디 2주차
파이썬 스터디 2주차
 
TABLE ACCESS 패턴을 이용한 SQL 튜닝_Wh oracle
TABLE ACCESS 패턴을 이용한 SQL 튜닝_Wh oracleTABLE ACCESS 패턴을 이용한 SQL 튜닝_Wh oracle
TABLE ACCESS 패턴을 이용한 SQL 튜닝_Wh oracle
 
Python machine learning Ch.4
Python machine learning Ch.4Python machine learning Ch.4
Python machine learning Ch.4
 
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
 
DEVIEW-FULL-감독판.pptx
DEVIEW-FULL-감독판.pptxDEVIEW-FULL-감독판.pptx
DEVIEW-FULL-감독판.pptx
 
20150212 c++11 features used in crow
20150212 c++11 features used in crow20150212 c++11 features used in crow
20150212 c++11 features used in crow
 
R intro
R introR intro
R intro
 
R 프로그램의 이해와 활용 v1.1
R 프로그램의 이해와 활용 v1.1R 프로그램의 이해와 활용 v1.1
R 프로그램의 이해와 활용 v1.1
 
Deview 2019 눈발자국
Deview 2019 눈발자국Deview 2019 눈발자국
Deview 2019 눈발자국
 
KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613
KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613
KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613
 
R project_pt1
R project_pt1R project_pt1
R project_pt1
 
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
 
R 스터디 세번째
R 스터디 세번째R 스터디 세번째
R 스터디 세번째
 
12. Application - Python + Pandas
12. Application - Python + Pandas12. Application - Python + Pandas
12. Application - Python + Pandas
 
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
 
함수형 사고 - Functional thinking
함수형 사고 - Functional thinking함수형 사고 - Functional thinking
함수형 사고 - Functional thinking
 
자료구조05
자료구조05자료구조05
자료구조05
 
자료구조05
자료구조05자료구조05
자료구조05
 
R 스터디 첫번째
R 스터디 첫번째R 스터디 첫번째
R 스터디 첫번째
 
Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기
 

More from TIMEGATE

OpenSource License
OpenSource LicenseOpenSource License
OpenSource LicenseTIMEGATE
 
하이퍼레저 패브릭 실습자료
하이퍼레저 패브릭 실습자료하이퍼레저 패브릭 실습자료
하이퍼레저 패브릭 실습자료TIMEGATE
 
Ethereum 스마트 컨트랙트 보안
Ethereum 스마트 컨트랙트 보안Ethereum 스마트 컨트랙트 보안
Ethereum 스마트 컨트랙트 보안TIMEGATE
 
시계열분석의 이해
시계열분석의 이해시계열분석의 이해
시계열분석의 이해TIMEGATE
 
하이퍼레저 프로젝트 개요
하이퍼레저 프로젝트 개요하이퍼레저 프로젝트 개요
하이퍼레저 프로젝트 개요TIMEGATE
 
Azure ml studio_fraud_detection
Azure ml studio_fraud_detectionAzure ml studio_fraud_detection
Azure ml studio_fraud_detectionTIMEGATE
 
마이크로소프트 QnA Maker를 이용한 챗봇 만들기
마이크로소프트  QnA Maker를 이용한 챗봇 만들기마이크로소프트  QnA Maker를 이용한 챗봇 만들기
마이크로소프트 QnA Maker를 이용한 챗봇 만들기TIMEGATE
 
통계의 힘 (도서정리)
통계의 힘 (도서정리)통계의 힘 (도서정리)
통계의 힘 (도서정리)TIMEGATE
 

More from TIMEGATE (8)

OpenSource License
OpenSource LicenseOpenSource License
OpenSource License
 
하이퍼레저 패브릭 실습자료
하이퍼레저 패브릭 실습자료하이퍼레저 패브릭 실습자료
하이퍼레저 패브릭 실습자료
 
Ethereum 스마트 컨트랙트 보안
Ethereum 스마트 컨트랙트 보안Ethereum 스마트 컨트랙트 보안
Ethereum 스마트 컨트랙트 보안
 
시계열분석의 이해
시계열분석의 이해시계열분석의 이해
시계열분석의 이해
 
하이퍼레저 프로젝트 개요
하이퍼레저 프로젝트 개요하이퍼레저 프로젝트 개요
하이퍼레저 프로젝트 개요
 
Azure ml studio_fraud_detection
Azure ml studio_fraud_detectionAzure ml studio_fraud_detection
Azure ml studio_fraud_detection
 
마이크로소프트 QnA Maker를 이용한 챗봇 만들기
마이크로소프트  QnA Maker를 이용한 챗봇 만들기마이크로소프트  QnA Maker를 이용한 챗봇 만들기
마이크로소프트 QnA Maker를 이용한 챗봇 만들기
 
통계의 힘 (도서정리)
통계의 힘 (도서정리)통계의 힘 (도서정리)
통계의 힘 (도서정리)
 

스플렁크 Machine Learning Integration

  • 1. 2018년 06월 스플렁크 머신러닝 연동 ( Splunk + R/Python ) 타임게이트 연구소
  • 2. Agenda • 개요 1) 머신 러닝 (Machine Learning)과 테스트 데이터(Kaggle) • 스플렁크(Splunk)와 R 연동 1) 네트워크 침입(Network Intrusion) 탐지 데이터 2) R 모델 훈련 및 저장 3) 스플렁크(Splunk)와 R 연동 • 스플렁크(Splunk)와 파이썬(Python) 연동 1) 자전거 렌탈(Bike Rental) 예측 데이터 2) 스플렁크(Splunk) 머신러닝 툴킷(Splunk MLTK – Machine Learning Toolkit) 3) 모델 훈련, 저장 및 예측 • 요약
  • 3. 개요 머신러닝 (Machine Learning)과 테스트 데이터(Kaggle)
  • 4. 기계학습 기계학습(Machine Learning) 패턴・규칙・관계 등과 같은 특징을 추출하여 규칙을 생성 기계학습(Machine Learning) 패턴・규칙・관계 등과 같은 특징을 추출하여 규칙을 생성 기계기계 사람사람 교통교통 자동차자동차 정보 시스템정보 시스템의료의료 검색검색 분류분류 판별판별 감지감지 예측예측 추론추론 판단판단최적화최적화 의사결정의사결정 기기 제어기기 제어어드바이스어드바이스
  • 5. 예측 모델링 - 예측 모델 : 예측하고자 하는 일이 발생할 가능성을 예측 점수로 산출
  • 6. 캐글(Kaggle) – 데이터분석 경쟁, 2010설립, 2017년 Google 인수 발췌 : https://www.kaggle.com/competitions
  • 8. Splunk와 R 연동 네트워크 침입(Network Intrusion) 탐지
  • 9. 네트워크 침입탐지 – 비정상적인 활동 감지 발췌 : https://www.kaggle.com/what0919/intrusion-detection
  • 10. 네트워크 침입탐지 – 비정상적인 활동 감지 발췌 : https://www.kaggle.com/what0919/intrusion-detection 공격유형 • normal • dos • Probe • R2l • u2r
  • 11. 4가지 공격 유형 • Probe : – 실제 공격을 시도하기 전 시스템의 사전자료(포트 등)를 수집 : port scanning • DoS : Denial of Service. – 서비스 거부 공격 : SYN Flood • U2R : User to Root. – 관리자(root) 권한을 얻으려 시도하는 패킷 : 버퍼 오버플로우 (Buffer Overflow) • R2L : Remote to Local. – 권한 없는 사용자가 외부에서 접근 시도하는 패킷 : 암호추측
  • 13. Splunk R Analytics App – OpenCPU 기반 R 연동 발췌 : https://splunkbase.splunk.com/app/3339/#/details
  • 14. OpenCPU – R 연동을 위한 API 발췌 : https://www.opencpu.org
  • 15. R 모델 훈련 및 저장 – R 서버 스크립트 ########### 4가지 공격유형 # DOS : 서비스 거부 ==> syn flood # R2L : 원격에서 무단 access ==> 암호추측 # U2R : 로컬 슈퍼유저 권한 access ==> 다양한 버퍼 overflow 공격 # probe : 감시 및 기타 probing ==> 포트 스캐닝 library(dplyr) library(ggplot2) library(randomForest) ##### 데이터 로딩 train_data <- read.csv("Train_data.csv") test_data <- read.csv("test_data.csv") #### 입력 선택 및 훈련(RandomForest) fea <- train_data %>% select(-xAttack) trained_model <- randomForest(fea, train_data$xAttack, ntree=200, importance=T) trained_model importance(trained_model) summary(trained_model) ######### 훈련된 Model 저장 saveRDS(trained_model,file="trained_model_200") ################ feature 중요도 Grapth imp <- importance(trained_model, type=1) featureImportance <- data.frame(Feature=row.names(imp), Importance=imp[,1]) ggplot(featureImportance, aes(x=reorder(Feature, Importance), y=Importance)) + geom_bar(stat="identity", fill="#53cfff") + coord_flip() + theme_light(base_size=20) + xlab("") + ylab("Importance") + ggtitle("Random Forest Feature Importancen") + theme(plot.title=element_text(size=18)) ######### 저장된 모델을 불러와 예측 read_model <- readRDS(file="trained_model_200") test_fea <- test_data %>% select(-xAttack) test_data$predict <- predict(read_model,test_fea) ###### 예측된 결과 평가 mean( test_data$xAttack == test_data$predict) test_data %>% ggplot(aes(x=xAttack, y=predict, color=xAttack)) + geom_point(position="jitter")
  • 16. R 모델 훈련 및 저장 – 훈련 결과
  • 17. R 모델 훈련 및 저장 – 훈련 결과
  • 18. R 모델 훈련 및 저장 – 테스트 데이터 75% 정확도
  • 19. Splunk 연동 – R 서버 스크립트 OpenCPU 실행 스크립트 OpenCPU 수행 결과 5656 Port 대기중
  • 20. Splunk 연동 – Splunk 스크립트 | inputlookup test_data.csv | runrdo script=" library(dplyr); library(ggplot2); library(randomForest); test_data <-data.frame(dataset); test_data$xAttack <- as.factor(test_data$xAttack); test_data$protocol_type <- as.factor(test_data$protocol_type); read_model <- readRDS(file='c:temptrained_model_50'); fea <- test_data %>% select(-xAttack); test_predict <- data.frame(xAttack = test_data$xAttack); test_predict$predict <- predict(read_model,fea); print(table(test_predict)); accuracy <- mean( test_predict$xAttack == test_predict$predict); # print('Correct Answers = '); # print(accuracy); # test_predict %>% ggplot(aes(x=xAttack, y=predict, color=xAttack)) + geom_point(position='jitter'); return(as.data.frame(test_predict)); " getResults=t | chart count over predict by xAttack
  • 21. Splunk 연동 – Splunk 스크립트
  • 22. Splunk 연동 – 수행결과
  • 23. Splunk 연동 – 수행결과
  • 24. Splunk와 파이썬(Python) 연동 자전거 렌탈(Bike Rental) 예측
  • 25. 자전거 대여 데이터 – Washington D.C 데이터 발췌 : https://www.kaggle.com/c/bike-sharing-demand/data
  • 26. 자전거 대여 데이터 – Washington D.C 데이터 발췌 : https://www.kaggle.com/c/bike-sharing-demand/data
  • 27. Splunk ML Toolkit App – Python SciKit 기반 ML 발췌 : https://splunkbase.splunk.com/app/2890/#/overview
  • 28. Splunk ML Toolkit App – App 화면
  • 29. Splunk ML Toolkit App – App 화면 모델 생성, 훈련, 저장 가능
  • 30. Splunk ML Toolkit App – App 화면
  • 31. Splunk ML Toolkit App – 모델 생성 및 훈련 알고리즘, 예측할 값, 입력 값, 데이터분할 비율 선택 훈련시작 (fit)
  • 32. Splunk ML Toolkit App – 훈련 결과 예측 기여도 모델 적합도 (28% → 너무낮음) 예측값이 벗어나는 정도 (표준 에러)
  • 33. 정확도 향상을 위한 탐색 및 전처리 – R 스크립트(1) library(dplyr) library(ggplot2) library(randomForest) library(readr) library(gridExtra) ############## Bike Rentals Model Training ########### 1'st 날짜를 그냥 통채로... df_train = read_csv("BikeRentals_train.csv") ### _date를 time 으로 변경 names(df_train)[1] <- c("time") fea_1 <- df_train %>% select(-count, -casual, -registered) trained_1 <- randomForest(fea_1, df_train$count, ntree=200, importance=T) trained_1 importance(trained_1) summary(trained_1) ############## Bike Rentals Model Training #################### 2'nd 날짜를 쪼갠다..... df_train_2 <- df_train ### _date 를 Year, Month, Date, Hour로 쪼개서 저장.. ### month와 hour만 필요할 듯.... df_train_2$year <- format(as.POSIXct(my_date$time), "%Y") df_train_2$month <- format(as.POSIXct(my_date$time), "%m") df_train_2$day <- format(as.POSIXct(my_date$time), "%d") df_train_2$hour <- format(as.POSIXct(my_date$time), "%H") ### month, date, hour 추가하여 RandomForest .. ### fea_2 <- df_train_2 %>% select(-count, -casual, -registered, -year, -time, -holiday) trained_2 <- randomForest(fea_2, df_train_2$count, ntree=200, importance=T) trained_2 importance(trained_2) summary(trained_2) ############## Bike Rentals Model Training ########### 3'rd working day와 not working day로 시간 분리. ### working day : 0 ~ 24, no working day : 24~48.. df_train_3 <- df_train_2 p1 <- df_train_3 %>% filter( workingday == 1 ) %>% ggplot(aes(x=hour, y= count)) + geom_point(color="green", position="jitter") + geom_boxplot(color="red", fill="transparent") p2 <- df_train_3 %>% filter( workingday == 0 & holiday == 0 ) %>% ggplot(aes(x=hour, y= count)) + geom_point(color="green", position="jitter") + geom_boxplot(color="red", fill="transparent") p3 <- df_train_3 %>% filter( holiday == 1 ) %>% ggplot(aes(x=hour, y= count)) + geom_point(color="green", position="jitter") + geom_boxplot(color="red", fill="transparent") grid.arrange(p1,p2,p3) #### 새로운 시간 생성 : new_hour = (1-workingday)*24 + hour df_train_3$new_hour <- as.numeric(df_train_3$hour) + 24*(1-df_train_3$workingday) ### hour와, workingday를 빼고...new_hour로 RandomForest .. ### fea_3 <- df_train_3 %>% select(-count, -casual, -registered, -year, -time, -holiday, -hour, -workingday) trained_3 <- randomForest(fea_3, df_train_3$count, ntree=200, importance=T) trained_3 importance(trained_3) summary(trained_3)
  • 34. 정확도 향상을 위한 탐색 및 전처리 – R 스크립트(2) ######### 시각화 df_train_3 %>% ggplot(aes(x=as.factor(new_hour), y= count)) + geom_point(color="green", position="jitter") + geom_boxplot(color="red", fill="transparent", outlier.color = "blue") df_train_31 <- df_train_3 df_train_31$predicted <- trained_3$predicted df_train_31$predicted df_train_31 %>% ggplot(aes(x=as.factor(new_hour), y= count)) + geom_point(color="green", position="jitter") + geom_boxplot(aes(y=predicted),color="red", fill="transparent") write_csv(df_train_31,"BikeRentals_t31.csv") ######################################## ########## 결과 비교 print(trained_1) print(trained_2) print(trained_3) ####--- imp_1 df_imp_1 <- as.data.frame(importance(trained_1)) df_imp_1$cols <- c( factors = rownames(importance(trained_1)) ) as.integer(df_imp_1$`%IncMSE`) names(df_imp_1)[1] <- c("percent") pi_1 <- df_imp_1 %>% ggplot(aes(reorder(x=cols, percent), y=percent, fill=cols)) + geom_bar(stat="identity") + geom_text(aes(y=percent+5,label=round(percent,1))) ####--- imp_2 df_imp_2 <- as.data.frame(importance(trained_2)) df_imp_2$cols <- c( factors = rownames(importance(trained_2)) ) as.integer(df_imp_2$`%IncMSE`) names(df_imp_2)[1] <- c("percent") pi_2 <- df_imp_2 %>% ggplot(aes(reorder(x=cols, percent), y=percent, fill=cols)) + geom_bar(stat="identity") + geom_text(aes(y=percent+5,label=round(percent,1))) ####--- imp_3 df_imp_3 <- as.data.frame(importance(trained_3)) df_imp_3$cols <- c( factors = rownames(importance(trained_3)) ) as.integer(df_imp_3$`%IncMSE`) names(df_imp_3)[1] <- c("percent") pi_3 <- df_imp_3 %>% ggplot(aes(reorder(x=cols, percent), y=percent, fill=cols)) + geom_bar(stat="identity") + geom_text(aes(y=percent+5,label=round(percent,1))) grid.arrange(pi_1, pi_2, pi_3)xAttack
  • 35. 데이터 탐색 (시각화) – 시간에 따른 변화, 휴일과 평일이 구분됨 workingday !workingday & !holiday holiday
  • 36. R 스크립트 수행 결과(1) – 52% 정확도 (tree 수를 200개로 늘림) R2 = 0.523 RMSE = sqrt(15651.8) = 125.1
  • 37. R 스크립트 수행 결과(2) – 85% 정확도 (날짜에서 시간을 뽑아내서 입력값으로 사용) R2 = 0.8511 RMSE = sqrt(4886) = 69.9
  • 38. R 스크립트 수행 결과(3) – 86% 정확도 (휴일 시간을 24~48시로 변환  new_hour) R2 = 0.8604 RMSE = sqrt(4581) = 67.7
  • 39. Splunk ML Toolkit App – 모델 생성 및 훈련 (2nd) time 대신 new_hour 입력 훈련시작 (fit)
  • 40. Splunk ML Toolkit App – 훈련 결과 (2nd) 모델 적합도 (86.3%) 예측값이 벗어나는 정도 (표준 에러) 예측 기여도
  • 41. Splunk ML Toolkit App – 훈련된 모델을 ‘Model_BikeRentals’ 로저장 저장할 이름 (Model_BikeRentals) SPL 확인
  • 42. Splunk ML Toolkit App – 저장된 모델 확인하고 전역에서 사용 가능하도록 변경 저장된 모델 (Model_BikeRentals) 모델 공유범위
  • 43. Splunk ML Toolkit App – 저장된 모델 적용 (0~24 : 평일, 24~48 : 휴일) 저장된 모델 적용 (apply)
  • 45. Splunk와 ML 툴 연동 • R연동 – API 호출 방식 • Python 연동 – 라이브러리 호출 방식 • 훈련(fit) 과정 vs 적용(apply) 과정 – 개발/테스트 환경에서 훈련 및 최적화된 모델을 저장 – 운영환경에서 저장된 모델 적용 • 훈련 데이터 선택과 전처리(Pre-Processing) – 결측 데이터, 형식 변환, 데이터 분할, 1차 가공 필요 – 연관성 확인을 위한 탐색 및 논리적 추론, 검증 필요
  • 46. 참고자료 • 스플렁크 머신러닝 툴킷 (ML Toolkit) – https://splunkbase.splunk.com/app/2890/ – https://splunkbase.splunk.com/app/2881/ ∼ /2884 • 스플렁크 R Analytics – https://splunkbase.splunk.com/app/3339/
  • 47. Address 서울특별시 성동구 아차산로 17 11층 (성수동 1가, 서울숲엘타워) 우편번호 04789 Telephone Tel : (02)575-0409 Fax: (02)6003-1987