반응형
이번에는 여러 분류 모델들을 결합하여 사용하는 앙상블기법 그중 하나인 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)) # 평균정확도
직접 작성한 예제로 앙상블 보팅에 관한 직접적인 이론적인 글들은 다른 사이트 및 학술지에 자세히 나와있으므로 생략했습니다.
반응형
'개발' 카테고리의 다른 글
sklearn 사이킷런 SVM모델 그래프 그리기 (margin, decision boundary) (0) | 2022.05.16 |
---|---|
(ETL) TALEND OPEN STUDIO를 설치해보자. (0) | 2022.05.12 |
파이썬 keras layers LSTM 간단한 예제 (0) | 2022.05.11 |
파이썬 DB연결 (pymssql - insert select update 예제) (0) | 2022.05.10 |
파이썬 TCP 통신 UDP 통신 예제 (소켓 프로그래밍) (0) | 2022.04.19 |
댓글