241 lines
7.1 KiB
Python
241 lines
7.1 KiB
Python
import os
|
|
import subprocess
|
|
import sys
|
|
import tempfile
|
|
|
|
import pytest
|
|
|
|
import xgboost
|
|
from xgboost import testing as tm
|
|
|
|
pytestmark = tm.timeout(30)
|
|
|
|
DEMO_DIR = tm.demo_dir(__file__)
|
|
PYTHON_DEMO_DIR = os.path.join(DEMO_DIR, "guide-python")
|
|
CLI_DEMO_DIR = os.path.join(DEMO_DIR, "CLI")
|
|
|
|
|
|
def test_basic_walkthrough() -> None:
|
|
script = os.path.join(PYTHON_DEMO_DIR, "basic_walkthrough.py")
|
|
cmd = ["python", script]
|
|
with tempfile.TemporaryDirectory() as tmpdir:
|
|
subprocess.check_call(cmd, cwd=tmpdir)
|
|
|
|
|
|
@pytest.mark.skipif(**tm.no_pandas())
|
|
def test_categorical() -> None:
|
|
script = os.path.join(PYTHON_DEMO_DIR, "categorical.py")
|
|
cmd = ["python", script]
|
|
subprocess.check_call(cmd)
|
|
|
|
|
|
@pytest.mark.skipif(**tm.no_pandas())
|
|
def test_cat_pipeline() -> None:
|
|
script = os.path.join(PYTHON_DEMO_DIR, "cat_pipeline.py")
|
|
cmd = ["python", script]
|
|
subprocess.check_call(cmd)
|
|
|
|
|
|
@pytest.mark.skipif(**tm.no_matplotlib())
|
|
def test_custom_multiclass_objective() -> None:
|
|
script = os.path.join(PYTHON_DEMO_DIR, "custom_softmax.py")
|
|
cmd = ["python", script, "--plot=0"]
|
|
subprocess.check_call(cmd)
|
|
|
|
|
|
@pytest.mark.skipif(**tm.no_matplotlib())
|
|
def test_custom_rmsle_objective() -> None:
|
|
script = os.path.join(PYTHON_DEMO_DIR, "custom_rmsle.py")
|
|
cmd = ["python", script, "--plot=0"]
|
|
subprocess.check_call(cmd)
|
|
|
|
|
|
@pytest.mark.skipif(**tm.no_matplotlib())
|
|
def test_feature_weights_demo() -> None:
|
|
script = os.path.join(PYTHON_DEMO_DIR, "feature_weights.py")
|
|
cmd = ["python", script, "--plot=0"]
|
|
subprocess.check_call(cmd)
|
|
|
|
|
|
@pytest.mark.skipif(**tm.no_sklearn())
|
|
def test_sklearn_demo() -> None:
|
|
script = os.path.join(PYTHON_DEMO_DIR, "sklearn_examples.py")
|
|
cmd = ["python", script]
|
|
subprocess.check_call(cmd)
|
|
assert os.path.exists("best_calif.pkl")
|
|
os.remove("best_calif.pkl")
|
|
|
|
|
|
@pytest.mark.skipif(**tm.no_sklearn())
|
|
def test_sklearn_parallel_demo() -> None:
|
|
script = os.path.join(PYTHON_DEMO_DIR, "sklearn_parallel.py")
|
|
cmd = ["python", script]
|
|
subprocess.check_call(cmd)
|
|
|
|
|
|
@pytest.mark.skipif(**tm.no_sklearn())
|
|
def test_sklearn_evals_result_demo() -> None:
|
|
script = os.path.join(PYTHON_DEMO_DIR, "sklearn_evals_result.py")
|
|
cmd = ["python", script]
|
|
subprocess.check_call(cmd)
|
|
|
|
|
|
def test_boost_from_prediction_demo() -> None:
|
|
script = os.path.join(PYTHON_DEMO_DIR, "boost_from_prediction.py")
|
|
cmd = ["python", script]
|
|
subprocess.check_call(cmd)
|
|
|
|
|
|
def test_predict_first_ntree_demo() -> None:
|
|
script = os.path.join(PYTHON_DEMO_DIR, "predict_first_ntree.py")
|
|
cmd = ["python", script]
|
|
subprocess.check_call(cmd)
|
|
|
|
|
|
def test_individual_trees() -> None:
|
|
script = os.path.join(PYTHON_DEMO_DIR, "individual_trees.py")
|
|
cmd = ["python", script]
|
|
subprocess.check_call(cmd)
|
|
|
|
|
|
def test_predict_leaf_indices_demo() -> None:
|
|
script = os.path.join(PYTHON_DEMO_DIR, "predict_leaf_indices.py")
|
|
cmd = ["python", script]
|
|
subprocess.check_call(cmd)
|
|
|
|
|
|
def test_generalized_linear_model_demo() -> None:
|
|
script = os.path.join(PYTHON_DEMO_DIR, "generalized_linear_model.py")
|
|
cmd = ["python", script]
|
|
subprocess.check_call(cmd)
|
|
|
|
|
|
def test_cross_validation_demo() -> None:
|
|
script = os.path.join(PYTHON_DEMO_DIR, "cross_validation.py")
|
|
cmd = ["python", script]
|
|
subprocess.check_call(cmd)
|
|
|
|
|
|
def test_external_memory_demo() -> None:
|
|
script = os.path.join(PYTHON_DEMO_DIR, "external_memory.py")
|
|
cmd = ["python", script]
|
|
subprocess.check_call(cmd)
|
|
|
|
|
|
def test_evals_result_demo() -> None:
|
|
script = os.path.join(PYTHON_DEMO_DIR, "evals_result.py")
|
|
cmd = ["python", script]
|
|
subprocess.check_call(cmd)
|
|
|
|
|
|
@pytest.mark.skipif(**tm.no_sklearn())
|
|
@pytest.mark.skipif(**tm.no_pandas())
|
|
def test_aft_demo() -> None:
|
|
script = os.path.join(DEMO_DIR, "aft_survival", "aft_survival_demo.py")
|
|
cmd = ["python", script]
|
|
subprocess.check_call(cmd)
|
|
assert os.path.exists("aft_model.json")
|
|
os.remove("aft_model.json")
|
|
|
|
|
|
@pytest.mark.skipif(**tm.no_matplotlib())
|
|
def test_callbacks_demo() -> None:
|
|
script = os.path.join(PYTHON_DEMO_DIR, "callbacks.py")
|
|
cmd = ["python", script, "--plot=0"]
|
|
subprocess.check_call(cmd)
|
|
|
|
|
|
def test_continuation_demo() -> None:
|
|
script = os.path.join(PYTHON_DEMO_DIR, "continuation.py")
|
|
cmd = ["python", script]
|
|
subprocess.check_call(cmd)
|
|
|
|
|
|
@pytest.mark.skipif(**tm.no_sklearn())
|
|
@pytest.mark.skipif(**tm.no_matplotlib())
|
|
def test_multioutput_reg() -> None:
|
|
script = os.path.join(PYTHON_DEMO_DIR, "multioutput_regression.py")
|
|
cmd = ["python", script, "--plot=0"]
|
|
subprocess.check_call(cmd)
|
|
|
|
|
|
@pytest.mark.skipif(**tm.no_sklearn())
|
|
def test_quantile_reg() -> None:
|
|
script = os.path.join(PYTHON_DEMO_DIR, "quantile_regression.py")
|
|
cmd = ["python", script]
|
|
subprocess.check_call(cmd)
|
|
|
|
|
|
@pytest.mark.skipif(**tm.no_ubjson())
|
|
def test_json_model() -> None:
|
|
script = os.path.join(DEMO_DIR, "json-model", "json_parser.py")
|
|
|
|
def run_test(reg: xgboost.XGBRegressor) -> None:
|
|
with tempfile.TemporaryDirectory() as tmpdir:
|
|
path = os.path.join(tmpdir, "reg.json")
|
|
reg.save_model(path)
|
|
cmd = ["python", script, f"--model={path}"]
|
|
subprocess.check_call(cmd)
|
|
|
|
path = os.path.join(tmpdir, "reg.ubj")
|
|
reg.save_model(path)
|
|
cmd = ["python", script, f"--model={path}"]
|
|
subprocess.check_call(cmd)
|
|
|
|
# numerical
|
|
X, y = tm.make_sparse_regression(100, 10, 0.5, False)
|
|
reg = xgboost.XGBRegressor(n_estimators=2, tree_method="hist")
|
|
reg.fit(X, y)
|
|
run_test(reg)
|
|
|
|
# categorical
|
|
X, y = tm.make_categorical(
|
|
n_samples=1000,
|
|
n_features=10,
|
|
n_categories=6,
|
|
onehot=False,
|
|
sparsity=0.5,
|
|
cat_ratio=0.5,
|
|
shuffle=True,
|
|
)
|
|
reg = xgboost.XGBRegressor(
|
|
n_estimators=2, tree_method="hist", enable_categorical=True
|
|
)
|
|
reg.fit(X, y)
|
|
run_test(reg)
|
|
|
|
|
|
# - gpu_acceleration is not tested due to covertype dataset is being too huge.
|
|
# - gamma regression is not tested as it requires running a R script first.
|
|
# - aft viz is not tested due to ploting is not controlled
|
|
# - aft tunning is not tested due to extra dependency.
|
|
|
|
|
|
def test_cli_regression_demo() -> None:
|
|
reg_dir = os.path.join(CLI_DEMO_DIR, "regression")
|
|
script = os.path.join(reg_dir, "mapfeat.py")
|
|
cmd = ["python", script]
|
|
subprocess.check_call(cmd, cwd=reg_dir)
|
|
|
|
script = os.path.join(reg_dir, "mknfold.py")
|
|
cmd = ["python", script, "machine.txt", "1"]
|
|
subprocess.check_call(cmd, cwd=reg_dir)
|
|
|
|
exe = os.path.join(DEMO_DIR, os.path.pardir, "xgboost")
|
|
conf = os.path.join(reg_dir, "machine.conf")
|
|
subprocess.check_call([exe, conf], cwd=reg_dir)
|
|
|
|
|
|
@pytest.mark.skipif(
|
|
condition=sys.platform.startswith("win"), reason="Test requires sh execution."
|
|
)
|
|
def test_cli_binary_classification() -> None:
|
|
cls_dir = os.path.join(CLI_DEMO_DIR, "binary_classification")
|
|
with tm.DirectoryExcursion(cls_dir, cleanup=True):
|
|
subprocess.check_call(["./runexp.sh"])
|
|
os.remove("0002.model")
|
|
|
|
|
|
# year prediction is not tested due to data size being too large.
|
|
# rank is not tested as it requires unrar command.
|