본문 바로가기

기사/블로그 스크랩

KAGGLE ENSEMBLING GUIDE

원문 : http://mlwave.com/kaggle-ensembling-guide/


# 번역이 매끄럽지 않은점 양해 부탁드림. 오역이 있을 수 있으니 주의바람. 댓글로 알려주시면 바로 고치겠습니다.


모델 앙상블은 다양한 기계학습문제에서 정확도를 높인 매우 강력한 테크닉이다. 이 포스팅 에서는 Kaggle Competition에 쓰인 앙상블 기법을 설명하겠다.


처음은 제출파일로부터 앙상블을 만드는 것을 볼 것이고, 두번째 파트는 stacked generalization이나 blending을 통한 앙상블과 왜 앙상블이 일반화오차(generalization error)를 줄이는지를 볼 것이다.


마지막에는 다른 방법의 앙상블기법의 결과들을 보고 스스로 코딩을 하는 것을 보일 것이다.


This is how you win ML competitions: you take other peoples’ work and ensemble them together.” Vitaly Kuznetsov NIPS2014


Creating ensembles from submission files


앙상블을 하는 가장 기본적이고 편한 방법은 제출 CSV 파일(결과)들을 앙상블하는 것이다. 이 방법들을 사용한 테스트 셋의 결과들만 필요하므로, 학습모델을 얻을 필요가 없다. 이것은 이상적으로 팀을 합쳐 협업을 할때, 본래 존재하는 모델의 예측들을 앙상블하는 하나의 빠른 방법이다.


Voting ensembles


먼저 우리는 간단한 다수결 투표방식의 앙상블방법을 먼저 보자. 왜 모델 앙상블링이 오차율을 줄이는지, 왜 low-correlated한 예측들을 앙상블하는것이 더 잘 작동하는지를 보자.


Error correcting codes


space mission중에 올바르게 전달된 모든 신호들은 매우 중요하다. 만약 다음과같이 2진형태의 문자열 형태의 신호를 가졌다고 하자.


1110110011101111011111011011

 

어찌된 일인지 그 다음 신호에 오류가 생겼다. (비트1자리가 바뀌었다.)


1010110011101111011111011011


이는 생명들을 잃을 수도 있다.


coding solution은 error correcting code에서 설립되었다. 가장 단순한 오차수정코드는 repetition-code이다. 이는 동일한 크기의 데이터들로 많은 수의 신호를 받아 이 신호들을 투표하는 방식이다.


Original signal:
1110110011

Encoded:
10,3 101011001111101100111110110011

Decoding:
1010110011
1110110011
1110110011

Majority vote:
1110110011


신호오류는 매우 드물고 매우 작은 범위로 일어난다. 그렇다면 오류가 난 다수결 투표결과는 훨씬 더 드물것임을 알 수 있다.

오류가 예측하기 불가능하지 않은이상(50%의 발생활률), 신호는 고칠 수 있다.


A machine learning example


10개로 이루어진 하나의 표본이 있는 한 테스트 셋을 가졌다고 가정하자, 참 정보는 모두 positive('1')인 경우이다.


1111111111


더 나아가 70%의 정확도의 3 개의 (A,B,C) 이진분류기를 가졌다. 우리는 현재 이 분류기들을 70%확률로 '1'이나오고 30% 확률로 '0'이 나오는 모조-난수 생성기라고 볼 수 있다. 


이제 어떻게 이 모조-분류기들이 투표방식의 앙상블기법을 통해 78%의 정확도를 얻을 수 있는지 보겠다.


A pinch of maths


3개의 멤버(분류기 A,B,C)의 다수결 투표로, 우리는 4가지 결과를 기대할 수 있다.


All three are correct
  0.7 * 0.7 * 0.7
= 0.3429

Two are correct
  0.7 * 0.7 * 0.3
+ 0.7 * 0.3 * 0.7
+ 0.3 * 0.7 * 0.7
= 0.4409

Two are wrong
  0.3 * 0.3 * 0.7
+ 0.3 * 0.7 * 0.3
+ 0.7 * 0.3 * 0.3
= 0.189

All three are wrong
  0.3 * 0.3 * 0.3
= 0.027


대부분 다수결투표가 오차를 고칠 확률이 높다,  위에서 보듯 다수결 투표에서 2개 이상 correct가 되어 결과적으로 correct('1')이 될 확률이 0.3429, 0.4409 로 높고 그렇지 않은 다수결 투표로 결과적으로 not correct('0')가 될 확률은 0.189, 0.027로 낮으므로 이 3개의 분류기를 앙상블한 이 모델은 0.78의 확률(정확도)로 올바른 결과(모두 '1')를 낼 것이다. 과정을 보면서도 느꼈겠지만 마지막에 앙상블할때 우리는 0.3429, 0.4409를 더했다. 즉 처음에 말했던 제일 간단한 앙상블 방법인 제출 csv파일(결과)들을 다 더하기에서 majority voting 시스템을 덧붙인 앙상블 기법이다.


Number of voters


repetition codes가 더 많은 code가 반복될 수록(자리수가 늘어날수록) 오류 수정능력은 증가하는 것과 같이. 앙상블도 앙상블 멤버가 더 증가함에 따라 성능이 보통 향상된다.



