2016-02-23 15 views
5

Zastanawiam się, czy mogę wykonać kalibrację w xgboost. Mówiąc dokładniej, czy Xgboost ma istniejącą implementację kalibracji, jak w scikit-learn, czy też są sposoby na umieszczenie modelu z xgboost w CalibratedClassifierCv scikit-learn?Kalibracja za pomocą xgboost

O ile wiem, w sklearn to wspólna procedura:

# Train random forest classifier, calibrate on validation data and evaluate 
# on test data 
clf = RandomForestClassifier(n_estimators=25) 
clf.fit(X_train, y_train) 
clf_probs = clf.predict_proba(X_test) 
sig_clf = CalibratedClassifierCV(clf, method="sigmoid", cv="prefit") 
sig_clf.fit(X_valid, y_valid) 
sig_clf_probs = sig_clf.predict_proba(X_test) 
sig_score = log_loss(y_test, sig_clf_probs) 
print "Calibrated score is ",sig_score 

Gdybym położyć drzewo modelu xgboost do CalibratedClassifierCV błąd zostanie wyrzucony (oczywiście):

RuntimeError: classifier has no decision_function or predict_proba method.

Czy istnieje sposób na integrację doskonałego modułu kalibracyjnego scikit-learn z xgboost?

Doceń swoje wnikliwe pomysły!

Odpowiedz

4

Odpowiadając na moje własne pytanie, Xgboost GBT można zintegrować z nauką scikit-learning, pisząc klasę opakowania, taką jak poniższy przypadek.

class XGBoostClassifier(): 
def __init__(self, num_boost_round=10, **params): 
    self.clf = None 
    self.num_boost_round = num_boost_round 
    self.params = params 
    self.params.update({'objective': 'multi:softprob'}) 

def fit(self, X, y, num_boost_round=None): 
    num_boost_round = num_boost_round or self.num_boost_round 
    self.label2num = dict((label, i) for i, label in enumerate(sorted(set(y)))) 
    dtrain = xgb.DMatrix(X, label=[self.label2num[label] for label in y]) 
    self.clf = xgb.train(params=self.params, dtrain=dtrain, num_boost_round=num_boost_round) 

def predict(self, X): 
    num2label = dict((i, label)for label, i in self.label2num.items()) 
    Y = self.predict_proba(X) 
    y = np.argmax(Y, axis=1) 
    return np.array([num2label[i] for i in y]) 

def predict_proba(self, X): 
    dtest = xgb.DMatrix(X) 
    return self.clf.predict(dtest) 

def score(self, X, y): 
    Y = self.predict_proba(X) 
    return 1/logloss(y, Y) 

def get_params(self, deep=True): 
    return self.params 

def set_params(self, **params): 
    if 'num_boost_round' in params: 
     self.num_boost_round = params.pop('num_boost_round') 
    if 'objective' in params: 
     del params['objective'] 
    self.params.update(params) 
    return self 

Zobacz pełny przykład here.

Proszę nie wahać się, aby zapewnić bardziej inteligentny sposób robienia tego!

+0

Dobra robota. Odkryłem, że dodatkowa kalibracja technik, w których logopedia jest bezpośrednio zoptymalizowana (jak Xgboost), nie daje tak wiele. Losowe lasy i SVM są znanymi sprawcami wysoce dyskryminacyjnych klasyfikatorów, ale ponieważ optymalizują różne rzeczy, mogą korzystać z niektórych kalibracji. Dobra robota –