automl / auto-sklearn

Automated Machine Learning with scikit-learn
https://automl.github.io/auto-sklearn
BSD 3-Clause "New" or "Revised" License
7.53k stars 1.27k forks source link

XGboost #636

Closed jianswang closed 4 years ago

jianswang commented 5 years ago

1.) Is there metalearning for XGboost algorithm?

2.) Why does it give predict_proba of nan using XGboost sometimes causing assertion error of "prediction probability does not sum up to 1!"?

        if self.target_type not in ['multilabel-indicator']:
            assert(
                np.allclose(
                    np.sum(pred_proba, axis=1),
                    np.ones_like(pred_proba[:, 0]))
            ), "prediction probability does not sum up to 1!"
mfeurer commented 5 years ago

1) No, XGBoost is not in the meta-learning data. 2) I don't know. I've never seen XGBoost return np.NaN probabilities. Do you have code to reproduce this?

jianswang commented 5 years ago

Code

import sklearn.model_selection
import sklearn.datasets
import sklearn.metrics

import autosklearn.classification

def main():
    X, y = sklearn.datasets.load_breast_cancer(return_X_y=True)
    X_train, X_test, y_train, y_test = \
        sklearn.model_selection.train_test_split(X, y, random_state=1)

    automl = autosklearn.classification.AutoSklearnClassifier(
        disable_evaluator_output=False, ensemble_memory_limit=1024.0,
        ensemble_nbest=50, ensemble_size=50, exclude_estimators=None,
        exclude_preprocessors=None, get_smac_object_callback=None,
        include_estimators=['xgradient_boosting'],
        include_preprocessors=None,
        initial_configurations_via_metalearning=0, logging_config=None,
        ml_memory_limit=3072, n_jobs=None, output_folder=None,
        per_run_time_limit=60, resampling_strategy='cv',
        resampling_strategy_arguments={'folds': 5}, seed=1,
        shared_mode=False, smac_scenario_args=None,
        time_left_for_this_task=600, tmp_folder=None
    )

    # fit() changes the data in place, but refit needs the original data. We
    # therefore copy the data. In practice, one should reload the data
    automl.fit(X_train.copy(), y_train.copy())
    # During fit(), models are fit on individual cross-validation folds. To use
    # all available data, we call refit() which trains all models in the
    # final ensemble on the whole dataset.
    automl.refit(X_train.copy(), y_train.copy())

    print(automl.show_models())

    predictions = automl.predict(X_test)
    prediction_probas=automl.predict_proba(X_test) 
    print("Accuracy score", sklearn.metrics.accuracy_score(y_test, predictions))

if __name__ == '__main__':
    main()

In autosklearn\pipeline\implementations\xgb.py,

    def predict_proba(self, data, output_margin=False, ntree_limit=0):
        test_dmatrix = DMatrix(data, missing=self.missing, nthread=self.n_jobs)
        class_probs = self.get_booster().predict(test_dmatrix,
                                                 output_margin=output_margin,
                                                 ntree_limit=ntree_limit)
        if self.objective == "multi:softprob":
            return class_probs
        else:
            classone_probs = class_probs
            classzero_probs = 1.0 - classone_probs
            print(classone_probs,classzero_probs,'-----------------------------------------------xgb')#added a print here
            return np.vstack((classzero_probs, classone_probs)).transpose()

In xgboost\core.py,

    def predict(self, data, output_margin=False, ntree_limit=0, pred_leaf=False,
                pred_contribs=False, approx_contribs=False, pred_interactions=False,
                validate_features=True):

        option_mask = 0x00
        if output_margin:
            option_mask |= 0x01
        if pred_leaf:
            option_mask |= 0x02
        if pred_contribs:
            option_mask |= 0x04
        if approx_contribs:
            option_mask |= 0x08
        if pred_interactions:
            option_mask |= 0x10

        if validate_features:
            self._validate_features(data)

        length = c_bst_ulong()
        preds = ctypes.POINTER(ctypes.c_float)()
        _check_call(_LIB.XGBoosterPredict(self.handle, data.handle,
                                          ctypes.c_int(option_mask),
                                          ctypes.c_uint(ntree_limit),
                                          ctypes.byref(length),
                                          ctypes.byref(preds)))
        preds = ctypes2numpy(preds, length.value, np.float32)
        if pred_leaf:
            preds = preds.astype(np.int32)
        nrow = data.num_row()
        if preds.size != nrow and preds.size % nrow == 0:
            chunk_size = int(preds.size / nrow)

            if pred_interactions:
                ngroup = int(chunk_size / ((data.num_col() + 1) * (data.num_col() + 1)))
                if ngroup == 1:
                    preds = preds.reshape(nrow, data.num_col() + 1, data.num_col() + 1)
                else:
                    preds = preds.reshape(nrow, ngroup, data.num_col() + 1, data.num_col() + 1)
            elif pred_contribs:
                ngroup = int(chunk_size / (data.num_col() + 1))
                if ngroup == 1:
                    preds = preds.reshape(nrow, data.num_col() + 1)
                else:
                    preds = preds.reshape(nrow, ngroup, data.num_col() + 1)
            else:
                preds = preds.reshape(nrow, chunk_size)
        print(preds,'-----------------------------------------------------core')#added a print here
        return preds

After running the piece of code, occasionally at some point you will get

