Stacking을 위한 패키지 vecstack


stacking을 쉽게 할 수 있는 패키지가 있을까 해서 찾아보았는데 역시 이미 여러개가 있었다.. 여러가지 패키지중에 vecstack이 사용하기 쉬워보였는데, 매우 간단한 코드로 stacking을 구현할 수 있었다. vectstack은 아래와 같이 선택된 모델마다 "K-fold  averaging prediction" (이 명명법이 맞는지 모르겠지만, K-fold로 K번 prediction을 한 후 이 예측치들의 평균을 결과 예측치로 내놓는 방법을 뜻한다.) 을 한 후 이 결과를 앙상블하여 최종 예측 결과를 내놓게 된다. 결론적으로 stacking에 5개의 모델이 쓰이고 3-fold라면 총 15번 fitting을 하고 5개의 모델에 대한 5번의 예측결과가 나오고 다시 이것을 최종 classifier에 통과시켜 최종 prediction을 만들게 된다. 이러한 과정을 실제 코드로 구현하기는 어렵지는 않지만 코드의 양이 많아질 수도 있다.




이러한 stacking을 vecstack은 간단하게 구현한다. 단순히 모델을 정의하고, 모델들의 리스트와 train_x, train_x, test_x만 넣어주면 된다. 그러면 그 안에서 모델들에 대해 k-fold averaging prediction을 수행하며, 이를 통해 트레이닝셋과 테스트셋에 대해 각각 예측 결과 4개씩을 내놓는다. 그게 S_train, S_test이며 다시 이를 최종 classifier로 학습시켜 최종 예측 결과를 내놓게 된다. 하지만 sklearn 형식의 모델만 stacking에 활용할 수 있는 것 같다. 그것이 단점이지만 sklearn의 패키지만으로도 충분히 좋은 예측 결과를 내놓을 수 있기 때문에 stacking을 간단하게 적용해보기에 좋은 패키지인 것 같다.

from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score from sklearn.ensemble import ExtraTreesClassifier from sklearn.ensemble import RandomForestClassifier from xgboost import XGBClassifier from vecstack import stacking # Load demo data iris = load_iris() X, y = iris.data, iris.target # Make train/test split # As usual in machine learning task we have X_train, y_train, and X_test X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0) # Caution! All models and parameter values are just # demonstrational and shouldn't be considered as recommended. # Initialize 1-st level models. models = [ ExtraTreesClassifier(random_state = 0, n_jobs = -1, n_estimators = 100, max_depth = 3), RandomForestClassifier(random_state = 0, n_jobs = -1, n_estimators = 100, max_depth = 3), XGBClassifier(seed = 0, n_jobs = -1, learning_rate = 0.1, n_estimators = 100, max_depth = 3)] # Compute stacking features S_train, S_test = stacking(models, X_train, y_train, X_test, regression = False, metric = accuracy_score, n_folds = 4, stratified = True, shuffle = True, random_state = 0, verbose = 2) # Initialize 2-nd level model model = XGBClassifier(seed = 0, n_jobs = -1, learning_rate = 0.1, n_estimators = 100, max_depth = 3) # Fit 2-nd level model model = model.fit(S_train, y_train) # Predict y_pred = model.predict(S_test) # Final prediction score print('Final prediction score: [%.8f]' % accuracy_score(y_test, y_pred))

코드 출처

https://github.com/vecxoz/vecstack



실행결과

task:   [classification]
metric: [accuracy_score]

model 0: [ExtraTreesClassifier]
    fold 0: [0.93548387]
    fold 1: [0.96666667]
    fold 2: [1.00000000]
    fold 3: [0.89655172]
    ----
    MEAN:   [0.95000000]

model 1: [RandomForestClassifier]
    fold 0: [0.87096774]
    fold 1: [0.96666667]
    fold 2: [1.00000000]
    fold 3: [0.93103448]
    ----
    MEAN:   [0.94166667]

model 2: [XGBClassifier]
    fold 0: [0.83870968]
    fold 1: [0.93333333]
    fold 2: [1.00000000]
    fold 3: [0.93103448]
    ----
    MEAN:   [0.92500000]
    
Final prediction score: [0.96666667]



'Hard skills > Kaggle' 카테고리의 다른 글

Stacking을 위한 패키지 vecstack  (0) 2017.10.18
Stacking 사용할 때 가이드  (0) 2017.10.15