Scikit learn 使用xgboost进行校准

Scikit learn 使用xgboost进行校准,scikit-learn,xgboost,Scikit Learn,Xgboost,我想知道我是否可以在xgboost中进行校准。更具体地说,xgboost是否与scikit learn中的现有校准实现类似,或者是否有一些方法将xgboost中的模型放入scikit learn的校准分类RCV中 据我所知,在sklearn中,这是常见的程序: # Train random forest classifier, calibrate on validation data and evaluate # on test data clf = RandomForestClassifier

我想知道我是否可以在xgboost中进行校准。更具体地说,xgboost是否与scikit learn中的现有校准实现类似,或者是否有一些方法将xgboost中的模型放入scikit learn的校准分类RCV中

据我所知,在sklearn中,这是常见的程序:

# 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
如果我将xgboost树模型放入校准的ClassifiedRCV,将抛出一个错误(当然):

运行时错误:分类器没有决策函数或预测概率方法。

有没有办法将scikit learn的优秀校准模块与xgboost集成


欣赏你的见解

回答我自己的问题,xgboost GBT可以通过编写如下所示的包装器类与scikit learn集成

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
请参阅完整示例


请不要犹豫,提供一种更聪明的方法

2020年7月《地狱风景》中的一条注释:

您不再需要包装器类。predict_proba方法内置于xgboost sklearn python API中。不确定它们是什么时候添加的,但它们肯定是在v1.0.0上出现的


注意:这当然只适用于使用predict_proba方法的类。例:XGBR回归器没有。XGBClassifier确实如此。

干得不错。我发现,直接优化logloss的技术(如xgboost)的额外校准不会产生太多的效果。随机森林和支持向量机是高分辨分类器的已知罪魁祸首,但由于它们优化了不同的东西,因此可以使用一些校准。干得好