2016-10-28 4 views
3

에서 xgboost.cv에서 예측, 내가 predictions=TRUE을 지정할 수 있습니다 가져 오기 :예를 들어, 교차 검증하는 동안 밖으로의 배 예측을 저장하는 아웃 - 오브 - 배은 R xgboost 패키지에서 파이썬

library(xgboost) 
data(mtcars) 
xgb_params = list(
    max_depth = 1, 
    eta = 0.01 
) 
x = model.matrix(mpg~0+., mtcars) 
train = xgb.DMatrix(x, label=mtcars$mpg) 
res = xgb.cv(xgb_params, train, 100, prediction=TRUE, nfold=5) 
print(head(res$pred)) 

방법 나는 파이썬 패키지에서 동등한 일을 할 수 있을까? 파이썬에서 xgboost.cv에 대한 prediction 인수를 찾을 수 없습니다.

+0

지금은 수동으로'sklearn.cross_validation.KFold'를 사용하고 있습니다. 그러나 저는 게으르며'xgb.cv'로 원하는 것을 할 수있는 방법이 있다면 그것을하고 싶습니다. – Zach

답변

8

이것이 원하는지 잘 모르겠지만 xgboost에 대한 sklearn 래퍼를 사용하여이 작업을 수행 할 수 있습니다. (홍채 데이터 세트를 회귀 문제로 사용하고 있음을 알고 있습니다. 삽화를 위해이다).

import xgboost as xgb 
from sklearn.cross_validation import cross_val_predict as cvp 
from sklearn import datasets 
X = datasets.load_iris().data[:, :2] 
y = datasets.load_iris().target 
xgb_model = xgb.XGBRegressor() 
y_pred = cvp(xgb_model, X, y, cv=3, n_jobs = 1) 
y_pred 


array([ 9.07209516e-01, 1.84738374e+00, 1.78878939e+00, 
     1.83672094e+00, 9.07209516e-01, 9.07209516e-01, 
     1.77482617e+00, 9.07209516e-01, 1.75681138e+00, 
     1.83672094e+00, 9.07209516e-01, 1.77482617e+00, 
     1.84738374e+00, 1.84738374e+00, 1.12216723e+00, 
     9.96944368e-01, 9.07209516e-01, 9.07209516e-01, 
     9.96944368e-01, 9.07209516e-01, 9.07209516e-01, 
     9.07209516e-01, 1.77482617e+00, 8.35850239e-01, 
     1.77482617e+00, 9.87186074e-01, 9.07209516e-01, 
     9.07209516e-01, 9.07209516e-01, 1.78878939e+00, 
     1.83672094e+00, 9.07209516e-01, 9.07209516e-01, 
     8.91427517e-01, 1.83672094e+00, 9.09049034e-01, 
     8.91427517e-01, 1.83672094e+00, 1.84738374e+00, 
     9.07209516e-01, 9.07209516e-01, 1.01038718e+00, 
     1.78878939e+00, 9.07209516e-01, 9.07209516e-01, 
     1.84738374e+00, 9.07209516e-01, 1.78878939e+00, 
     9.07209516e-01, 8.35850239e-01, 1.99947178e+00, 
     1.99947178e+00, 1.99947178e+00, 1.94922602e+00, 
     1.99975276e+00, 1.91500926e+00, 1.99947178e+00, 
     1.97454870e+00, 1.99947178e+00, 1.56287444e+00, 
     1.96453893e+00, 1.99947178e+00, 1.99715066e+00, 
     1.99947178e+00, 2.84575284e-01, 1.99947178e+00, 
     2.84575284e-01, 2.00303388e+00, 1.99715066e+00, 
     2.04597521e+00, 1.99947178e+00, 1.99975276e+00, 
     2.00527954e+00, 1.99975276e+00, 1.99947178e+00, 
     1.99947178e+00, 1.99975276e+00, 1.99947178e+00, 
     1.99947178e+00, 1.91500926e+00, 1.95735490e+00, 
     1.95735490e+00, 2.00303388e+00, 1.99975276e+00, 
     5.92201948e-04, 1.99947178e+00, 1.99947178e+00, 
     1.99715066e+00, 2.84575284e-01, 1.95735490e+00, 
     1.89267385e+00, 1.99947178e+00, 2.00303388e+00, 
     1.96453893e+00, 1.98232651e+00, 2.39597082e-01, 
     2.39597082e-01, 1.99947178e+00, 1.97454870e+00, 
     1.91500926e+00, 9.99531507e-01, 1.00023842e+00, 
     1.00023842e+00, 1.00023842e+00, 1.00023842e+00, 
     1.00023842e+00, 9.22234297e-01, 1.00023842e+00, 
     1.00100708e+00, 1.16144836e-01, 1.00077248e+00, 
     1.00023842e+00, 1.00023842e+00, 1.00100708e+00, 
     1.00023842e+00, 1.00077248e+00, 1.00023842e+00, 
     1.13711983e-01, 1.00023842e+00, 1.00135887e+00, 
     1.00077248e+00, 1.00023842e+00, 1.00023842e+00, 
     1.00023842e+00, 9.99531507e-01, 1.00077248e+00, 
     1.00023842e+00, 1.00023842e+00, 1.00023842e+00, 
     1.00023842e+00, 1.00023842e+00, 1.13711983e-01, 
     1.00023842e+00, 1.00023842e+00, 1.00023842e+00, 
     1.00023842e+00, 9.78098869e-01, 1.00023842e+00, 
     1.00023842e+00, 1.00023842e+00, 1.00023842e+00, 
     1.00023842e+00, 1.00023842e+00, 1.00077248e+00, 
     9.99531507e-01, 1.00023842e+00, 1.00100708e+00, 
     1.00023842e+00, 9.78098869e-01, 1.00023842e+00], dtype=float32) 
