|
2 | 2 | import importlib.util
|
3 | 3 | import json
|
4 | 4 | import os
|
| 5 | +import pickle |
5 | 6 | import random
|
6 | 7 | import tempfile
|
7 | 8 | from typing import Callable, Optional
|
@@ -636,26 +637,74 @@ def test_sklearn_n_jobs():
|
636 | 637 |
|
637 | 638 | def test_parameters_access():
|
638 | 639 | from sklearn import datasets
|
639 |
| - params = {'updater': 'grow_gpu_hist', 'subsample': .5, 'n_jobs': -1} |
| 640 | + |
| 641 | + params = {"updater": "grow_gpu_hist", "subsample": 0.5, "n_jobs": -1} |
640 | 642 | clf = xgb.XGBClassifier(n_estimators=1000, **params)
|
641 |
| - assert clf.get_params()['updater'] == 'grow_gpu_hist' |
642 |
| - assert clf.get_params()['subsample'] == .5 |
643 |
| - assert clf.get_params()['n_estimators'] == 1000 |
| 643 | + assert clf.get_params()["updater"] == "grow_gpu_hist" |
| 644 | + assert clf.get_params()["subsample"] == 0.5 |
| 645 | + assert clf.get_params()["n_estimators"] == 1000 |
644 | 646 |
|
645 | 647 | clf = xgb.XGBClassifier(n_estimators=1, nthread=4)
|
646 | 648 | X, y = datasets.load_iris(return_X_y=True)
|
647 | 649 | clf.fit(X, y)
|
648 | 650 |
|
649 | 651 | config = json.loads(clf.get_booster().save_config())
|
650 |
| - assert int(config['learner']['generic_param']['nthread']) == 4 |
| 652 | + assert int(config["learner"]["generic_param"]["nthread"]) == 4 |
651 | 653 |
|
652 | 654 | clf.set_params(nthread=16)
|
653 | 655 | config = json.loads(clf.get_booster().save_config())
|
654 |
| - assert int(config['learner']['generic_param']['nthread']) == 16 |
| 656 | + assert int(config["learner"]["generic_param"]["nthread"]) == 16 |
655 | 657 |
|
656 | 658 | clf.predict(X)
|
657 | 659 | config = json.loads(clf.get_booster().save_config())
|
658 |
| - assert int(config['learner']['generic_param']['nthread']) == 16 |
| 660 | + assert int(config["learner"]["generic_param"]["nthread"]) == 16 |
| 661 | + |
| 662 | + clf = xgb.XGBClassifier(n_estimators=2) |
| 663 | + assert clf.tree_method is None |
| 664 | + assert clf.get_params()["tree_method"] is None |
| 665 | + clf.fit(X, y) |
| 666 | + assert clf.get_params()["tree_method"] is None |
| 667 | + |
| 668 | + def save_load(clf: xgb.XGBClassifier) -> xgb.XGBClassifier: |
| 669 | + with tempfile.TemporaryDirectory() as tmpdir: |
| 670 | + path = os.path.join(tmpdir, "model.json") |
| 671 | + clf.save_model(path) |
| 672 | + clf = xgb.XGBClassifier() |
| 673 | + clf.load_model(path) |
| 674 | + return clf |
| 675 | + |
| 676 | + def get_tm(clf: xgb.XGBClassifier) -> str: |
| 677 | + tm = json.loads(clf.get_booster().save_config())["learner"]["gradient_booster"][ |
| 678 | + "gbtree_train_param" |
| 679 | + ]["tree_method"] |
| 680 | + return tm |
| 681 | + |
| 682 | + assert get_tm(clf) == "exact" |
| 683 | + |
| 684 | + clf = pickle.loads(pickle.dumps(clf)) |
| 685 | + |
| 686 | + assert clf.tree_method is None |
| 687 | + assert clf.n_estimators == 2 |
| 688 | + assert clf.get_params()["tree_method"] is None |
| 689 | + assert clf.get_params()["n_estimators"] == 2 |
| 690 | + assert get_tm(clf) == "exact" # preserved for pickle |
| 691 | + |
| 692 | + clf = save_load(clf) |
| 693 | + |
| 694 | + assert clf.tree_method is None |
| 695 | + assert clf.n_estimators == 2 |
| 696 | + assert clf.get_params()["tree_method"] is None |
| 697 | + assert clf.get_params()["n_estimators"] == 2 |
| 698 | + assert get_tm(clf) == "auto" # discarded for save/load_model |
| 699 | + |
| 700 | + clf.set_params(tree_method="hist") |
| 701 | + assert clf.get_params()["tree_method"] == "hist" |
| 702 | + clf = pickle.loads(pickle.dumps(clf)) |
| 703 | + assert clf.get_params()["tree_method"] == "hist" |
| 704 | + clf = save_load(clf) |
| 705 | + # FIXME(jiamingy): We should remove this behavior once we remove parameters |
| 706 | + # serialization for skl save/load_model. |
| 707 | + assert clf.get_params()["tree_method"] == "hist" |
659 | 708 |
|
660 | 709 |
|
661 | 710 | def test_kwargs_error():
|
@@ -695,13 +744,19 @@ def test_sklearn_clone():
|
695 | 744 |
|
696 | 745 | def test_sklearn_get_default_params():
|
697 | 746 | from sklearn.datasets import load_digits
|
| 747 | + |
698 | 748 | digits_2class = load_digits(n_class=2)
|
699 |
| - X = digits_2class['data'] |
700 |
| - y = digits_2class['target'] |
| 749 | + X = digits_2class["data"] |
| 750 | + y = digits_2class["target"] |
701 | 751 | cls = xgb.XGBClassifier()
|
702 |
| - assert cls.get_params()['base_score'] is None |
| 752 | + assert cls.get_params()["base_score"] is None |
703 | 753 | cls.fit(X[:4, ...], y[:4, ...])
|
704 |
| - assert cls.get_params()['base_score'] is not None |
| 754 | + base_score = float( |
| 755 | + json.loads(cls.get_booster().save_config())["learner"]["learner_model_param"][ |
| 756 | + "base_score" |
| 757 | + ] |
| 758 | + ) |
| 759 | + np.testing.assert_equal(base_score, 0.5) |
705 | 760 |
|
706 | 761 |
|
707 | 762 | def run_validation_weights(model):
|
|
0 commit comments