머신러닝 앙상블 모델 구현
1. 데이터 수집
각각의 요소에 대한 피처 값을 구한 뒤 csv 파일로 저장 이때, 마지막 열은 label 값이 지정된다.
2. 데이터 전처리 (Pre-processing)
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.ensemble import AdaBoostClassifier
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from sklearn.ensemble import VotingClassifier
import pickle
import pandas_profiling as pp # pip install pandas_profiling
import pandas as pd
import numpy as np
import random
import names # random name generator - pip install names
먼저 위 모듈들에 대한 임포트를 진행해준다.
df=pd.read_csv("CSV 파일명")
profile = pp.ProfileReport(df)
profile.to_file (outputfile = "./profiling.html")
판다스에서는 데이터에 대한 분석을 위해 프로파일링 기능을 제공해주는데, 해당 명령어를 통해서 그래프를 전시해주며 그래프 내 표현된 요소들 간의 관계에 있어 어떠한 속성이 주요 한지 판단할 수 있다. 또한, 특정 인풋값 하나만 속성이 1이고 그외 인풋값은 0이라면 그러한 속성은 의미가 없을 확률이 높다.
3. 학습
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.ensemble import AdaBoostClassifier
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from sklearn.ensemble import VotingClassifier
import pickle
import pandas_profiling as pp # pip install pandas_profiling
import pandas as pd
import numpy as np
import random
import names # random name generator - pip install names
먼저 위 모듈들에 대한 임포트를 진행해준다.
training_data=np.genfromtxt('pwf_dataset.csv',delimiter=',',\
dtype=np.int32)
#csv를 ,로 분리하여 int32로 읽어옴
print("Data Shape =",np.shape(training_data))
inputs=training_data[:,:-1]
outputs=training_data[:,-1]
csv 파일을 읽어들여 inputs (속성 값들)과 outputs(Label)로 분리한다.
train_input, test_input, train_output, test_output=\
train_test_split(inputs,outputs,test_size=0.3)
train_test_split을 할 시 읽어 들인 데이터 중 학습할 input과 테스트할 input 그리고 출력 output과 테스트할 output을 분리시킨다. 0.3이란 인자를 줄 시 70%는 input 데이터 30%는 output 데이터로 분리된다.
# RandomForest & GradientBoosting & AdaBoost
classifiers={}
classifiers1=RandomForestClassifier(n_estimators=500)
classifiers2=GradientBoostingClassifier(n_estimators=500)
classifiers3=AdaBoostClassifier(n_estimators=500)
eclf = VotingClassifier(estimators=[('lr', classifiers1), ('rf', classifiers2), ('gnb', classifiers3)],voting='soft',weights=[6,1,1])
eclf = eclf.fit(train_input,train_output)
모델을 생성 한 뒤 생성한 모델에 대해서 학습을 시킨다. 이때, 학습은 앙상블 함수를 활용한다.
predictions=eclf.predict(test_input)
학습된 결과를 측정하기 위해 test_input을 넣은 결과인 predictions(Y label) 값을 출력한다.
accuracy=100.0*accuracy_score(test_output,predictions)
print(accuracy)
학습한 결과에 test_input을 넣어 예측된 값이 test_output(정답지)와 같은지 확인한다.
4. 모델 저장
with open('pd_logistic.pkl','wb') as f:
pickle.dump(classifier,f)
#로컬에서 만들고 테스트
원하는 정확도가 나왔다면 모델을 저장한다.
5. 모델 불러오기
#로컬에서 만든것을 테스트 후 불러옴
with open('pd_logistic.pkl','rb') as f:
classifier=pickle.load(f)
모델을 불러와 학습할 필요 없이 바로 적용 시킬 수 있다.
참고자료
https://scikit-learn.org/stable/model_selection.html#model-selection
3. Model selection and evaluation — scikit-learn 0.21.3 documentation
scikit-learn.org
https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.VotingClassifier.html
'[프로젝트] > 머신러닝&딥러닝 악성코드 구분 모델' 카테고리의 다른 글
[프로젝트] 머신러닝 악성코드 feature 요소 (0) | 2019.08.30 |
---|