https://github.com/sosa-p/CPS-detector/blob/main/decision%20tree.ipynb
깃허브에서 전체 코드 확인 가능
Decision Tree를 분류 모델로 훈련 세트를 학습시켜서 테스트 세트에서 malware 여부를 판단하고, 잘 학습이 되었는지 정확도를 확인한다.
데이터 세트: top_1000_pe_imports.csv
본 데이터 세트는 malware와 goodware를 다양한 컬럼 속성으로 분석, 분류해 놓은 데이터 세트이다. 마지막 컬럼인 ‘malware’가 0이면 Goodware이고, 1이면 Malware이다.
나무 구조로 도표화하여 분류와 예측을 수행하는 분석방법이다. Decision Tree는 최종적인 결정에 도달하기 위해서 이진분류에 대한 질문을 이어나가면서 학습한다. 기본적인 학습 방향은 데이터를 나누는 과정을 반복하며 각 노드가 테스트 하나씩을 가진 이진 트리를 만들어 계층적으로 영역을 분할하여 데이터를 학습시킨다.
1) 데이터 세트를 읽어와서 47580 row와 1002 column을 확인
2) 각 파일 별 다른 값을 갖는 hash값과 목표 노드로 사용할 malware 컬럼을 drop
3) 전체 데이터 세트 중 훈련세트는 70%, 테스트 세트는 30%로 나눔
4) Decision Tree 모델을 적용하여 파라미터 값을 설정
5) 교차검증 적용
6) 예측값에 대한 정확도 계산
7) 학습한 모델 시각화
8) 학습에 사용한 칼럼에 대해 변수 중요도 계산
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 101)
from sklearn.tree import DecisionTreeClassifier
dtree = DecisionTreeClassifier(criterion = 'entropy', max_depth = 5, min_samples_split = 20)
from sklearn.model_selection import cross_val_score
score=cross_val_score(dtree, x_train, y_train, cv=5)
print('cross validation score : {:.3f}'.format(score.mean()))
일정한 하나의 테스트 셋으로 계속해서 평가를 진행하거나 하나의 훈련셋으로 학습을 진행하면 과적합이 쉽게 일어나기 때문에 K-Fold 교차검증을 적용한다. fold를 5개로 나누어서 다섯 개의 fold를 다르게 적용하여 테스트 셋으로 사용하여 모델에 대해 교차검증을 수행한다.
i = 1
mal =0
good =0
for each in predicties : #예측값이
if each == 1: #1이라면 malware
mal +=1
print("NO.%d is Malware." %(i))
else: #0이라면 goodware
good +=1
print("NO.%d is Goodware." %(i))
i+=1
예측값이 1이면 malware이고, 예측값이 1이 아니면 즉 0이면 goodware로 출력하도록 코드를 작성하였다.
각각 malware인지 goodware인지 출력한다.
테스트 세트의 전체 14275개 중에서 13978개가 malware로 분류되었고, 296개가 goodware로 분류되었다.
즉, 머신러닝 분류 모델의 성능 평가 지표가 전부 0.9 이상이 나왔으므로 본 학습 모델은 비교적 정확한 확률로 테스트 세트를 분류하였다고 볼 수 있다.
모델이 어떤 방식으로 분류되었는지 가지치기 과정을 시각화하여 살펴볼 수 있다.
Decision Tree의 학습이 마무리되면, 각 종속 변수 분류에 대해서 각각의 독립 변수가 어느 정도 기여를 했는지 나타내는 변수 중요도를 확인할 수 있다. 본 학습 모델에서는 1000개의 컬럼 중에 22개의 컬럼만 데이터 세트를 학습하는데 유의미하게 작용했다는 것을 알 수 있다.
Decision Tree는 지도 학습의 모델 중 하나로, 다양한 의사결정 경로와 결과를 나타내는 트리구조를 사용하여 이해하기 쉽고, 과정이 명백하다. 하지만, Decision Tree는 학습 데이터에 대한 최적의 트리를 찾기 힘들고, 새로운 데이터에 대한 일반화 성능이 좋지 않아 과적합되기 쉽다.
본 학습 모델에서는 과적합을 방지하기 위해서 다양한 파라미터 값을 적용하고, 교차 검증을 적용하였고, 최적의 학습모델을 구축하기 위해 변수들의 값을 지속적으로 변경하며 테스트하였다. 따라서, 1에 가까운 정확도를 갖는 높은 성능의 학습 모델을 구축할 수 있었다.