78 lines
2.2 KiB
Python
78 lines
2.2 KiB
Python
import numpy as np
|
|
import xgboost as xgb
|
|
|
|
from numpy.testing import assert_approx_equal
|
|
|
|
train_data = xgb.DMatrix(np.array([[1]]), label=np.array([1]))
|
|
|
|
|
|
class TestTreeRegularization:
|
|
def test_alpha(self):
|
|
params = {
|
|
'tree_method': 'exact', 'verbosity': 0,
|
|
'objective': 'reg:squarederror',
|
|
'eta': 1,
|
|
'lambda': 0,
|
|
'alpha': 0.1
|
|
}
|
|
|
|
model = xgb.train(params, train_data, 1)
|
|
preds = model.predict(train_data)
|
|
|
|
# Default prediction (with no trees) is 0.5
|
|
# sum_grad = (0.5 - 1.0)
|
|
# sum_hess = 1.0
|
|
# 0.9 = 0.5 - (sum_grad - alpha * sgn(sum_grad)) / sum_hess
|
|
assert_approx_equal(preds[0], 0.9)
|
|
|
|
def test_lambda(self):
|
|
params = {
|
|
'tree_method': 'exact', 'verbosity': 0,
|
|
'objective': 'reg:squarederror',
|
|
'eta': 1,
|
|
'lambda': 1,
|
|
'alpha': 0
|
|
}
|
|
|
|
model = xgb.train(params, train_data, 1)
|
|
preds = model.predict(train_data)
|
|
|
|
# Default prediction (with no trees) is 0.5
|
|
# sum_grad = (0.5 - 1.0)
|
|
# sum_hess = 1.0
|
|
# 0.75 = 0.5 - sum_grad / (sum_hess + lambda)
|
|
assert_approx_equal(preds[0], 0.75)
|
|
|
|
def test_alpha_and_lambda(self):
|
|
params = {
|
|
'tree_method': 'exact', 'verbosity': 1,
|
|
'objective': 'reg:squarederror',
|
|
'eta': 1,
|
|
'lambda': 1,
|
|
'alpha': 0.1
|
|
}
|
|
|
|
model = xgb.train(params, train_data, 1)
|
|
preds = model.predict(train_data)
|
|
|
|
# Default prediction (with no trees) is 0.5
|
|
# sum_grad = (0.5 - 1.0)
|
|
# sum_hess = 1.0
|
|
# 0.7 = 0.5 - (sum_grad - alpha * sgn(sum_grad)) / (sum_hess + lambda)
|
|
assert_approx_equal(preds[0], 0.7)
|
|
|
|
def test_unlimited_depth(self):
|
|
x = np.array([[0], [1], [2], [3]])
|
|
y = np.array([0, 1, 2, 3])
|
|
|
|
model = xgb.XGBRegressor(
|
|
n_estimators=1,
|
|
eta=1,
|
|
tree_method="hist",
|
|
grow_policy="lossguide",
|
|
reg_lambda=0,
|
|
max_leaves=128,
|
|
max_depth=0,
|
|
).fit(x, y)
|
|
assert np.array_equal(model.predict(x), y)
|