위와 같이 약간의 수학을 이용하면 : 70% 정확도를 가진 5개의 pseudo-random classifiers의 voting 앙상블은 약 83%의 성능을 냈고. 2개의 classifiers를 voting 앙상블을 했을 시 66%의 정확도를 내었다. (0.36015 + 0.3087)


Correlation


Marios Michailidis(KazAnova)가 KDD-cup 2014에 참여할 당시, 팀원에게 특이한 것을 제안했는데, 그는 피어슨 상관계수를 우리의 모든 제출 파일에 대해 계산하고, 상관관계가 적은 결과가 좋은 몇몇 모델들을 모으자고 했다.


다양한 제출모델들로부터 평균(averaging) 앙상블을 생성하여 우리는 리더보드에서 50위가 올랐다. 비상관관계의 제출모델들은 명백히 앙상블을 할때 상관관계가 있는 결과모델들의 앙상블 보다 더 좋은 성능을 내었다. 그런데 왜 그럴까?


이것을 보기 위해, 우리는 3가지 간단한 모델들을 다시보자. 기본적인 참 신호는 이전과 같이 모두 1일때이다.

 

1111111100 = 80% accuracy
1111111100 = 80% accuracy
1011111100 = 70% accuracy.

이 모델들은 모두 예측값이 높은 상관관계가 있다. 다음과 같이 다수결 투표 앙상블을 쓰면 정확도향상을 보이진 않는다.

1111111100 = 80% accuracy

이제, 3개의 전보다는 성능이 낮지만 거의 상관관계가 없는 모델들과 비교해보자.

1111111100 = 80% accuracy
0111011101 = 70% accuracy
1000101111 = 60% accuracy
이를 다수결방식의 앙상블기법을 사용하여 모델을 만들면 다음을 얻는다.


1111111101 = 90% accuracy

즉 우리는 향상된 모델을 얻었다. 앙상블 멤버들 간의 낮은 상관관계는 오차수정능력이 향상되는 결과를 보인다.

Use for Kaggle : Forest Cover Type prediction

다수결 투표방식의 앙상블 기법은 평가측정이 어려운 예측이 필요할 때, 쓰는 것이 가장 타당하다. 예를 들어, 다중분류정확도(multiclass classification)를 측정할때 다수결(Majority) 앙상블 기법은 좋은 성능을 낼 수 있다.


forest cover type prediction challenge 는  UCI Forest CoverType dataset 을 사용했다. 이 데이터 셋은 54개의 변수(attributes)와 6개의 class가 있었다.

시작 모델은 500개의 tree의 단순 랜덤포레스트를 만들었다. 그 다음 몇몇 모델들을 더 만든 후 제일 좋은 모형을 하나 골랐다. 이 문제에 대해 우리가 선택한 모델인 ExtraTreesClassifier가 가장 잘 작동 했다.


Weighing

다음으로 우리는 가중 다수결 투표방식을 사용했다. 왜 가중치를 주느냐? 보통 우리는 더 좋은 모델이 하나의 투표에서 더 많은 가중치를 주고 싶다. 그래서 가장 성능이 좋은 모델에 3배의 가중치를 줘 vote를 세었다(즉 3개의 vote를 가진것). 나머지 4개의 모델은 그냥 모델당 1개의 투표권을 주었다.

위와 같이 하는 이유는 열등한 모델들이 최고의 모델(전문가)를 앞지를 수 있는 유일한 길은 열등한 모델들끼리 한 뜻으로 결집하여 하나의 대안을 이루는 것이다.

우리는 이 앙상블이 최고의 모델이 가진 몇몇 오류들을 고쳐 아주 작은 향상을 이끌것이라 기대할 수 있다. 이것이 민주주의 방식을 포기하고 Plato의 공화국을 생성하는 것에 대한 우리의 punishment이다.

“Every city encompasses two cities that are at war with each other.”  Plato in The Republic

아래 표는 가중다수결 투표방식(Weighted majority vote)으로 5개의 훈련모델들을 앙상블한 모델의 Accuracy score를 보여준다.


Use for Kaggle : CIFAR-10 Object detection in images


정확도가 중요한 또 하나의 multi-class classification challenge인 CIFAR-10가 있다.


이 챌린지에서 팀리터인 Phil Culliton은 Dr.Graham의 모델을 복제해 좋은 성능을 내는 setup을 찾았다. 그 다음, 약 30개의 convnet 모델들(모두 90%이상의 정확도를 내는)을 사용했다. 앙상블(멤버)중에서 최고의 단일 모형의 정확도는 0.93170이었다. 30개 모형의 voting 앙상블 모형은 0.94120을 기록했다. 약 0.01정도의 오차율을 줄인것이다. 이 결과는 추정된 인간의 분류정확도를 넘는 정확도이다.


Code


우리의 예제 voting script를 MLWave Github repo에서 사용할 수 있다. Kaggle submission의 디렉토리에서 작동한다. 그리고 새로운 submission을 생성해라. Armando Segnini가 가중치를 입력했다.


Ensembling. Train 10 neural networks and average their predictions. It’s a fairly trivial technique that results in easy, sizeable performance improvements.