[nan nan] -----------------------------------------------------core
[nan nan] [nan nan] -----------------------------------------------xgb
[nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan] -----------------------------------------------------core
[nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan] [nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan] -----------------------------------------------xgb
[nan nan] -----------------------------------------------------core
[nan nan] [nan nan] -----------------------------------------------xgb
[nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan] -----------------------------------------------------core
[nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan] [nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan] -----------------------------------------------xgb
mfeurer commented 5 years ago

Thanks for the code. Do you think this is because of xgboost or because of my patches to the xgboost wrapper?

Maybe it is time to move to lightgbm which supports retraining models a lot better?

jianswang commented 5 years ago

I am not too sure but you might want to take a look at these. https://github.com/dmlc/xgboost/issues/3333 https://github.com/dmlc/xgboost/pull/3943 Do you think the links are referring to the same issue we are facing here?

mfeurer commented 5 years ago

Good question, however, the issues are about computing something called the shap value, not about predicting. Can you trace the issue back to a specific hyperparameter setting and specific data? If yes you could open an issue over at dmlc's XGBoost repository.

jianswang commented 5 years ago

Original source https://www.kaggle.com/easonlai/sample-insurance-claim-prediction-dataset#insurance3r2.csv

After going through the autosklearn pipeline, from autosklearn.pipeline.base.py, I have pickled x and y from the function of def fit_estimator(self, X, y, **fit_params) from the autosklearn.pipeline.base.py.

Data Download the zip from the google drive and numpy.loadtxt both csv files as x and y https://drive.google.com/file/d/1t75BfOVEvigK32jhRXX_bZcxhQk0xtkI/view?usp=sharing

Some of the params from XGradientBoostingClassifier below are not accurately displayed due to the get_params(). However, I have hard-coded some of the params such as sample_type, normalize_type and rate_drop from booster_args and self.seed to match the ones from CustomXGBClassifier and XGBClassifier.

from autosklearn.pipeline.components.classification.xgradient_boosting import XGradientBoostingClassifier
xgboost=XGradientBoostingClassifier(base_score=0.5, booster='dart',
              colsample_bylevel=0.10252124365010733,
              colsample_bytree=0.5521162339214458, gamma=0.0, init=None,
              learning_rate=0.002405341508128002, max_delta_step=0,
              max_depth=20, min_child_weight=20, n_estimators=512,
              n_jobs=1, normalize_type=None,
              random_state=None,
              rate_drop=None, reg_alpha=1.4526675124052617e-07,
              reg_lambda=0.0027314132289849666, sample_type=None,
              scale_pos_weight=1.0, subsample=0.2045009604504659,
              verbose=None)
xgboost.fit(x, y)
xgboost.predict_proba(x)

The results of predict_proba from XGradientBoostingClassifier vary for every run of this piece of code and occasionally it gives np.nan which we were talking previously.

from autosklearn.pipeline.implementations.xgb import CustomXGBClassifier
xgboost=CustomXGBClassifier(base_score=0.5, booster='dart',
          colsample_bylevel=0.10252124365010733,
          colsample_bytree=0.5521162339214458, gamma=0.0,
          learning_rate=0.002405341508128002, max_delta_step=0,
          max_depth=20, min_child_weight=20, missing=None, n_estimators=64,
          n_jobs=1, normalize_type='tree', nthread=None,
          objective='binary:logistic', random_state=5192,
          rate_drop=0.9713111879031118, reg_alpha=1.4526675124052617e-07,
          reg_lambda=0.0027314132289849666, sample_type='weighted',
          scale_pos_weight=1.0, seed=None, silent=True,
          subsample=0.2045009604504659, tree_method='auto')
xgboost.fit(x, y)
xgboost.predict_proba(x)

The results of predict_proba from CustomXGBClassifier is the same from every run of this piece of code.

from xgboost.sklearn import XGBClassifier
xgboost = XGBClassifier(base_score=0.5, booster='dart',
          colsample_bylevel=0.10252124365010733,
          colsample_bytree=0.5521162339214458, gamma=0.0,
          learning_rate=0.002405341508128002, max_delta_step=0,
          max_depth=20, min_child_weight=20, missing=None, n_estimators=64,
          n_jobs=1, normalize_type='tree', nthread=None,
          objective='binary:logistic', random_state=5192,
          rate_drop=0.9713111879031118, reg_alpha=1.4526675124052617e-07,
          reg_lambda=0.0027314132289849666, sample_type='weighted',
          scale_pos_weight=1.0, seed=None, silent=True,
          subsample=0.2045009604504659, tree_method='auto')
xgboost.fit(x, y)
xgboost.predict_proba(x)

The results of predict_proba from XGBClassifier is also the same from every run of this piece of code which match with the ones from CustomXGBClassifier.

Do you have better ideas now of what is happening that causes the np.nan to be produced from predict_proba of XGradientBoostingClassifier?

jianswang commented 5 years ago

@mfeurer Have you looked at this?

mfeurer commented 5 years ago

It's on our stack, but I didn't have a look at this yet.

tribeband commented 4 years ago

may I know the status of this issue?@mfeurer Thanks a lot

mfeurer commented 4 years ago

Okay, we have removed XGBoost from Auto-sklearn as part of the 0.6.0 release. This should no longer be an issue. Please reopen if this is still an issue.

Chakri-V-V commented 4 years ago

@mfeurer ,

  1. Any news on when we can find XG-Boost integrated in further patches of autosklearn?
  2. Can you please me help on integrating XGBoost as a new custom classfier in the present version of autosklearn!

Thanks in advance