2017-12-14 39 views
0

저는 H2O가 Python에서 처음입니다. H2O 웹 사이트의 예제 코드에 따라 앙상블 모델을 사용하여 데이터를 모델링하려고합니다. (http://docs.h2o.ai/h2o/latest-stable/h2o-docs/data-science/stacked-ensembles.html)fold_column 인수가있는 H2O의 앙상블 모델

기본 모델로 GBM과 RF를 적용했습니다. 그리고 스태킹을 사용하여 앙상블 모델로 병합하려고했습니다. 또한, 훈련 데이터에 'fold'라는 이름의 열을 추가로 만들었습니다. fold_column = "fold"

10 배의 CV를 적용했는데 cv1에서 결과를 얻었습니다. 그러나 모든 예측은 다른 9 개의 CVS에서 나오며 비어 있습니다. 내가 여기서 무엇을 놓치고 있니? 여기

내 샘플 데이터입니다 :

enter image description here

코드 :

import h2o 
from h2o.estimators.random_forest import H2ORandomForestEstimator 
from h2o.estimators.gbm import H2OGradientBoostingEstimator 
from h2o.estimators.stackedensemble import H2OStackedEnsembleEstimator 
from h2o.grid.grid_search import H2OGridSearch 
from __future__ import print_function 

h2o.init(port=23, nthreads=6) 

train = h2o.H2OFrame(ens_df) 
test = h2o.H2OFrame(test_ens_eq) 

x = train.drop(['Date','EQUITY','fold'],axis=1).columns 
y = 'EQUITY' 

cat_cols = ['A','B','C','D'] 
train[cat_cols] = train[cat_cols].asfactor() 
test[cat_cols] = test[cat_cols].asfactor() 

my_gbm = H2OGradientBoostingEstimator(distribution="gaussian", 
             ntrees=10, 
             max_depth=3, 
             min_rows=2, 
             learn_rate=0.2, 
             keep_cross_validation_predictions=True, 
             seed=1) 

my_gbm.train(x=x, y=y, training_frame=train, fold_column = "fold") 

가 그럼 난

my_gbm.cross_validation_predi와 이력서 결과를 확인 ctions() :

# Train a stacked ensemble using the GBM and GLM above 
ensemble = H2OStackedEnsembleEstimator(model_id="mlee_ensemble", 
             base_models=[my_gbm, my_rf]) 
ensemble.train(x=x, y=y, training_frame=train) 

# Eval ensemble performance on the test data 
perf_stack_test = ensemble.model_performance(test) 

pred = ensemble.predict(test) 
pred 

/mgmt/data/conda/envs/python3.6_4.4/lib/python3.6/site-packages/h2o/job.py:69: UserWarning: Test/Validation dataset is missing column 'fold': substituting in a column of NaN 
    warnings.warn(w) 

내가 fold_column에 대해 뭔가를 놓치고 있습니까 : 나는 테스트 세트에서 앙상블을하려고 할 때

enter image description here

플러스 나는 아래의 경고가 얻을?

+0

공개적으로 사용 가능한 데이터 세트를 사용하도록 예제를 수정할 수 있습니까? https://stackoverflow.com/help/mcve 또한 CV 프리젠 테이션을 확인하는 방법을 보여주십시오. 여기에서하는 일을 보여주는 코드는 없습니다. –

+0

@ErinLeDell CV pred와 관련된 행을 넣습니다. 또한 샘플 데이터 세트를 만드는 동안 작은 질문이 하나 있습니다. 샘플 코드에서 fold_column에 임의의 숫자를 할당하는'cars.kfold_column (n_folds = 5, seed = 1234) '를 사용하는 것으로 나타났습니다. 난수를 할당하는 대신 fold_column에 데이터 (목록 등)를 사용하고 싶습니다. 예를 들어. 나는 train [ 'fold']. kfold_column()'을 시도했지만 여전히 난수를 할당한다. kfold_column에 데이터를 어떻게 추가 할 수 있습니까?아니면'kfold_column'을 사용하지 않고도 훈련 세트에 'fold'열만 있으면됩니다. –

답변

1

다음은 목록에서 생성 된 사용자 정의 폴드 열을 사용하는 방법의 예입니다. 이것은 H2O 사용자 가이드의 누적 형 앙상블 페이지에있는 example Python code의 수정 된 버전입니다.

import h2o 
from h2o.estimators.random_forest import H2ORandomForestEstimator 
from h2o.estimators.gbm import H2OGradientBoostingEstimator 
from h2o.estimators.stackedensemble import H2OStackedEnsembleEstimator 
from h2o.grid.grid_search import H2OGridSearch 
from __future__ import print_function 
h2o.init() 

# Import a sample binary outcome training set into H2O 
train = h2o.import_file("https://s3.amazonaws.com/erin-data/higgs/higgs_train_10k.csv") 

# Identify predictors and response 
x = train.columns 
y = "response" 
x.remove(y) 

# For binary classification, response should be a factor 
train[y] = train[y].asfactor() 

# Add a fold column, generate from a list 
# The list has 10 unique values, so there will be 10 folds 
fold_list = list(range(10)) * 1000 
train['fold_id'] = h2o.H2OFrame(fold_list) 


# Train and cross-validate a GBM 
my_gbm = H2OGradientBoostingEstimator(distribution="bernoulli", 
             ntrees=10, 
             keep_cross_validation_predictions=True, 
             seed=1) 
my_gbm.train(x=x, y=y, training_frame=train, fold_column="fold_id") 

# Train and cross-validate a RF 
my_rf = H2ORandomForestEstimator(ntrees=50, 
           keep_cross_validation_predictions=True, 
           seed=1) 
my_rf.train(x=x, y=y, training_frame=train, fold_column="fold_id") 

# Train a stacked ensemble using the GBM and RF above 
ensemble = H2OStackedEnsembleEstimator(base_models=[my_gbm, my_rf]) 
ensemble.train(x=x, y=y, training_frame=train) 

모델에서 교차 유효성 검사 예측을 보는 방법에 대한 두 번째 질문에 답변 해주십시오. 그들은 두 위치에 저장됩니다, 그러나, 당신은 아마 사용할 방법은 다음과 같습니다

In [11]: my_gbm.cross_validation_holdout_predictions() 
Out[11]: 
    predict  p0  p1 
--------- -------- -------- 
     1 0.323155 0.676845 
     1 0.248131 0.751869 
     1 0.288241 0.711759 
     1 0.407768 0.592232 
     1 0.507294 0.492706 
     0 0.6417 0.3583 
     1 0.253329 0.746671 
     1 0.289916 0.710084 
     1 0.524328 0.475672 
     1 0.252006 0.747994 

[10000 rows x 3 columns] 

: .cross_validation_holdout_predictions()이 방법은 훈련 관측의 원래 순서, 교차 검증 예측의 단일 H2OFrame을 반환 두 번째 방법 인 .cross_validation_predictions()은 원래 학습 프레임과 동일한 행 수를 갖는 H2OFrame의 각 폴드에서 예측을 저장하는 목록이지만 해당 폴드에서 활성 상태가 아닌 행은 0 값을 갖습니다. 이것은 일반적으로 사람들이 가장 유용하다고 생각하는 형식이 아니기 때문에 다른 방법을 대신 사용하는 것이 좋습니다.

In [13]: type(my_gbm.cross_validation_predictions()) 
Out[13]: list 

In [14]: len(my_gbm.cross_validation_predictions()) 
Out[14]: 10 

In [15]: my_gbm.cross_validation_predictions()[0] 
Out[15]: 
    predict  p0  p1 
--------- -------- -------- 
     1 0.323155 0.676845 
     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 rows x 3 columns]