One may be mystified as to why averaging helps so much, but there is a simple reason for the effectiveness of averaging. Suppose that two classifiers have an error rate of 70%. Then, when they agree they are right. But when they disagree, one of them is often right, so now the average prediction will place much more weight on the correct answer.

The effect will be especially strong whenever the network is confident when it’s right and unconfident when it’s wrong. Ilya Sutskever A brief overview of Deep Learning.


Averaging


평균(Averaging)은 많은 범위의 문제(분류 그리고 회귀)와 측정법(AUC, squared error or logarithmic loss)에 대해 아주 잘 작동된다. 개별 모델예측치의 평균을 취하는 것 보다 averaging에 가깝진 않다. 이것을 캐글에서는 속히 말해 bagging submissions라고 한다.


Averaging prediction은 종종 과적합을 막아준다. 당신은 이상적으로 class들간 smooth하게 분류하기를 원한다. 단일 모델의 예측은 edge주변에서 약간 거칠게 그려질 수 있다.



위 그림은 Don't Overrfit라는 Kaggle 대회이다, 검은색 선은 초록샌선보다 더 나은 분류를 하고 있다. 초록색 선은 데이터의 noise 데이터까지 학습했기 때문인데, 걱정하지마라 여러 다른 초록색 선을 Average하여 검정색 선에 가까운 선을 만들 수 있다.


우리의 목표가 훈련 데이터를 기억하는 것이 아니라 (랜덤 포레스트보다 데이터를 저장하는 훨씬더 효율적인 방법들이 있다.) 보지 모샇ㄴ 새로운 데이터에 잘 일반화를 시키는 것임을 기억해라.


Kaggle use ; Bag of Words Meet Bags of Popcorn

이것은 Movie sentiment analysis contest이다. 이전 포스팅에서  online perceptron script 을 95.2 AUC를 얻기 위해 사용했다. 


퍼셉트론은 데이터가 선형분류가 가능할때 한 분류선을 찾아주는 아주 좋은 선형분류기이다. 이것은 좋은 특성이지만, 일단 분류기를 한번 찾게된다면, 훈련을 끝낸다. 이것은 새로운 데이터에 대해서 최적의 분류선을 반드시 찾진 않는다.


그렇다면, 임의적인 가중치를 가진 5개의 퍼셉트론들로 시작하여 나중에 평균을 하여 합치면 어떻게 될까? 놀랍게도 우리는 테스트 셋에서 성능향상을 얻었다.



위의 결과들은 또한 앙상블기법이 하나의 머신러닝 알고리즘의 더 자세하고 내부적인 작동방식을 배워야만 하는 것으로부터 구해줄수 있음을 알 수 있다. 이것이 작동한다면 좋은거고, 만약 잘 작동하지 않는다해도 그렇게 나쁜것도 아니다.


10개의 정확하게 같은 선형회귀를 평균하기 때문에 penalty도 받지 않을 것이다. Single poorly cross-validated and overfitted된 제출모델들을 배깅하는것은 밀도를 더하는것(그러므로 더 적은 상관관계를 가짐)을 통해 정확도를 더 얻을 수 있을것이다, 


Code


input으로 CSV 파일의 한 디렉토리를 받고 이를 합하여 평균하는  averaging script 를 github에 올렸다. 

Update: Dat Le has added a geometric averaging script. Geometric mean can outperform a plain average.

 

Rank averaging


다수의 다른 모델로부터의 결과들을 평균할때, 몇몇 문제가 나올 수 있다. 모든 예측들이 완벽하게 보정이 되지 않았다. 즉 기준이 약간씩 달라,  높거나 낮은 확률을 예측할때 과대하게 혹은 과소하게 신뢰된다.  예측들은 특정 범위주위에 몰려 있다.


극단적인 경우로, 아래와 같은 결과를 가질 수 도 있다.


Id,Prediction
1,0.35000056
2,0.35000002
3,0.35000098
4,0.35000111


이러한 예측은 평가척도가 순위 혹은 AUC같은 것에 기반한 threshold 일때 좋은 성적을 낼 수도 있다. 그러나 다음과 같은 모델을 평균할 때


Id,Prediction
1,0.57
2,0.04
3,0.96
4,0.99


앙상블 결과는 전혀 바뀌지 않을 것이다. 이러한 해결책으로 예측값들을 순위로 먼저 바꾼후에, 순위들을 평균하는것이다.


Id,Rank,Prediction
1,1,0.35000056
2,0,0.35000002
3,2,0.35000098
4,3,0.35000111


0에서 1사이로 평균화된 순위들을 normalizing 한 후에는 예측값들이 고른 분포를 얻을 것이다.  순위평균앙상블의 결과는 다음과 같다.


Id,Prediction
1,0.33
2,0.0
3,0.66
4,1.0


Historical ranks


