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

Similar to 스플렁크 머신러닝 연동

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 들여다보기지수 윤
 
파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)
파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)
파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)Tae Young Lee
 
R 프로그래밍을 이용한 야생동물 행동권(HR) 분석
R 프로그래밍을 이용한 야생동물 행동권(HR) 분석R 프로그래밍을 이용한 야생동물 행동권(HR) 분석
R 프로그래밍을 이용한 야생동물 행동권(HR) 분석Byeong-Hyeok Yu
 
2012 Ds B1 01
2012 Ds B1 012012 Ds B1 01
2012 Ds B1 01seonhyung
 
불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 명신 김
 

Similar to 스플렁크 머신러닝 연동 (20)

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 들여다보기
 
Rdatamining
Rdatamining Rdatamining
Rdatamining
 
파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)
파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)
파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)
 
R 프로그래밍을 이용한 야생동물 행동권(HR) 분석
R 프로그래밍을 이용한 야생동물 행동권(HR) 분석R 프로그래밍을 이용한 야생동물 행동권(HR) 분석
R 프로그래밍을 이용한 야생동물 행동권(HR) 분석
 
2012 Ds B1 01
2012 Ds B1 012012 Ds B1 01
2012 Ds B1 01
 
파이썬 데이터 분석 (18년)
파이썬 데이터 분석 (18년)파이썬 데이터 분석 (18년)
파이썬 데이터 분석 (18년)
 
불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14
 

More from Seung-Woo Kang

[도서 리뷰] 디스럽트(Disrupt)
[도서 리뷰] 디스럽트(Disrupt)[도서 리뷰] 디스럽트(Disrupt)
[도서 리뷰] 디스럽트(Disrupt)Seung-Woo Kang
 
[도서 리뷰] 인센티브와 무임승차
[도서 리뷰] 인센티브와 무임승차[도서 리뷰] 인센티브와 무임승차
[도서 리뷰] 인센티브와 무임승차Seung-Woo Kang
 
[도서 리뷰] 왜 지금 핀테크인가?
[도서 리뷰] 왜 지금 핀테크인가?[도서 리뷰] 왜 지금 핀테크인가?
[도서 리뷰] 왜 지금 핀테크인가?Seung-Woo Kang
 
[도서 리뷰] 헤드 퍼스트 데이터 분석 ( Head First Data Analysis )
[도서 리뷰]  헤드 퍼스트 데이터 분석 ( Head First Data Analysis )[도서 리뷰]  헤드 퍼스트 데이터 분석 ( Head First Data Analysis )
[도서 리뷰] 헤드 퍼스트 데이터 분석 ( Head First Data Analysis )Seung-Woo Kang
 
[도서 리뷰] 어떻게 돌파할 것인가
[도서 리뷰] 어떻게 돌파할 것인가[도서 리뷰] 어떻게 돌파할 것인가
[도서 리뷰] 어떻게 돌파할 것인가Seung-Woo Kang
 
[도서 리뷰] 이나모리 가즈오의 회계경영
[도서 리뷰] 이나모리 가즈오의 회계경영[도서 리뷰] 이나모리 가즈오의 회계경영
[도서 리뷰] 이나모리 가즈오의 회계경영Seung-Woo Kang
 
차이의 붕괴(Collapse of Distinction) - 도서 요약
차이의 붕괴(Collapse of Distinction) - 도서 요약차이의 붕괴(Collapse of Distinction) - 도서 요약
차이의 붕괴(Collapse of Distinction) - 도서 요약Seung-Woo Kang
 
일본 기업은 AI를 어떻게 활용하고 있을까(도서 정리)
일본 기업은 AI를 어떻게 활용하고 있을까(도서 정리)일본 기업은 AI를 어떻게 활용하고 있을까(도서 정리)
일본 기업은 AI를 어떻게 활용하고 있을까(도서 정리)Seung-Woo Kang
 
소음과 투자 (도서 요약)
소음과 투자 (도서 요약)소음과 투자 (도서 요약)
소음과 투자 (도서 요약)Seung-Woo Kang
 
피케티의 21세기 자본론(도서요약)
피케티의 21세기 자본론(도서요약)피케티의 21세기 자본론(도서요약)
피케티의 21세기 자본론(도서요약)Seung-Woo Kang
 
현명한 초보 투자자(도서 요약)
현명한 초보 투자자(도서 요약)현명한 초보 투자자(도서 요약)
현명한 초보 투자자(도서 요약)Seung-Woo Kang
 
세상에서 가장 쉬운 회계학 입문(도서 요약)
세상에서 가장 쉬운 회계학 입문(도서 요약)세상에서 가장 쉬운 회계학 입문(도서 요약)
세상에서 가장 쉬운 회계학 입문(도서 요약)Seung-Woo Kang
 
확률을 높이는 확률
확률을 높이는 확률확률을 높이는 확률
확률을 높이는 확률Seung-Woo Kang
 
캐리커처 생성기 테스트
캐리커처 생성기 테스트캐리커처 생성기 테스트
캐리커처 생성기 테스트Seung-Woo Kang
 
주가_변화시점탐지(Change point Detection)
주가_변화시점탐지(Change point Detection)주가_변화시점탐지(Change point Detection)
주가_변화시점탐지(Change point Detection)Seung-Woo Kang
 
