이 교육과정은 교육부 ‘성인학습자 역량 강화 교육콘텐츠 개발'사업의 일환으로써 교육부로부터 예산을 지원 받아 고려사이버대학교가 개발하여 운영하고 있습니다.
제공하는 강좌 및 학습에 따르는 모든 산출물의 적작권은 교육부, 한국교육학술정보원, 한국원격대학협의외와 고려사이버대학교가 공동 소유하고 있습니다.
작동 원리를 설명할 수 있다.
2 랜덤포레스트 알고리즘을 실제 데이터에 적용하여 머신러닝을 수행할 수 있다.
3 보팅 앙상블 기법을
실제 데이터에 적용하여 머신러닝을 수행할 수 있다.
1 앙상블 기법의 이해
2 앙상블 기법 활용 실습(1)
3 앙상블 기법 활용 실습(2)
해결하지?어떻게
해결할까?혼자 같이 해결할까?
INE LEARNING FOR PRACTICAL USE
어려운 문제가 생겼는데어떻게
해결하지?
해결할까?혼자
여러 사람이 같이 해결할까?
INE LEARNING FOR PRACTICAL USE
여러 개의 분류기를 생성하고, 그 예측을 결합하여
더욱 정확한 예측을 도출하는 기법
강력한 하나의 모델을 사용
약한 모델 여러 개를 조합하여 사용해 강한 모델 생성
출처 : https://www.flaticon.com/
MACHINE LEARNING FOR PRACTICAL USE
알고리즘의 안정성 및 정확성 향상을 위해 수행
부트스트랩(bootstrap)과 어그리게이팅(aggregating)을 합친 단어
대표적인 모델 : 랜덤포레스트(Random Forest) 샘플을여러 번 추출
모델을 학습
결과물을 집계
INE LEARNING FOR PRACTICAL USE
분류 모델을 여러 개 만들어서 서로 다른 학습 데이터로 학습 서로 다른 예측 값들을 투표를 통해 가장 높은 예측 값으로 결정
부트스트랩 어그리게이팅
분류기 분류기
…
분류기오리지널 데이터
부트스트랩 어그리게이팅
앙상블 분류기 배깅
MACHINE LEARNING FOR PRACTICAL USE
분류기 분류기
…
분류기오리지널 데이터
부트스트랩 어그리게이팅
앙상블 분류기 배깅
• 데이터를 약간 편향되도록 샘플링하는 기법
• 의사결정 트리처럼 과대적합되기 쉬운 모델을 앙상블할 때 많이 사용
INE LEARNING FOR PRACTICAL USE
부트스트랩 예시
전체 데이터 :
의사결정 트리 6개를 배깅할 경우
의사결정 트리1의 학습 데이터
1 2 3 4 5 6 7 8 9
1 2 3 4 5 1
의사결정 트리2의 학습 데이터
2 3 4 5 6 2
의사결정 트리3의 학습 데이터
3 4 5 6 7 3
의사결정 트리4의 학습 데이터
4 5 7
6 8 4
의사결정 트리5의 학습 데이터
5 6 8
7 9 5
의사결정 트리6의 학습 데이터
6 7 9
8 1 6
출처 : https://www.flaticon.com/
MACHINE LEARNING FOR PRACTICAL USE
부트스트랩
데이터 샘플링 시편향을 높임으로써 분산이 높은 모델의 과대적합 위험을 줄이는 효과를 가져옴
각 분류 모델은 총 N개의 데이터보다 적은 데이터로 학습하되,중복된 데이터를 허용함으로써 편향이 높은 학습 데이터로 학습
데이터 샘플링 크기는보통 전체 데이터의 60~70%를 사용
Low Variance high Variance
highBiasLowBias
INE LEARNING FOR PRACTICAL USE
어그리게이팅
어그리케이팅은 여러 분류 모델이 예측한 값들을 조합해서 하나의 결론을 도출하는 과정
결론은 투표(voting)를 통해 결정분류기 분류기
…
분류기오리지널 데이터
부트스트랩 어그리게이팅
앙상블 분류기 배깅
고양이 고양이 고양이 고양이 강아지
고양이 : 4 강아지 : 1
고양이
출처 : https://www.freepik.com/
MACHINE LEARNING FOR PRACTICAL USE
하드 보팅
배깅에 포함된 K개의 분류 모델에서 최대 득표를 받은 예측값으로 결론 도출INE LEARNING FOR PRACTICAL USE
하드 보팅
손글씨 숫자를 보고, 숫자를 1~9로 분류하는 의사결정 트리 6개를 학습한 후,숫자 7을 보여줬을 경우
다음과 같이 각각 분류했다고 가정
7 7 1 7 7 2
결과는그럼 7이군!
숫자 7이 가장 많네4표로
의사결정 트리1 7 의사결정 트리2 7 의사결정 트리3 1 의사결정 트리4 7 의사결정 트리5 7 의사결정 트리6 2
분류값 분류모델
숫자 7이 입력됐을 때 각 의사결정 트리의 분류값
출처 : https://www.flaticon.com
MACHINE LEARNING FOR PRACTICAL USE
소프트 보팅
소프트 보팅은 각 분류값별 확률을 합한 값을 점수로 사용해 최대 점수를 가진 분류값을 결론으로 도출의사결정 트리1 0.9 0.1 0 0 0 0 0 0 0 의사결정 트리2 0 0.8 0.1 0.1 0 0 0 0 0 의사결정 트리3 0 0 0.1 0 0 0 0.9 0 0 의사결정 트리4 0 0 0 0.1 0 0 0.9 0 0
의사결정 트리5 0 0 0 0 0 0 1 0 0
의사결정 트리6 0.4 0 0 0 0 0 0.6 0 0 분류모델
숫자 7이 입력됐을 때 각 의사결정 트리의 분류값 별 확률 1 2 3 4 5 6 7 8 9
INE LEARNING FOR PRACTICAL USE
소프트 보팅의 각 분류값별 점수 계산 1 0.9 + 0.4 1.3 2 0.1 + 0.8 0.9 3 0.1 + 0.1 0.2 4 0.1 + 0.1 0.2
5 0 0
6 0 0
7 0.9 + 0.9 + 1 + 0.6 3.4
8 0 0
9 0 0
확률 합
분류값 최종 점수
결과는그럼 7이군!
숫자 7의 3.4점으로점수가 가장 높네!
출처 : https://www.flaticon.com
MACHINE LEARNING FOR PRACTICAL USE
다수의 결정 트리들을 배깅해서 예측을 실행하는 앙상블 기법
각 노드에 주어진 데이터를 샘플링해서 일부 데이터를 제외한 채 최적의 특징을 찾아 트리를 분기
모델의 편향을 증가시켜 과대적합의 위험을 감소
다양한 분야에서 비교적 좋은 성능을 보여줌단일 의사결정 트리 랜덤 포레스트
Class 1
Class 1
Class 1 Class 1
Class 2
Class 1 Class 1 Class 2
Class 2 Class 1
INE LEARNING FOR PRACTICAL USE
배깅을 이용한 포레스트 구성
트리들이 서로 조금씩 다른 특성을 갖게 되어 일반화 성능을 향상할 수 있음…
출처 : 위키피디아
MACHINE LEARNING FOR PRACTICAL USE
출처 : 위키피디아
class P
class P
class P
…
…
class P
INE LEARNING FOR PRACTICAL USE
출처 : https://www.flaticon.com/
이전 분류기의 학습 결과를 바탕으로다음 분류기의 학습 데이터의 샘플 가중치를 조정하여 학습하는 방법
동일한 알고리즘의 분류기를 순차적으로 학습해서 여러 개의 분류기를 만든 후, 테스트할 때 가중 투표를 통해 예측값을 결정
대표적 모델 : XGBoost와 AdaBoost, GradientBoost병렬적 학습배깅: 부스팅:
순차적 학습
MACHINE LEARNING FOR PRACTICAL USE
분류기 오리지날 데이터
분류기 가중된 데이터
분류기 가중된 데이터
…
앙상블 분류기
부스팅 기법 이해하기
INE LEARNING FOR PRACTICAL USE
부스팅 기법 이해하기
트레이닝 데이터
샘플1 학습 알고리즘 가중치 업데이트
샘플2 학습 알고리즘 가중치 업데이트
샘플T-1 학습 알고리즘 가중치 업데이트
샘플T 학습 알고리즘
최종 결정 학습 데이터
분류기1 분류기2
분류기3 분류기4
…
MACHINE LEARNING FOR PRACTICAL USE
부스팅 예제
인물 사진 안에 있는 인물을 보고,남자 또는 여자로 분류하는 의사결정 트리를 부스팅
테스트 결과, 남자 분류가 미흡할 경우,남자 학습 데이터를 보강한 후 두 번째 의사결정 트리를 학습
두 번째 의사결정 트리의 테스트 결과에 따라학습 데이터를 보강해서 세 번째 의사결정 트리를 학습
출처 : https://www.freepik.com/, https://www.flaticon.com/
남자?여자?
INE LEARNING FOR PRACTICAL USE
가중 투표 하드 보팅
분류기의 성능에 따라 가중치를 반영하여 투표 결과를 조정정확도 0.4 0.5 0.95 세 분류기의 정확도
분류기1 분류기2 분류기3
분류값 남자 남자 여자
세 분류기의 분류값
분류기1 분류기2 분류기3
MACHINE LEARNING FOR PRACTICAL USE
가중 투표 하드 보팅
가중 투표는 다음과 같이 진행남자 = 0.4 + 0.5 여자 = 0.95
두 분류기가 남자라고 예측했음에도, 사진의 인물을 여자로 분류INE LEARNING FOR PRACTICAL USE
가중 투표 소프트 보팅
단일 예측값이 아닌 모든 분류값에 대한확률에 가중치를 곱한 값으로 최종 결론을 도출
분류값 남자 : 0.7 여자 : 0.3
남자 : 0.8 여자 : 0.2
남자 : 0.1 여자 : 0.9 소프트 보팅 계산법
분류기1 분류기2 분류기3
남자 : 0.4 * 0.7 + 0.5 * 0.8 + 0.95 * 0.1 = 0.775 여자 : 0.4 * 0.3 + 0.5 * 0.2 + 0.95 * 0.9 = 1.075
여자로분류!
DEEP LEARNING FOR PRACTICAL USE
INE LEARNING FOR PRACTICAL USE
출처 : 위키피디아
MNIST 손글씨 데이터셋을 학습시킨 후 분류 성능 비교
1 7 랜덤 포레스트 9
Class 1
Class 1 Class 1
Class 1 Class 1
INE LEARNING FOR PRACTICAL USE
랜덤 포레스트 주요 파라미터
모델에서 사용할 트리 개수
최적의 분할을 위해 고려할 피처의 최대 개수 트리의 최대 깊이
n_estimators max_features
max_depth min_samples_leaf min_samples_split
리프 노드가 되기 위한 최소 샘플 데이터 개수 자식 노드를 갖기 위한 최소한의 데이터 개수
MACHINE LEARNING FOR PRACTICAL USE
필요한 라이브러리 import
from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split from sklearn import tree
from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score
from sklearn.model_selection import GridSearchCV import matplotlib.pyplot as plt
import numpy as np import pandas as pd import seaborn as sns
INE LEARNING FOR PRACTICAL USE
데이터 로드 및 확인
mnist = fetch_openml('mnist_784') mnist_data = mnist.data[:10000]
mnist_target = mnist.target[:10000]
print(mnist_data)
print(mnist_data.shape) print(mnist_target)
print(mnist_target.shape)
:: 실행 결과
[[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]
...
[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]]
(10000, 784)
['5' '0' '4' ... '6' '9' '7']
(10000,)
MACHINE LEARNING FOR PRACTICAL USE
학습/테스트 데이터 나누기
X_train,X_test,y_train,y_test=train_test_split(mnist.data, mnist.target, test_size=0.2)
INE LEARNING FOR PRACTICAL USE
파라미터 없이 학습하기
dt_clf = tree.DecisionTreeClassifier() rf_clf = RandomForestClassifier() dt_clf.fit(X_train, y_train) rf_clf.fit(X_train, y_train) dt_pred = dt_clf.predict(X_test) rf_pred = rf_clf.predict(X_test)
accuracy_dt = accuracy_score(y_test, dt_pred) accuracy_rf = accuracy_score(y_test, rf_pred)
MACHINE LEARNING FOR PRACTICAL USE
파라미터 없이 학습하기
print('의사결정트리 예측 정확도: {0:.4f}'.format(accuracy_dt)) print('랜덤 포레스트 예측 정확도: {0:.4f}'.format(accuracy_rf))
:: 실행 결과
의사결정트리 예측 정확도: 0.7865 랜덤 포레스트 예측 정확도: 0.9435
INE LEARNING FOR PRACTICAL USE
모델 파라미터 확인 print(rf_clf)
:: 실행 결과
RandomForestClassifier(bootstrap=True, ccp_alpha=0.0, class_weight=None, criterion='gini', max_depth=None, max_features='auto', max_leaf_nodes=None, max_samples=None,
min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2,
min_weight_fraction_leaf=0.0, n_estimators=100, n_jobs=None, oob_score=False, random_state=None, verbose=0, warm_start=False)
MACHINE LEARNING FOR PRACTICAL USE
특징 중요도 확인
ft_importances_values = rf_clf.feature_importances_
ft_importances = pd.Series(ft_importances_values)
top10 = ft_importances.sort_values(ascending=False)[:10]
plt.figure(figsize=(12,10)) plt.title('Feature Importances') sns.barplot(x=top10.index, y=top10) plt.show()
:: 실행 결과
INE LEARNING FOR PRACTICAL USE
파라미터를 사용하여 학습 rf_param_grid ={
'n_estimators' : [100, 110, 120], 'min_samples_leaf' : [1, 2, 3], 'min_samples_split' : [2, 3, 4]
}
rf_clf = RandomForestClassifier(random_state = 0)
grid = GridSearchCV(rf_clf, param_grid = rf_param_grid, scoring='accuracy', n_jobs=1)
grid.fit(X_train, y_train)
MACHINE LEARNING FOR PRACTICAL USE
모델 파라미터 확인
print('최고 평균 정확도 : {0:.4f}'.format(grid.best_score_)) print(grid.best_params_)
:: 실행 결과
최고 평균 정확도 : 0.9470 {'min_samples_leaf': 1, 'min_samples_split': 3, 'n_estimators': 110}
EARNING FOR PRACTICAL USE
INE LEARNING FOR PRACTICAL USE
출처 : 위키피디아
의사결정트리
K-NN
SVM
분류 정확도
확인
INE LEARNING FOR PRACTICAL USE
from sklearn import datasets from sklearn import tree
from sklearn.neighbors import KNeighborsClassifier from sklearn.svm import SVC
from sklearn.ensemble import VotingClassifier
from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score
import numpy as np
import matplotlib.pyplot as plt 필요한 라이브러리 import
MACHINE LEARNING FOR PRACTICAL USE
데이터 로드
np.random.seed(5)
mnist = datasets.load_digits()
features, labels = mnist.data, mnist.target
X_train,X_test,y_train,y_test=train_test_split(features,labels, test_size=0.2)
INE LEARNING FOR PRACTICAL USE
단일 모델의 정확도 측정
dtree = tree.DecisionTreeClassifier(
criterion="gini", max_depth=8, max_features=32) dtree = dtree.fit(X_train, y_train)
dtree_predicted = dtree.predict(X_test)
knn = KNeighborsClassifier(n_neighbors=299).fit(X_train, y_train) knn_predicted = knn.predict(X_test)
svm = SVC(C=0.1, gamma=0.003,
probability=True).fit(X_train, y_train) svm_predicted = svm.predict(X_test)
MACHINE LEARNING FOR PRACTICAL USE
단일 모델의 정확도 측정 print("[accuarcy]")
print("d-tree: ", accuracy_score(y_test, dtree_predicted)) print("knn : ", accuracy_score(y_test, knn_predicted)) print("svm : ", accuracy_score(y_test, svm_predicted))
:: 실행 결과 [accuarcy]
d-tree: 0.7916666666666666 knn : 0.8944444444444445 svm : 0.8916666666666667
INE LEARNING FOR PRACTICAL USE
분류값별 확률 확인
svm_proba = svm.predict_proba(X_test) print(svm_proba[0:2])
:: 실행 결과
[[0.00198803 0.00839195 0.00810019 0.00463173 0.00482916 0.88824992
0.00230768 0.00694883 0.06909342 0.00545907]
[0.00379136 0.01488566 0.80969652 0.01018209 0.00678553 0.02547445
0.00502502 0.01161747 0.10314573 0.00939618]]
MACHINE LEARNING FOR PRACTICAL USE
하드보팅
voting_model = VotingClassifier(estimators=[
('Decision_Tree', dtree), ('k-NN', knn), ('SVM', svm)], weights=[1,1,1], voting='hard')
voting_model.fit(X_train, y_train)
hard_voting_predicted = voting_clf.predict(X_test) accuracy_score(y_test, hard_voting_predicted)
:: 실행 결과
0.9444444444444444
INE LEARNING FOR PRACTICAL USE
소프트 보팅
voting_model = VotingClassifier(estimators=[
('Decision_Tree', dtree), ('k-NN', knn), ('SVM', svm)], weights=[1,1,1], voting='soft')
voting_model.fit(X_train, y_train)
soft_voting_predicted = voting_clf.predict(X_test) accuracy_score(y_test, soft_voting_predicted)
:: 실행 결과
0.8861111111111111
MACHINE LEARNING FOR PRACTICAL USE
정확도 비교 시각화 x = np.arange(5)
plt.bar(x, height= [accuracy_score(y_test, dtree_predicted), accuracy_score(y_test, knn_predicted), accuracy_score(y_test, svm_predicted),
accuracy_score(y_test, hard_voting_predicted), accuracy_score(y_test, soft_voting_predicted)]) plt.xticks(x, ['decision tree','knn','svm','hard voting','soft
voting']);
:: 실행 결과
EARNING FOR PRACTICAL USE
- 앙상블 기법의 정의 - 배깅의 이해
- 랜덤포레스트의 이해 - 부스팅의 이해
앙상블 기법 활용 실습(1)
- 랜덤 포레스트 손글씨 분류 이해하기 - 랜덤 포레스트 손글씨 분류 실습
앙상블 기법 활용 실습(2)
- 보팅 앙상블 손글씨 분류 이해하기 - 보팅 앙상블 손글씨 분류 실습
보팅 앙상블 손글씨 분류 실습을 다음 조건에 따라 분류기의 정확도를 향상해 보세요.
•
알고리즘 : 지도학습 알고리즘 활용(SVM, k-NN, 나이브 베이즈, 의사결정트리)
•
방법 : 지도학습 알고리즘의 개수를 2개~4개로 변화시킨 후 정확도의 변화를 파악하기서체 출처 : 에스코어드림체-㈜에스코어, 나눔글꼴체-㈜네이버, 경기천년체-경기도 이미지 출처
나의 첫 머신러닝/딥러닝, 허민석, 위키북스, 2020
• https://www.flaticon.com
• https://www.freepik.com
• 위키피디아