이제 순위는 훈련데이터셋에는 만들어 졌지만 테스트셋에서는 없다. 이 순위의 테스트셋이 필요할때 어떻게 해야하는가? 여러분은 이전의 테스트셋으로 순위를 매길 수 있다. 그러나 이는 순위를 내는데 더 복잡해 질것이다. 하나의 해결책은 historical rank를 사용하는 것이다. 이전 테스트 셋의 예측값을 그들의 순위와 함께 저장한다. 그 다음 새로운 테스트 샘프을 예측할때, 예를들어 0.35000110 같이, 가장 가까운 prediction을 찾고 이 이전테스트 셋 prediction의 해당 순위를 할당한다. (이경우 0.35000111가 가장 가까운 prediction이고 이것의 rank는 3이다.) 프로세스를 간단히 정리하자면 일단 train으로 예측을 한 후 이를 순위화 시킨다. 이를 구(old)테스트 셋에 예측을 시킨다. 구 테스트 셋에서 나온 prediction과 rank를 가지고 신(new)테스트셋에 이를 다시 예측시키는 과정이다.


Kaggle use case : Acquire Valued Shoppers Challenge


순위평균은 순위매기기 그리고 threshold기반 척도법(AUC같은) 그리고 search-engine quality metrics(k번째에서 평균정확도 같은)


 shopper challenge 의 목표는 한 쇼핑객이 주기적인 고객이 될 가능성의 순위를 내는 것이었다. 우리팀은 다중 Vowpal Wabbit model의 평균을 을 하나의 R GLMNet model과 같이 보았는데, 여기서 우리는 앙상블을 향상시키기위해 ranking average를 사용했다.



순위 평균이 상당한 향상을 냈음을 볼 수 있다.


마지막으로 fastML.com에서 이전 챕터의 bag-of-words 튜토리얼로부터 배깅한 퍼셉트론들을 가중순위평균을 할때 모델의 성능이 0.96328 AUC에서 0.96461 AUC로 향상되었다.


Code


A simple work-horse rank averaging script is added to the MLWave Github repo.

Competitions are effective because there are any number of techniques that can be applied to any modeling problem, but we can’t know in advance which will be most effective. Anthony Goldbloom Data Prediction Competitions — Far More than Just a Bit of Fun


Stacked Generalization & Blending


제출된 예측 파일들을 평균하여 만든 모델은 좋고 만들기도 쉽지만 이것이 캐글상위랭커들의 유일한 방법은 아니다. 이 부분에서 나오는 방법은 stacking 과 blending으로 시작한다.


Netflix

넷플릭스는 첫 데이터사이언스 대회를 개최하고 대중화시켰다. 영화 추천 챌린지 대회참가자들은 앙상블기법을 예술의 경지까지 끌어올렸다. 너무 끌어올렸는지, 넷플릭스는 우승솔루션을 실제로 사용하지 않기로 결정했는데, 이유는 간단했다. 너무 복잡하기 때문이다.


그럼에도 불구하고, 수많은 논문들과 훌륭한 방법들이 이 대회로부터 나왔다.



위 모든 것이 당신이 캐글 스코어를 올리기를 원할때 흥미롭고 접근가능하고 관련있는 읽을 거리이다.

Stacked generalization

Stacked generalizatoin은 Wolpert에 의해 1992 paper에서 소개되었다. Breiman의 논문인 Bagging Predictors“ 가 나오기 2년 전이었다. Wolpert는 다음과 같은 또 하나의 매우 유명한 기계학습이론으로 유명하다. 
"탐색과 최적화에서 공짜점심이란 없다. " (“There is no free lunch in search and optimization“)

Stacked generalization뒤의 기본적인 생각은 기초 분류기들의 한 pool(집단)을 사용한 다음에, 일반화 오차를 줄이려는 목적으로,  또 다른 하나의 분류기로 이 pool들의 예측값을 묶는 것이다.

2-fold stacking을 한다고 해보자

  • 훈련 셋을 2부분으로 나눈다. : train_a 와 train_b
  • train_a에서 첫단계 모델을 적합시킨다. 그런다음 train_b에서 예측을 한다.
  • 같은 모델을 train_b에서 적합시키고 train_a에 대해서 예측을 한다. 
  • 마지막으로 전체 훈련셋에 대해 모델을 적합시키고 원래의 test셋에 대해 예측을 한다.
  • 이제 두번째 단계 stacker 모델을 첫번째 단계 모델로 부터 나온 확률들(test 예측값, train_a에 대한 예측값, train_b에 대한 예측값)에 대해 훈련시킨다. (이를 통해 일반화 오차를 줄일수 있다. 이 부분이 앙상블 하는 부분이라고 보면된다.)
하나의 stacker model은 첫번째 단계의 예측값들을 피쳐(변수)로 사용하여 따로 따로 훈련시킬때 보다 문제공간에 대해 더 많은 정보를 얻는다. 

stacked generalization은 다양한 모델 각각이 아닌 모든 타입들에 대한 level O(아마, ordinary) generalizer들 이다. 이러한 방식으로 학습셋을 조사하고 이것으로부터 외삽하려는 모든 가능한 방법들이 사용되고 있다. 이것이 바로 level O generalizer가 공간을 생성해야만 한다라고 의미하는 부분이다.

