앙상블 방법: 향상된 기계 학습 결과를 생성하는 우아한 기술

게시 됨: 2022-03-11

앙상블 방법은 여러 모델을 만든 다음 이를 결합하여 개선된 결과를 생성하는 기술입니다. 앙상블 방법은 일반적으로 단일 모델보다 더 정확한 솔루션을 생성합니다. 이것은 우승 솔루션이 앙상블 방법을 사용하는 여러 기계 학습 대회의 경우였습니다. 인기 있는 Netflix 대회에서 우승자는 앙상블 방법을 사용하여 강력한 협업 필터링 알고리즘을 구현했습니다. 또 다른 예는 우승자가 앙상블 방법을 사용한 KDD 2009입니다. Kaggle 대회에서 이러한 방법을 사용한 우승자를 찾을 수도 있습니다. 예를 들어 여기 CrowdFlower 대회 우승자와의 인터뷰가 있습니다.

이 기사를 계속하기 전에 몇 가지 용어를 이해하는 것이 중요합니다. 이 기사 전체에서 데이터로 훈련된 알고리즘의 출력을 설명하기 위해 "모델"이라는 용어를 사용했습니다. 그런 다음 이 모델을 사용하여 예측합니다. 이 알고리즘은 로지스틱 회귀, 의사 결정 트리 등과 같은 모든 기계 학습 알고리즘이 될 수 있습니다. 이러한 모델을 앙상블 방법의 입력으로 사용할 때 "기본 모델"이라고 합니다.

이 블로그 게시물에서는 분류를 위한 앙상블 방법을 다루고 널리 알려진 앙상블 방법인 투표, 스태킹, 배깅 및 부스팅에 대해 설명합니다.

투표 및 평균 기반 앙상블 방법

투표와 평균은 가장 쉬운 앙상블 방법입니다. 둘 다 이해하기 쉽고 구현하기 쉽습니다. 분류에는 투표가 사용되고 회귀에는 평균이 사용됩니다.

투표 및 평균 기반 앙상블 방법

두 방법 모두에서 첫 번째 단계는 일부 교육 데이터 세트를 사용하여 여러 분류/회귀 모델을 만드는 것입니다. 각 기본 모델은 동일한 훈련 데이터 세트 및 동일한 알고리즘의 다른 분할을 사용하거나 다른 알고리즘 또는 다른 방법으로 동일한 데이터 세트를 사용하여 생성할 수 있습니다. 다음 Python-esque 의사 코드는 알고리즘이 다른 동일한 훈련 데이터 세트의 사용을 보여줍니다.

 train = load_csv("train.csv") target = train["target"] train = train.drop("target") test = load_csv("test.csv") algorithms = [logistic_regression, decision_tree_classification, ...] #for classification algorithms = [linear_regression, decision_tree_regressor, ...] #for regression predictions = matrix(row_length=len(target), column_length=len(algorithms)) for i,algorithm in enumerate(algorithms): predictions[,i] = algorithm.fit(train, target).predict(test)

위의 의사 코드에 따라 각 모델에 대한 예측을 생성하고 각 열에 한 모델의 예측이 포함된 예측이라는 행렬에 저장했습니다.

과반수 투표

모든 모델은 각 테스트 인스턴스에 대해 예측(투표)을 하고 최종 출력 예측은 투표의 절반 이상을 받는 예측입니다. 만약 어떤 예측도 과반수 이상의 득표를 얻지 못한다면 앙상블 방법이 이 경우에 대해 안정적인 예측을 할 수 없다고 말할 수 있습니다. 이것은 널리 사용되는 기술이지만 최종 예측으로 가장 많이 투표된 예측(투표의 절반 미만인 경우에도)을 시도할 수 있습니다. 일부 기사에서 이 방법을 "복수 투표"라고 부르는 것을 볼 수 있습니다.

가중 투표

각 모델이 동일한 권한을 갖는 다수결 투표와 달리 하나 이상의 모델의 중요성을 높일 수 있습니다. 가중 투표에서는 더 나은 모델의 예측을 여러 번 계산합니다. 합리적인 가중치 세트를 찾는 것은 귀하에게 달려 있습니다.

단순 평균

단순 평균화 방법에서는 테스트 데이터 세트의 모든 인스턴스에 대해 평균 예측이 계산됩니다. 이 방법은 종종 과적합을 줄이고 더 부드러운 회귀 모델을 만듭니다. 다음 의사 코드 코드는 이 간단한 평균화 방법을 보여줍니다.

 final_predictions = [] for row_number in len(predictions): final_predictions.append( mean(prediction[row_number, ]) )

