본문 바로가기
개발

파이썬 머신러닝 Ensemble voting 기법 예제(KNeigborsClassifier,DecisionTree,KFold,SVM)

by 화악 2022. 5. 11.
반응형

이번에는 여러 분류 모델들을 결합하여 사용하는 앙상블기법 그중 하나인 voting 방법에대해 예제로 간단히 설명 드리려고 합니다. 앙상블에 쓰인 모델들은 SVM,Kneighbors , decisiontree, Kfold의 모델을 사용하였고 역시나 사이킷런 라이브러리를 이용 하였습니다.

 

 

데이터 불러오기


def load_data(filename):  # 데이터 불러오기
    df = pd.read_csv("training_data.csv")
    X = df.loc[:, ["GR", "ILD_log10", "DeltaPHI", "PHIND", "NM_M", "RELPOS"]].values
    y = df.loc[:, "Facies"].values
    return X, y

역시나 데이터는 이번에도 Facies classification 예제입니다. csv파일을 읽어 입력데이터와 클래스를 정의해줍니다.

 

사이킷런 모델정의


knn = KNeighborsClassifier(n_neighbors=3)  # KNN모델 구성
dt = DecisionTreeClassifier(max_depth=3)  # 디시젼 트리 모델 구성
svm = SVC(C=0.1, gamma='auto', probability=True)  # SVC 모델을 구성
        
estimators = [('knn', knn), ('dt', dt), ('svm', svm)]  # 모델 집합

from sklearn.metrics import accuracy_score

for name, model in estimators:  # 모델집합 구성 하나씩 테스트

    model.fit(X_train, y_train)

    pred_train = model.predict(X_train)
    pred_test = model.predict(X_test)

    print(name + ":", accuracy_score(y_test, pred_test))

오늘쓰일 knn과 디시젼트리, svm 모델등을 사이킷런 라이브러리를 사용해 간단히 인자값만 넣고 정의 해줍니다. 그리고voting 할때 쓸 모델집합 변수를 하나 만들어주고 각모델 마다 학습 정확도를 체크합니다.

 

Ensemble voting


from sklearn.ensemble import VotingClassifier  # 앙상블 voting 모델 임포트

clf = VotingClassifier(estimators, voting="soft")  # voting hard soft 중 soft 선택

clf.fit(X_train, y_train)

pred_train = clf.predict(X_train)
pred_test = clf.predict(X_test)

acc_mean = []

print("vote:", accuracy_score(y_test, pred_test))

이제 각모델들의 학습정확도와 Ensemble voting기법의 모델과 비교해봅니다.  

 

K-fold 교차검증


kfold = KFold(n_splits=3)  # K-FOLD 기법으로 교차검증 시작
n_iter = 0
for train_idx, test_idx in kfold.split(X):
    X_train, X_test = X[train_idx], X[test_idx]  # index로 학습데이터 검증데이터 나눔

    y_train, y_test = y[train_idx], y[test_idx]  # index로 학습데이터 검증데이터 나눔

    # 학습을 진행하겠다면?
    clf.fit(X_train, y_train)  # voting 모델로 검증
    # 예측
    fold_pred = clf.predict(X_test)

    # 정확도 측정
    n_iter += 1
    accuracy = np.round(accuracy_score(y_test, fold_pred), 4)
    print('\n{} 교차검증  : {} , 학습 데이터 : {} , 검증 데이터 : {}'.format(n_iter, accuracy, X_train.shape[0],
                                                               X_test.shape[0]))

    acc_mean.append(accuracy)
print('\n')

print('\n 평균 정확도 :  ', np.mean(acc_mean))  # 평균정확도

마지막으로 정확한검증을 위해서 K-FOLD 교차검증을 시행합니다. 

 

전체 예제 코드


import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.model_selection import StratifiedKFold
from sklearn.svm import SVC
from sklearn.ensemble import VotingClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import KFold



def load_data(filename):  # 데이터 불러오기
    df = pd.read_csv("training_data.csv")
    X = df.loc[:, ["GR", "ILD_log10", "DeltaPHI", "PHIND", "NM_M", "RELPOS"]].values
    y = df.loc[:, "Facies"].values
    return X, y


knn = KNeighborsClassifier(n_neighbors=3)  # KNN모델 구성
dt = DecisionTreeClassifier(max_depth=3)  # 디시젼 트리 모델 구성
svm = SVC(C=0.1, gamma='auto', probability=True)  # SVC 모델을 구성

estimators = [('knn', knn), ('dt', dt), ('svm', svm)]  # 모델 집합




X, y = load_data(
    "training_data.csv") 
from sklearn.model_selection import train_test_split  # 각모델 성능평과를 위한 train test 밸류 나누기

X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y)

from sklearn.metrics import accuracy_score

for name, model in estimators:  # 모델집합 구성 하나씩 테스트

    model.fit(X_train, y_train)

    pred_train = model.predict(X_train)
    pred_test = model.predict(X_test)

    print(name + ":", accuracy_score(y_test, pred_test))

from sklearn.ensemble import VotingClassifier  # 앙상블 voting 모델 임포트

clf = VotingClassifier(estimators, voting="soft")  # voting hard soft 중 soft 선택

clf.fit(X_train, y_train)

pred_train = clf.predict(X_train)
pred_test = clf.predict(X_test)

acc_mean = []

print("vote:", accuracy_score(y_test, pred_test))
kfold = KFold(n_splits=3)  # K-FOLD 기법으로 교차검증 시작
n_iter = 0
for train_idx, test_idx in kfold.split(X):
    X_train, X_test = X[train_idx], X[test_idx]  # index로 학습데이터 검증데이터 나눔

    y_train, y_test = y[train_idx], y[test_idx]  # index로 학습데이터 검증데이터 나눔

    # 학습을 진행하겠다면?
    clf.fit(X_train, y_train)  # voting 모델로 검증
    # 예측
    fold_pred = clf.predict(X_test)

    # 정확도 측정
    n_iter += 1
    accuracy = np.round(accuracy_score(y_test, fold_pred), 4)
    print('\n{} 교차검증  : {} , 학습 데이터 : {} , 검증 데이터 : {}'.format(n_iter, accuracy, X_train.shape[0],
                                                               X_test.shape[0]))

    acc_mean.append(accuracy)
print('\n')

print('\n 평균 정확도 :  ', np.mean(acc_mean))  # 평균정확도

직접 작성한 예제로 앙상블 보팅에 관한 직접적인 이론적인 글들은 다른 사이트 및 학술지에 자세히 나와있으므로 생략했습니다. 

반응형

댓글