각각의 본래 generalizer들이 훈련셋에 대해 설명하는것을 최적으로 통합하기위해, stacked generalization은  비선형결합 generalizer들을 평균하여 새로운 generalizer를 만들었다. 더 많은 개별 generalizer가 설명해야 할수록 (다른 generalizer가 설명하는 것과 중복되지 않는걸 의미), 더 좋은 결과 stacked generalization을 얻는다.  -Wolpert(1992) Stacked Generaliztion

Blending

Blending 은 Netflix 우승자들에 의해 알려진 단어다. 이것은 stacked generalizaion과 상당히 유사하다. 그러나 정보누출에 대해서 덜 위험하고 약간더 간단한 모형이다. 몇몇 연구자들은 stacked ensembling과 blending을 섞어서 쓴다.

blending은 훈련셋에 대해 out-of-fold prediction을 생성하는것 대신, 훈련셋의 일부로 작은 holdout 셋을 생성한다. 예를들어 훈련셋의 10라고 하자. stacker 모델은 이 holdout셋에 대해서만 훈련을 시킨다.

Blending은 몇몇 장점들을 가진다.

  • stacking 보다 단순하다.
  • 정보 누출을 하지 않는다. : generalizer들과 stacker들은 다른 데이터를 사용한다.
  • 팀원과 몇개의 folds인지 대한 시드를 공유할 필요가 없다. 누구든 blender에 모델들을 넣고 blender가 각 모델을 유지할지 말지를 결정한다.

반대로 단점들은

  • 전체적으로 적은 데이터를 사용한다.
  • 최종모델은 holdout 셋에 과적합됐을수도 있다.
  • CV는 하나의 small holdout셋을 사용하는 것 보다.(더 많이 fold될수록) stacking과 더 잘 맞는다.

성능에 대해서, stacking 과 blending 모두 유사한 결과를 줄 수도 있다. 그리고 어느 모델과 방법을 고를지는 선호의 문제인것 처럼 보인다. 필자는 stacking을 선호한다.

만약 여러분이 둘 중 하나를 선택할 수 없다면, 두개를 항상 모두 사용할 수 있다. stacked generalization과 CV 예측을 이용한 stacked endsemble들을 만들고 난 후 3번째 단계에서, 이 모델들을 더 결합하기 위해, 홀드아웃기법을 사용해라.


Stacking with logistic regression

Stacking with logistic regression은 가장 기본적이면서 전통적인 stacking 방법들중 하나이다.  Emanuele Olivetti의 script가 이해를 도왔다.

test셋에 대해 예측을 할때, 한번에 할 수도 있지만 CV를 사용한 예측치들을 평균하는 방법도 사용할 수 있다. 평균을 취하는것이 깔끔하고 더 정확한 방법일수도 있지만, 필자는 코딩과 모델 복잡성을 약간 낮추기 때문에, 한번에 하는것을 여전히 선호한다.

Kaggle use: “Papirusy z Edhellond”


필자는 Emanuele의 blending 모델을 inClass competition에서 사용했었다. 8개의 base 모델들을 logistic 회귀로 stacking 하여 내 2번째 최고 성능(0.99409 accuracy)을 내었다. 이 성능은 일등을 하기에 충분했다.


Kaggle use: KDD-cup 2014


이 스크립트를 사용하여, Yan Xu의 모델을 향상시킬수 있었다. stacking 전의 성능은 ~0.605 AUC 였고 stacking 후의 성능은 ~0.625 AUC 으로 향상되었다.


Stacking with non-linear algorithms


stacking에서 가장 인기있는 비선형 알고리즘들은 GBM, KNN, NN, RF, 그리고 ET 이다. 다계층문제(multiclass problem)에서 본래변수(origianl features)들을 가진 비선형 stacking은 놀라운 성과를 낸다. 명백하게도, first-stage 예측들은 매우 유용하고 높은 변수중요도(feature importance)를 얻는다. 비선형 알고리즘들은 본래변수들과 메타모델 변수들사이에서 강력한 상호작용을 찾아낼 수 있다.


Kaggle use: TUT Headpose Estimation Challenge


 TUT Headpose Estimation  대회는 다계층-다중라벨(multiclass-multilabel) 분류대회이다. (참고)

각 라벨마다, 다른 앙상블 모형이 훈련된다. 다음 표는 개별모형을 훈련시킨 결과와 ET(Extremely randomized Tree model)을 사용해 예측한 클래스확률을 stacking 할때의 향상된 스코어를 보여준다.


MODELPUBLIC MAEPRIVATE MAE
Random Forests 500 estimators6.1566.546
Extremely Randomized Trees 500 estimators6.3176.666
KNN-Classifier with 5 neighbors6.8287.460
Logistic Regression6.6946.949
Stacking with Extremely Randomized Trees4.7724.718


표준모델들로 stacked generalization을 한 모델이 각 표준모형들 보다 약 30%정도까지 더 오차를 줄일 수 있다!

자세한 사항은 이 논문을 읽어 보기 바란다. :  Computer Vision for Head Pose Estimation: Review of a Competition.


Code


여러분은 CV예측을 만들수 있는 함수를 MLWave 깃허브에서 찾을 수 있습니다. 여러분이 blended 데이터셋을 얻기 위해서 numpy horizontal stacking(hstack)을 사용하여 만들 수도 있습니다.


