ML 모델의 성능 향상
앙상블을 통한 성능 향상
앙상블은 여러 모델을 결합하여 기계 학습 결과를 향상시킬 수 있습니다. 기본적으로 앙상블 모델은 개별적으로 훈련 된 여러지도 학습 모델로 구성되며 그 결과는 단일 모델에 비해 더 나은 예측 성능을 달성하기 위해 다양한 방식으로 병합됩니다. 앙상블 방법은 다음 두 그룹으로 나눌 수 있습니다.
순차적 앙상블 방법
이름에서 알 수 있듯이 이러한 종류의 앙상블 방법에서는 기본 학습자가 순차적으로 생성됩니다. 이러한 방법의 동기는 기본 학습자 간의 종속성을 활용하는 것입니다.
병렬 앙상블 방법
이름에서 알 수 있듯이 이러한 종류의 앙상블 방법에서는 기본 학습자가 병렬로 생성됩니다. 이러한 방법의 동기는 기본 학습자 간의 독립성을 활용하는 것입니다.
앙상블 학습 방법
다음은 가장 인기있는 앙상블 학습 방법, 즉 다른 모델의 예측을 결합하는 방법입니다.
자루에 넣기
배깅이라는 용어는 부트 스트랩 집계라고도합니다. 배깅 방법에서 앙상블 모델은 무작위로 생성 된 학습 샘플에 대해 학습 된 개별 모델의 예측을 결합하여 예측 정확도를 높이고 모델 분산을 줄이려고합니다. 앙상블 모델의 최종 예측은 개별 추정자로부터 모든 예측의 평균을 계산하여 제공됩니다. 배깅 방법의 가장 좋은 예 중 하나는 랜덤 포레스트입니다.
부스팅
부스팅 방법에서 앙상블 모델 구축의 주된 원리는 각 기본 모델 추정기를 순차적으로 훈련하여 점진적으로 구축하는 것입니다. 이름에서 알 수 있듯이 기본적으로 학습 데이터의 여러 반복에 걸쳐 순차적으로 학습 된 몇 주 기본 학습자를 결합하여 강력한 앙상블을 구축합니다. 주 단위 학습자의 훈련 중에는 이전에 잘못 분류 된 학습자에게 더 높은 가중치가 할당됩니다. 부스팅 방법의 예는 AdaBoost입니다.
투표
이 앙상블 학습 모델에서는 다양한 유형의 여러 모델이 구축되고 평균 또는 중앙값 계산과 같은 간단한 통계가 예측을 결합하는 데 사용됩니다. 이 예측은 최종 예측을위한 훈련을위한 추가 입력으로 사용됩니다.
배깅 앙상블 알고리즘
다음은 세 가지 배깅 앙상블 알고리즘입니다.
Bagged 의사 결정 트리
배깅 앙상블 방법은 분산이 높은 알고리즘과 잘 작동하며,이 점에서 가장 좋은 방법은 의사 결정 트리 알고리즘입니다. 다음 Python 레시피에서는 Pima Indians 당뇨병 데이터 세트에서 DecisionTreeClasifier (분류 및 회귀 트리 알고리즘)와 함께 sklearn의 BaggingClassifier 함수를 사용하여 bagged 의사 결정 트리 앙상블 모델을 빌드 할 것입니다.
먼저 다음과 같이 필요한 패키지를 가져옵니다.
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
이제 이전 예제에서했던 것처럼 Pima 당뇨병 데이터 세트를로드해야합니다.
path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=headernames)
array = data.values
X = array[:,0:8]
Y = array[:,8]
다음으로, 10 겹 교차 검증에 대한 입력을 다음과 같이 제공하십시오
seed = 7
kfold = KFold(n_splits=10, random_state=seed)
cart = DecisionTreeClassifier()
우리가 만들 나무의 수를 제공해야합니다. 여기서 우리는 150 그루의 나무를 짓고 있습니다.
num_trees = 150
다음으로, 다음 스크립트의 도움으로 모델을 구축하십시오-
model = BaggingClassifier(base_estimator=cart, n_estimators=num_trees, random_state=seed)
다음과 같이 결과를 계산하고 인쇄하십시오-
results = cross_val_score(model, X, Y, cv=kfold)
print(results.mean())
산출
0.7733766233766234
위의 출력은 배깅 된 의사 결정 트리 분류기 모델의 정확도가 약 77 %임을 보여줍니다.
랜덤 포레스트
이는 bagged 의사 결정 트리의 확장입니다. 개별 분류기의 경우 훈련 데이터 세트의 샘플을 대체하여 가져 오지만 트리는 이들 간의 상관 관계를 줄이는 방식으로 구성됩니다. 또한 각 트리를 구성 할 때 최적의 분할 지점을 탐욕스럽게 선택하기보다는 각 분할 지점을 선택하기 위해 임의의 기능 하위 집합이 고려됩니다.
다음 Python 레시피에서는 Pima Indians 당뇨병 데이터 세트에서 sklearn의 RandomForestClassifier 클래스를 사용하여 배깅 된 랜덤 포레스트 앙상블 모델을 빌드 할 것입니다.
먼저 다음과 같이 필요한 패키지를 가져옵니다.
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier
이제 이전 예제에서했던 것처럼 Pima 당뇨병 데이터 세트를로드해야합니다.
path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=headernames)
array = data.values
X = array[:,0:8]
Y = array[:,8]
다음으로, 10 겹 교차 검증에 대한 입력을 다음과 같이 제공하십시오
seed = 7
kfold = KFold(n_splits=10, random_state=seed)
우리가 만들 나무의 수를 제공해야합니다. 여기서 우리는 5 가지 기능에서 선택한 분할 점으로 150 개의 나무를 만들고 있습니다.
num_trees = 150
max_features = 5
다음으로, 다음 스크립트의 도움으로 모델을 구축하십시오-
model = RandomForestClassifier(n_estimators=num_trees, max_features=max_features)
다음과 같이 결과를 계산하고 인쇄하십시오-
results = cross_val_score(model, X, Y, cv=kfold)
print(results.mean())
산출
0.7629357484620642
위의 출력은 배깅 된 랜덤 포레스트 분류기 모델의 정확도가 약 76 %임을 보여줍니다.
여분의 나무
bagged 의사 결정 트리 앙상블 방법의 또 다른 확장입니다. 이 방법에서는 훈련 데이터 세트의 샘플에서 랜덤 트리가 구성됩니다.
다음 Python 레시피에서는 Pima Indians 당뇨병 데이터 세트에서 sklearn의 ExtraTreesClassifier 클래스를 사용하여 추가 트리 앙상블 모델을 빌드 할 것입니다.
먼저 다음과 같이 필요한 패키지를 가져옵니다.
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import ExtraTreesClassifier
이제 이전 예제에서했던 것처럼 Pima 당뇨병 데이터 세트를로드해야합니다.
path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=headernames)
array = data.values
X = array[:,0:8]
Y = array[:,8]
다음으로, 10 겹 교차 검증에 대한 입력을 다음과 같이 제공하십시오
seed = 7
kfold = KFold(n_splits=10, random_state=seed)
우리가 만들 나무의 수를 제공해야합니다. 여기서 우리는 5 가지 기능에서 선택한 분할 점으로 150 개의 나무를 만들고 있습니다.
num_trees = 150
max_features = 5
다음으로, 다음 스크립트의 도움으로 모델을 구축하십시오-
model = ExtraTreesClassifier(n_estimators=num_trees, max_features=max_features)
다음과 같이 결과를 계산하고 인쇄하십시오-
results = cross_val_score(model, X, Y, cv=kfold)
print(results.mean())
산출
0.7551435406698566
위의 출력은 배깅 된 추가 트리 분류기 모델의 정확도가 약 75.5 %임을 보여줍니다.
앙상블 알고리즘 강화
다음은 가장 일반적인 두 가지 부스팅 앙상블 알고리즘입니다.
AdaBoost
가장 성공적인 부스팅 앙상블 알고리즘 중 하나입니다. 이 알고리즘의 주요 키는 데이터 세트의 인스턴스에 가중치를 부여하는 방식입니다. 이로 인해 알고리즘은 후속 모델을 구성하는 동안 인스턴스에 덜주의를 기울여야합니다.
다음 Python 레시피에서는 Pima Indians 당뇨병 데이터 세트에서 sklearn의 AdaBoostClassifier 클래스를 사용하여 분류를위한 Ada Boost 앙상블 모델을 빌드합니다.
먼저 다음과 같이 필요한 패키지를 가져옵니다.
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import AdaBoostClassifier
이제 이전 예제에서했던 것처럼 Pima 당뇨병 데이터 세트를로드해야합니다.
path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=headernames)
array = data.values
X = array[:,0:8]
Y = array[:,8]
다음으로, 10 겹 교차 검증에 대한 입력을 다음과 같이 제공하십시오
seed = 5
kfold = KFold(n_splits=10, random_state=seed)
우리가 만들 나무의 수를 제공해야합니다. 여기서 우리는 5 가지 기능에서 선택한 분할 점으로 150 개의 나무를 만들고 있습니다.
num_trees = 50
다음으로, 다음 스크립트의 도움으로 모델을 구축하십시오-
model = AdaBoostClassifier(n_estimators=num_trees, random_state=seed)
다음과 같이 결과를 계산하고 인쇄하십시오-
results = cross_val_score(model, X, Y, cv=kfold)
print(results.mean())
산출
0.7539473684210527
위의 출력은 AdaBoost 분류기 앙상블 모델의 정확도가 약 75 %임을 보여줍니다.
확률 적 그라디언트 부스팅
Gradient Boosting Machines라고도합니다. 다음 Python 레시피에서는 Pima Indians 당뇨병 데이터 세트에서 sklearn의 GradientBoostingClassifier 클래스를 사용하여 분류를위한 Stochastic Gradient Boostingensemble 모델을 빌드 할 것입니다.
먼저 다음과 같이 필요한 패키지를 가져옵니다.
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import GradientBoostingClassifier
이제 이전 예제에서했던 것처럼 Pima 당뇨병 데이터 세트를로드해야합니다.
path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=headernames)
array = data.values
X = array[:,0:8]
Y = array[:,8]
다음으로, 10 겹 교차 검증에 대한 입력을 다음과 같이 제공하십시오
seed = 5
kfold = KFold(n_splits=10, random_state=seed)
우리가 만들 나무의 수를 제공해야합니다. 여기서 우리는 5 가지 기능에서 선택한 분할 점으로 150 개의 나무를 만들고 있습니다.
num_trees = 50
다음으로, 다음 스크립트의 도움으로 모델을 구축하십시오-
model = GradientBoostingClassifier(n_estimators=num_trees, random_state=seed)
다음과 같이 결과를 계산하고 인쇄하십시오-
results = cross_val_score(model, X, Y, cv=kfold)
print(results.mean())
산출
0.7746582365003418
위의 출력은 Gradient Boosting 분류기 앙상블 모델의 정확도가 약 77.5 %임을 보여줍니다.
투표 앙상블 알고리즘
논의 된 바와 같이, 투표는 먼저 학습 데이터 세트에서 두 개 이상의 독립형 모델을 생성 한 다음 투표 분류자는 새 데이터가 필요할 때마다 하위 모델 예측의 평균을 취하면서 모델을 래핑합니다.
다음 Python 레시피에서는 Pima Indians 당뇨병 데이터 세트에서 sklearn의 VotingClassifier 클래스를 사용하여 분류를위한 투표 앙상블 모델을 빌드 할 것입니다. 우리는 다음과 같이 분류 문제를 위해 로지스틱 회귀, 의사 결정 트리 분류기 및 SVM의 예측을 결합하고 있습니다.
먼저 다음과 같이 필요한 패키지를 가져옵니다.
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.ensemble import VotingClassifier
이제 이전 예제에서했던 것처럼 Pima 당뇨병 데이터 세트를로드해야합니다.
path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=headernames)
array = data.values
X = array[:,0:8]
Y = array[:,8]
다음으로, 10 겹 교차 검증에 대한 입력을 다음과 같이 제공하십시오
kfold = KFold(n_splits=10, random_state=7)
다음으로, 다음과 같이 하위 모델을 생성해야합니다.
estimators = []
model1 = LogisticRegression()
estimators.append(('logistic', model1))
model2 = DecisionTreeClassifier()
estimators.append(('cart', model2))
model3 = SVC()
estimators.append(('svm', model3))
이제 위에서 만든 하위 모델의 예측을 결합하여 투표 앙상블 모델을 만듭니다.
ensemble = VotingClassifier(estimators)
results = cross_val_score(ensemble, X, Y, cv=kfold)
print(results.mean())
산출
0.7382262474367738
위의 출력은 투표 분류기 앙상블 모델의 정확도가 약 74 %임을 보여줍니다.