가중 평균

가중 평균은 각 모델의 예측에 가중치를 곱한 다음 평균을 계산하는 단순 평균의 약간 수정된 버전입니다. 다음 의사 코드 코드는 가중 평균을 보여줍니다.

 weights = [..., ..., ...] #length is equal to len(algorithms) final_predictions = [] for row_number in len(predictions): final_predictions.append( mean(prediction[row_number, ]*weights) )

여러 기계 학습 모델 스태킹

스택 일반화라고도 하는 스택은 다른 기계 학습 알고리즘을 사용하여 모델을 결합하는 앙상블 방법입니다. 기본 아이디어는 훈련 데이터 세트로 기계 학습 알고리즘을 훈련한 다음 이러한 모델로 새 데이터 세트를 생성하는 것입니다. 그런 다음 이 새 데이터 세트는 결합기 기계 학습 알고리즘의 입력으로 사용됩니다.

스태킹 절차의 의사 코드는 다음과 같이 요약됩니다.

 base_algorithms = [logistic_regression, decision_tree_classification, ...] #for classification stacking_train_dataset = matrix(row_length=len(target), column_length=len(algorithms)) stacking_test_dataset = matrix(row_length=len(test), column_length=len(algorithms)) for i,base_algorithm in enumerate(base_algorithms): stacking_train_dataset[,i] = base_algorithm.fit(train, target).predict(train) stacking_test_dataset[,i] = base_algorithm.predict(test) final_predictions = combiner_algorithm.fit(stacking_train_dataset, target).predict(stacking_test_dataset)

위의 의사 코드에서 볼 수 있듯이 결합기 알고리즘에 대한 훈련 데이터 세트는 기본 알고리즘의 출력을 사용하여 생성됩니다. 의사 코드에서 기본 알고리즘은 훈련 데이터 세트를 사용하여 생성된 다음 동일한 데이터 세트를 다시 사용하여 예측을 수행합니다. 그러나 우리가 알고 있듯이 실제 세계에서는 예측을 위해 동일한 훈련 데이터 세트를 사용하지 않으므로 이 문제를 극복하기 위해 훈련 데이터 세트가 분할되는 일부 스태킹 구현을 볼 수 있습니다. 아래에서 기본 알고리즘을 훈련하기 전에 훈련 데이터 세트가 분할된 의사 코드를 볼 수 있습니다.

 base_algorithms = [logistic_regression, decision_tree_classification, ...] #for classification stacking_train_dataset = matrix(row_length=len(target), column_length=len(algorithms)) stacking_test_dataset = matrix(row_length=len(test), column_length=len(algorithms)) for i,base_algorithm in enumerate(base_algorithms): for trainix, testix in split(train, k=10): #you may use sklearn.cross_validation.KFold of sklearn library stacking_train_dataset[testcv,i] = base_algorithm.fit(train[trainix], target[trainix]).predict(train[testix]) stacking_test_dataset[,i] = base_algorithm.fit(train).predict(test) final_predictions = combiner_algorithm.fit(stacking_train_dataset, target).predict(stacking_test_dataset)

부트스트랩 집계

"배깅"이라고도 하는 Bootstrap Aggregating이라는 이름은 이 전략의 핵심 요소를 요약합니다. 배깅 알고리즘에서 첫 번째 단계는 여러 모델을 만드는 것입니다. 이러한 모델은 부트스트랩 샘플링 방법을 사용하여 원래 데이터 세트에서 무작위로 추출한 데이터 세트의 임의 하위 샘플과 동일한 알고리즘을 사용하여 생성됩니다. 부트스트랩 샘플링에서 일부 원본 예제는 두 번 이상 나타나고 일부 원본 예제는 샘플에 없습니다. m개의 요소로 하위 데이터 세트를 생성하려면 원본 데이터 세트에서 임의의 요소를 m번 선택해야 합니다. 그리고 목표가 n개의 데이터 세트를 생성하는 것이라면 이 단계를 n번 수행합니다.

부트스트랩 집계

결국 각 데이터 세트의 요소 수가 m인 n개의 데이터 세트가 있습니다. 다음 Python-esque 의사 코드는 부트스트랩 샘플링을 보여줍니다.

 def bootstrap_sample(original_dataset, m): sub_dataset = [] for i in range(m): sub_dataset.append( random_one_element(original_dataset) ) return sub_dataset