Feature weighted linear stacking


Feature-weighted linear stacking은 조정된 메타피쳐들을 모델예측치들과 함께 쌓는다. 이 모델의 목적은 스택킹모델이 어느 base 모델이 특정 변수값을 가진 표본들에 대해서 가장 성능이 좋은 모델인지를 학습하는것이다. 선형 알고리즘들은 결과 모델을 빠르고 간단하게 점검하도록 하기위해 사용된다.

Blended prediction

Vowpal Wabbit은 만약 우리가 다음과 같은 훈련셋을 가지고 있다면, 독창적인 feature-weighted linear stacking을 만들 수 있다고 했다.

1 |f f_1:0.55 f_2:0.78 f_3:7.9 |s RF:0.95 ET:0.97 GBM:0.92

우리는 2차 변수 상호작용식,  fs을 s 피쳐공간과 f 피쳐공간사이에 추가시킬수 있다. f 이름공간에 있는 변수들은 논문에서와 같이 조저오딘 메타피쳐들 될수도 혹은 본래피쳐들(original features)이 될 수도 있습니다.


Quadratic linear stacking of models


이건 이름이 없어서 ,사실 필자가 만든 이름이다. 이건 feature-weighted linear stacking과 매우 유사하나 예측치들의 조합들을 생성한다. 이것은 많은 실험에서 스코어를 향상시켰다. 가장 잘 알려진 실험은  DrivenData의 Modeling Women’s Healthcare Decision competition  이다.

전과 같은 VW 훈련셋을 사용하여

1 |f f_1:0.55 f_2:0.78 f_3:7.9 |s RF:0.95 ET:0.97 GBM:0.92

우리는  ss로 모델 예측사이의 2차 피쳐상호작용식(RF*GBM)을 생성하여 모델을 훈련할 수 있다. 이것은 feature-weighted linear stacking과 쉽게 결합될 수 있다. (fs , ss 둘 다 향상시킬수 있다.)


이제 여러분은 많은 base 모델들이 어디서 만들어져야 하는지에 대한 한 예를 봤다. 여러분은 base 모델들 중 apriori 알고리즘이 마지막 메타 모델에서 도움이 될거란 걸 모른다. two stage 모델의 경우에, 아주 약한 성능을 내는 base 모델들이 선호된다.


그러면 왜 이 base 모델들을 정말 조정해야 하는걸까? 아마도 tuning이 여기서는 단지 모델의 다양성을 얻기 위한것일 뿐이다. 하지만 후에 여러분은 어느 base 모델이 도움이 되는지 모를것이고 그리고 마지막 단계에서는 선형이 될것이다. (즉 tuning이 필요하지 않거나 sparsity를 주는 한개의 파라미터가 필요하다.) - Mike KimTuning doesn’t matter. Why are you doing it?


Stacking classifiers with regressors and vice versa


stacking은 회귀문제에 대해 분류기를 사용할수 있게 해주거나 혹은 그 반대를 가능하게 해준다. 예를 들어, 2진 분류문제에 대해서 분위수 회귀(quantile regression)을 base model로 시도해 볼수도 있다. 비록 회귀가 최고의 분류기가 아닐지라도, 하나의 좋은 stacker는 예측들로부터 정보를 캐낼수 있어야 한다.

보통 회귀문제들에 대한 분류기들은 약간 더 복잡하다. 먼저 구간화(binning)을 하고 종속변수(y-label)을 고르게 간격을 둔 class로 변환시킨다. 임금을 예측하는 회귀문제는 multiclass 분류문제로 변환시킬 수 있다.

  • 2만달러 미만은 class1.
  • 2만에서 4만달러 사이는 class2.
  • 4만 달러 초과는 class 3.

이 class들에 대한 예측확률은 stacking 회귀가 더 좋은 예측을 할수있도록 도와준다.


"나는 CV 예측치들 없이는, 어느곳도 가지 않을거야. 만약 내가 하와이를 가든 화장실을 가든 CV예측치를 가지고 갈꺼야! 왜냐하면 언제 2번째나 3번째 level의 메타-분류기를 훈련시켜야 하는지 모르기 때문이야.  " - T. Sharf


Stacking unsupervised learned features


우리가 stacking을 할때 지도학습테크닉만 사용하라는 법은 없다. 여러분들은 비지도학습테크닉들 또한 사용할 수 있다.
K-Means 클러스터링은 여기서 나올법한 가장 인기있는 테크닉이다. Sofia-ML은 여기에 적합한 fast online k-means 알고리즘이다.

또 하나의 흥미로운 알고리즘은  t-SNE이다. t-SNE로 데이터셋을 2 또는 3차원으로 줄여 이를 비선형 stacker에 쌓는다. stacking 또는 blending을 위해 holdout을 사용하는게 안전해 보인다.  Mike Kim의 t-SNE벡터들과 XGBoost를 사용한 솔루션을 참고해라. -  ‘0.41599 via t-SNE meta-bagging‘.

t-SNE
Piotr이 Otto Product Classification 대회 데이터셋에 t-SNE의 결과를 잘 시각화해 보여준다.


Online Stacking


