Closed jianswang closed 4 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?
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
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?
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?
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.
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?
@mfeurer Have you looked at this?
It's on our stack, but I didn't have a look at this yet.
may I know the status of this issue?@mfeurer Thanks a lot
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.
@mfeurer ,
Thanks in advance
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!"?