시계열 분석의 이해와 활용
시계열 분석의 이해와 활용시계열 분석의 이해와 활용
시계열 분석의 이해와 활용Seung-Woo Kang
 
하이퍼레저 프로젝트 개요
하이퍼레저 프로젝트 개요하이퍼레저 프로젝트 개요
하이퍼레저 프로젝트 개요Seung-Woo Kang
 
Azure ml studio_fraud_detection
Azure ml studio_fraud_detectionAzure ml studio_fraud_detection
Azure ml studio_fraud_detectionSeung-Woo Kang
 
MS_QnA_Maker_챗봇만들기
MS_QnA_Maker_챗봇만들기MS_QnA_Maker_챗봇만들기
MS_QnA_Maker_챗봇만들기Seung-Woo Kang
 
통계의 힘 (스터디 자료)
통계의 힘 (스터디 자료)통계의 힘 (스터디 자료)
통계의 힘 (스터디 자료)Seung-Woo Kang
 

More from Seung-Woo Kang (20)

[도서 리뷰] 디스럽트(Disrupt)
[도서 리뷰] 디스럽트(Disrupt)[도서 리뷰] 디스럽트(Disrupt)
[도서 리뷰] 디스럽트(Disrupt)
 
[도서 리뷰] 인센티브와 무임승차
[도서 리뷰] 인센티브와 무임승차[도서 리뷰] 인센티브와 무임승차
[도서 리뷰] 인센티브와 무임승차
 
[도서 리뷰] 왜 지금 핀테크인가?
[도서 리뷰] 왜 지금 핀테크인가?[도서 리뷰] 왜 지금 핀테크인가?
[도서 리뷰] 왜 지금 핀테크인가?
 
[도서 리뷰] 헤드 퍼스트 데이터 분석 ( Head First Data Analysis )
[도서 리뷰]  헤드 퍼스트 데이터 분석 ( Head First Data Analysis )[도서 리뷰]  헤드 퍼스트 데이터 분석 ( Head First Data Analysis )
[도서 리뷰] 헤드 퍼스트 데이터 분석 ( Head First Data Analysis )
 
[도서 리뷰] 어떻게 돌파할 것인가
[도서 리뷰] 어떻게 돌파할 것인가[도서 리뷰] 어떻게 돌파할 것인가
[도서 리뷰] 어떻게 돌파할 것인가
 
[도서 리뷰] 이나모리 가즈오의 회계경영
[도서 리뷰] 이나모리 가즈오의 회계경영[도서 리뷰] 이나모리 가즈오의 회계경영
[도서 리뷰] 이나모리 가즈오의 회계경영
 
차이의 붕괴(Collapse of Distinction) - 도서 요약
차이의 붕괴(Collapse of Distinction) - 도서 요약차이의 붕괴(Collapse of Distinction) - 도서 요약
차이의 붕괴(Collapse of Distinction) - 도서 요약
 
일본 기업은 AI를 어떻게 활용하고 있을까(도서 정리)
일본 기업은 AI를 어떻게 활용하고 있을까(도서 정리)일본 기업은 AI를 어떻게 활용하고 있을까(도서 정리)
일본 기업은 AI를 어떻게 활용하고 있을까(도서 정리)
 
소음과 투자 (도서 요약)
소음과 투자 (도서 요약)소음과 투자 (도서 요약)
소음과 투자 (도서 요약)
 
피케티의 21세기 자본론(도서요약)
피케티의 21세기 자본론(도서요약)피케티의 21세기 자본론(도서요약)
피케티의 21세기 자본론(도서요약)
 
현명한 초보 투자자(도서 요약)
현명한 초보 투자자(도서 요약)현명한 초보 투자자(도서 요약)
현명한 초보 투자자(도서 요약)
 
세상에서 가장 쉬운 회계학 입문(도서 요약)
세상에서 가장 쉬운 회계학 입문(도서 요약)세상에서 가장 쉬운 회계학 입문(도서 요약)
세상에서 가장 쉬운 회계학 입문(도서 요약)
 
확률을 높이는 확률
확률을 높이는 확률확률을 높이는 확률
확률을 높이는 확률
 
캐리커처 생성기 테스트
캐리커처 생성기 테스트캐리커처 생성기 테스트
캐리커처 생성기 테스트
 
주가_변화시점탐지(Change point Detection)
주가_변화시점탐지(Change point Detection)주가_변화시점탐지(Change point Detection)
주가_변화시점탐지(Change point Detection)
 
시계열 분석의 이해와 활용
시계열 분석의 이해와 활용시계열 분석의 이해와 활용
시계열 분석의 이해와 활용
 
하이퍼레저 프로젝트 개요
하이퍼레저 프로젝트 개요하이퍼레저 프로젝트 개요
하이퍼레저 프로젝트 개요
 
Azure ml studio_fraud_detection
Azure ml studio_fraud_detectionAzure ml studio_fraud_detection
Azure ml studio_fraud_detection
 
MS_QnA_Maker_챗봇만들기
MS_QnA_Maker_챗봇만들기MS_QnA_Maker_챗봇만들기
MS_QnA_Maker_챗봇만들기
 
통계의 힘 (스터디 자료)
통계의 힘 (스터디 자료)통계의 힘 (스터디 자료)
통계의 힘 (스터디 자료)
 

스플렁크 머신러닝 연동

  • 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