나는 online stacking에 대해 하나 생각해 놓은게 있어, 이 주제에 대해 많은 시간을 쏟는다. : 먼저 이진표현으로부터 작은 fully random tree들을 생성한다. 나무가 올바른 예측을 할때 profit을 더하거나 빼라. 이제 최대로 이윤이 나는 트리와 가장 이윤이 적은 트리를 고른다. 그 다음 이 트리들을 피쳐로 사용한다.

이 방식은 인공적으로 만든 데이터에서는 작동했다. 예를 들어 online random tree stacking을 이용한 선형 퍼셉트론은 비선형 XOR 문제를 학습할 수 있었다. 그러나 내가 시도한 실제 데이터에서는 잘 먹히지 않았다. 따라서 이제부터는 새로운 알고리즘을 인공적인 데이터셋에만 적용한 논문들은 약간의 의심의 눈초리로 봐야할 것이다.

유사한 아이디가 여기에서는 작동했다. : random bit regression. 많은 random linear function들은 위의 과정으로부터 나온 피쳐들로부터 생성됐다. 최고의 모델은 큰 regularization을 적용했을때 나왔다. 이 방법을 가지고 몇몇 데이터셋에 적용해 볼것이다. 이에 대해서 나중에 포스팅 할것이다.

(준, semi-) online stacking에 대한 더 구체적인 예제는 광고 클릭횟수 예측이다. 최근 데이터에 훈련시킨 모델들이 여기서 더 좋은 성능을 냈다. 따라서 데이터셋이 일시적인 효과를 가질때, 전체 데이터셋을 훈련하기 위해  Vowpal Wabbit 를 사용할 수 있다. 최신 데이터에 대해서는 XGBoost같은 복잡하고 강력한 툴을 사용할 수 있다. 

"실제세계는 복잡하다, 따라서 다른 모델들을 앙상블링하는 것은 이러한 복잡성을 더 많이 이해할 수 있다는 특징을 가진다. " - Ben Hamner ‘Machine learning best practices we’ve learned from hundreds of competitions’ (video)

Everything is a hyper-parameter


stacking/bledning/meta-modeling을 할때, 모든 action을 stacker model의 하이퍼파라미터로 생각하는것이 좋다.

예를들어

  • Not scaling the data
  • Standard-Scaling the data
  • Minmax scaling the data

들은 앙상블 성능을 향상시키기 위해 조정되는 하이퍼파라미터들이다, 이와 마찬가지로, base model의 숫자 또한 최적화할 파라미터로 볼 수 있다. Feature selection 또는 imputation들은 메터피쳐들의 다른 예이다.


random gridsearch이 알고리즘 파라미터를 조절하는 좋은 방법이듯, 메타 파라미터들을 조절하는데도 작용한다.


"때때로 XGBoost가 KNN 분류기가 본 것을 보게 해주는것이 유용하다." – Marios Michailidis


Model Selection


다수의 앙상블 모델들을 결합하여 성능을 더 향상시킬 수 있다.


  • 즉각적인 방법 : 성능이 좋은 앙상블을 직접 선택한 것에 평균, 보팅 또는 순위평균
  • Greedy forward model selection (Caruana et al.). 3개 이상의 좋은 모델의 base 앙상블로 시작. train 데이터 셋의 스코어가 최고치일때 모델을 하나 더 추가. 모델을 빼는것도 허용되기 때문에, 단일 모델이 여러번 선택될 수도 있다. 
  • Genetic model selection 은 유전 알고리즘과 CV-스코어를 적합함수로 사용한다. 예를 들어  inversion의 솔루션을 보자  - ‘Strategy for top 25 position‘.
  • Caruana’s method을 참고해 random method를 사용한다. : 100개 이상의 앙상블을 제거없이(without placeback)임의적으로 선택하여 만든다. 그 다음 최고로 높은 스코어를 내는 모델을 선택한다.

Automation


 Otto product classification 대회에서 stacking을 사용했을때, 나는 top10에 빠르게 진입할 수 있었다. 더 많은 base 모델들과 다수의 stacking을 배깅하여, 나의 스코어를 계속 향상시킬 수 있었다. 만들기 시작하기도 겁나는, 7개의 base 모델들이 있는 6개의 stacker를 본적이 있었다. 내가 이걸 따라 할 수 있을까? 이 복잡하고 다루기 힘든 모델은 빠르고 간단한 머신러닝을 추구하는 나의 영역에서 벗어난 모형이었다.


나는 stacking을 자동화하는 방법을 연구하며 나머지 시간을 보냈다. base모델들을 순수한 random parameter를 사용한 순수한 random algorithm으로 훈련시켰다. Wrapper들은 scikit-learn API와 잘 작동되는  VW, Sofia-ML, RGF, MLP 그리고 XGBoost 같은 분류기들을 만들기 위해 써졌다.


Whiteboard automated stacking
The first whiteboard sketch for a parallelized automated stacker with 3 buckets


stacker들로, base model의 random subset과 random parameter를 사용한 SVM, RF, ET, GBM 그리고 XGB를 사용했다.

마침내,생성된 stacker들을 그들의 훈련셋의 CV 예측들이 더 작은 손실/비용을 낼 때, 평균한다.