3

이것은 xgboost.cv()으로 가능하지만 약간 해킹이됩니다. 그것은 콜백을 사용하고 ... 내가 들었던 전역 변수는 바람직하지 않다. 다음과 같이

def oof_prediction(): 
    """ 
    Dirty global variable callback hack. 
    """ 

    global cv_prediction_dict 

    def callback(env): 
     """internal function"""   
     cv_prediction_list = [] 

     for i in [0, 1, 2, 3, 4]: 
      cv_prediction_list.append([env.cvfolds[i].bst.predict(env.cvfolds[i].dtest)]) 

     cv_prediction_dict['cv'] = cv_prediction_list 

    return callback 

이제 우리는 xgboost.cv()에서 콜백을 호출 할 수 있습니다.

cv_prediction_dict = {} 
xgb.cv(xgb_params, train, 100, callbacks=[oof_prediction()]), nfold=5) 
pos_oof_predictions = cv_prediction_dict.copy() 

사용 early_stopping이 경우에도 그것은, 마지막 반복/num_boost_round의 밖으로의 배 예측을 반환합니다. 나는 이것이 R predictions=TRUE 기능 does/did이 올바르게 작동하지 않는다고 생각합니다.


해킹 면책 조항 :이 오히려 해키 알고 있지만 콜백이 작동하는 방법의 불쌍한 내 이해 주위 작품이다. 누구든지 이것을 더 잘 만드는 방법을 알고 있다면 의견을 말하십시오.

+0

예측 된 데이터의 인덱스는 어떻게 얻을 수 있습니까? – Keiku

+0

@Keiku 이것이 내가 가진 문제 중 하나라고 생각합니다. 나는 명령이'cv_prediction_list.append (...) '에 의해 유지되었지만 지금은 기억할 수 없다고 확신한다. – josh

+0

답장을 보내 주셔서 감사합니다. 아마 색인을 얻을 수 없다고 생각했습니다. 결국 나는 sklearn.model_selection.KFold를 사용하여 각 폴드를 예측하기로 결정했습니다. – Keiku