배깅의 두 번째 단계는 생성된 모델을 집계하는 것입니다. 이를 위해 투표 및 평균화와 같은 잘 알려진 방법이 사용됩니다.

전체 의사 코드는 다음과 같습니다.

 def bagging(n, m, base_algorithm, train_dataset, target, test_dataset): predictions = matrix(row_length=len(target), column_length=n) for i in range(n): sub_dataset = bootstrap_sample(train_dataset, m) predictions[,i] = base_algorithm.fit(original_dataset, target).predict(test_dataset) final_predictions = voting(predictions) # for classification final_predictions = averaging(predictions) # for regression return final_predictions

배깅에서 각 하위 샘플은 서로 독립적으로 생성될 수 있습니다. 따라서 생성과 훈련을 동시에 수행할 수 있습니다.

일부 알고리즘에서 배깅 전략의 구현을 찾을 수도 있습니다. 예를 들어 Random Forest 알고리즘은 몇 가지 차이점이 있는 배깅 기법을 사용합니다. Random Forest는 임의의 특성 선택을 사용하며 기본 알고리즘은 결정 트리 알고리즘입니다.

관련: 딥 러닝 튜토리얼: 퍼셉트론에서 딥 네트워크까지

부스팅: 약한 모델을 강한 모델로 변환

"부스팅"이라는 용어는 약한 모델을 강력한 모델로 변환할 수 있는 알고리즘 제품군을 설명하는 데 사용됩니다. 상당한 오류율이 있지만 성능이 무작위가 아닌 경우 모델이 약한 것입니다(이진 분류의 경우 오류율이 0.5임). 증분 부스팅은 동일한 데이터 세트로 각 모델을 훈련하여 앙상블을 구축하지만 인스턴스의 가중치는 마지막 예측의 오류에 따라 조정됩니다. 주요 아이디어는 모델이 어려운 인스턴스에 집중하도록 하는 것입니다. 배깅과 달리 부스팅은 순차 방식이므로 여기서는 병렬 연산을 사용할 수 없습니다.

부스팅 알고리즘의 일반적인 절차는 다음과 같이 정의됩니다.

 def adjust_dataset(_train, errors): #create a new dataset by using the hardest instances ix = get_highest_errors_index(train) return concat(_train[ix], random_select(train)) models = [] _train = random_select(train) for i in range(n): #n rounds model = base_algorithm.fit(_train) predictions = model.predict(_train) models.append(model) errors = calculate_error(predictions) _train = adjust_dataset(_train, errors) final_predictions = combine(models, test)

adjust_dataset 함수는 가장 어려운 인스턴스를 포함하는 새 데이터셋을 반환하며, 이 데이터셋은 기본 알고리즘이 학습하도록 강제하는 데 사용할 수 있습니다.

Adaboost는 널리 알려진 부스팅 방법인 알고리즘입니다. Adaboost의 설립자들은 그들의 작업으로 Godel Prize를 수상했습니다. 대부분 Adaboost의 기본 알고리즘으로 결정 트리 알고리즘이 선호되며 sklearn 라이브러리에서 Adaboost의 기본 기본 알고리즘은 결정 트리(AdaBoostRegressor 및 AdaBoostClassifier)입니다. 이전 단락에서 논의한 바와 같이 동일한 증분 방법이 Adaboost에 적용됩니다. 각 훈련 샘플의 '경도'에 대해 AdaBoost 알고리즘의 각 단계에서 수집된 정보가 모델에 제공됩니다. '데이터 세트 조정' 단계는 위에서 설명한 단계와 다르며 '모델 결합' 단계는 가중 투표를 사용하여 계산됩니다.

결론

앙상블 방법은 정교한 알고리즘을 고안하고 높은 정확도로 결과를 생성하여 기계 학습 대회에서 우승하는 데 도움이 될 수 있지만 해석 가능성이 더 중요한 산업에서는 선호되지 않는 경우가 많습니다. 그럼에도 불구하고 이러한 방법의 효과는 부인할 수 없으며 적절한 응용 프로그램에서의 이점은 엄청날 수 있습니다. 의료와 같은 분야에서는 기계 학습 알고리즘의 정확도가 아주 조금만 향상되더라도 진정으로 가치 있는 것이 될 수 있습니다.

관련된:
  • 기계 학습 이론 및 응용 소개: 예제가 포함된 시각적 자습서
  • 기계와 신뢰: AI 편향을 완화하는 방법