대회가 끝나기 일주일 전까지 이 automated stacker는 57위를 했다.이 모델은 나의 최종 앙상블 모델에 기여했다. 이 모델과 유일하게 다른 점은 feature selecting과 파라미터 튜닝에 절대 시간을 쓰지 않았다는 것이다. 모델을 돌려놓고 잠자고 일어나면 좋은 결과가 나왔었다.


Otto Leaderboard

The automated stacker is able to get a top 10% score without any tuning or manual model selection on a competitive task with over 3000 competitors.

automated stacking은 내가 최근 가진 큰 관심사들중 하나이다. 다음 몇몇 포스팅에서 이에 대해 다룰것이다. automatic stacking의 가장 좋은 결과는 TUT Headpose Estimation challenge 에서 나왔다. 이 black-box모형은 특정 문제에 특화된 알고리즘을 만드는 도메인 전문가들에 의해 만들어진 최신 모델을 꺾었다.

Tut headpose leaderboard

여기서 주목할 것은, 이것은 multi-label classification문제였다. "yaw" 와 "pitch" 둘에 대한 예측들이 필요했다. "yaw"와 "pitch" 가 상호연관되어 있기 때문에, "yaw"에 대한 예측들과 한 모델을 stacking 하는것이 "pitch"에 대한 예측 정확도를 높였다. 역으로도 같은 결과가 나온다. 매우 흥미로운 결과였다.


하나의 네트워크로써 시각화된 모델들은 back-propagation을 사용해 훈련시킬 수 있다. 그러면 stacker 모델들은 어느 base model들이 오차를 가장 많이 줄이는지 학습하게 된다.


Ensemble Network


CV-scores를 낸 다음에, 시각화 된 모델들은 CV-scores의 표준편차를 설명할수 있다. (더 작은 편차가 더 안전한 선택이다.) 또한 복잡성과 메모리 사용량 그리고 실행시간을 최적화하는 것을 볼 수 있다. 마지막으로 상관관계가 만들어 지는 것을 볼수 있다. 앙상블을 만들때 상관관계가 낮은 모델을 선호하도록 코딩할 수 있다.


전체 automated stacking pipeline은 병렬 분산화 될수 있다. 이것은 속도향상과 한 컴퓨터에서 더 빠른 좋은 결과를 가져온다.


Contextual bandit optimization 은 fully random gridsearch의 좋은 대체방법같아 보인다. 우리는 알고리즘이 좋은 파라미터와 모델들을 만들어 내길 원하고 우리의 알고리즘에 지난번 선택한 random SVM이 메모리를 다 사용해버린 것을 기억하길 원한다. 이것에 대해서는 나중에 더 자세히 다를것이다.

반면, 이를 MLWave github repo에서 미리 볼수 있다. :“Hodor-autoML“.


Otto product classification challenge의 1,2등은 1000개 이상의 다른 모델들들을 앙상블로 사용하였다. 여기서 더 자세한 사항을 볼 수 있다.  first place / second place


Why create these Frankenstein ensembles?


여러분은 왜 이 예제가 무용지물인지 궁금할 지도 모른다. 즉 stacking 과 1000개 정도의 모델을 조합하는것 그리고 계산시간 또한 미치도록 오래 걸릴것이다. 그러나 monster 앙상블은 계속 쓰이고 있다..

  • You can win Kaggle competitions.
  • You can beat most state-of-the-art academic benchmarks with a single approach.
  • You can then compare your new-and-improved benchmark with the performance of a simpler, more production-friendly model
  • One day, today’s computers and clouds will seem weak. You’ll be ready.
  • It is possible to transfer knowledge from the ensemble back to a simpler shallow model (Hinton’s Dark Knowledge, Caruana’s Model Compression)
  • Not all base models necessarily need to finish in time. In that regard, ensembling introduces a form of graceful degradation: loss of one model is not fatal for creating good predictions.
  • Automated large ensembles ward against overfit and add a form of regularization, without requiring much tuning or selection. In principle stacking could be used by lay-people.
  • It is currently one of the best methods to improve machine learning algorithms, perhaps telling use something about efficient human ensemble learning.
  • A 1% increase in accuracy may push an investment fund from making a loss, into making a little less loss. More seriously: Improving healthcare screening methods helps save lives.

Update: Thanks a lot to Dat Le for documenting and refactoring the code accompanying this article. Thanks to Armando Segnini for adding weighted averaging. Thanks a lot everyone for the encouraging comments. My apologies if I have forgotten to link to your previous inspirational work. Further reading at “More is always better – The power of Simple Ensembles” by Carter Sibley, “Tradeshift Benchmark Tutorial with two-stage SKLearn models” by Dmitry Dryomov, “Stacking, Blending and Stacked Generalization” by Eric Chio, Ensemble Learning: The wisdom of the crowds (of machines) by Lior Rokach, and “Deep Support Vector Machines” by Marco Wiering.

Terminology: When I say ensembling I mean ‘model averaging’: combining multiple models. Algorithms like Random Forests use ensembling techniques like bagging internally. For this article we are not interested in that.

The intro image came from WikiMedia Commons and is in the public domain, courtesy of Jesse Merz.