[Breaking] Change default evaluation metric for classification to logloss / mlogloss (#6183)
* Change DefaultEvalMetric of classification from error to logloss * Change default binary metric in plugin/example/custom_obj.cc * Set old error metric in python tests * Set old error metric in R tests * Fix missed eval metrics and typos in R tests * Fix setting eval_metric twice in R tests * Add warning for empty eval_metric for classification * Fix Dask tests Co-authored-by: Hyunsu Cho <chohyu01@cs.washington.edu>
This commit is contained in:
committed by
GitHub
parent
e0e4f15d0e
commit
cf4f019ed6
@@ -81,7 +81,7 @@ class TestBasic(unittest.TestCase):
|
||||
dtrain = xgb.DMatrix(dpath + 'agaricus.txt.train')
|
||||
dtest = xgb.DMatrix(dpath + 'agaricus.txt.test')
|
||||
param = {'max_depth': 2, 'eta': 1, 'verbosity': 0,
|
||||
'objective': 'binary:logistic'}
|
||||
'objective': 'binary:logistic', 'eval_metric': 'error'}
|
||||
# specify validations set to watch performance
|
||||
watchlist = [(dtest, 'eval'), (dtrain, 'train')]
|
||||
num_round = 2
|
||||
|
||||
@@ -117,7 +117,8 @@ class TestModels(unittest.TestCase):
|
||||
# learning_rates as a list
|
||||
# init eta with 0 to check whether learning_rates work
|
||||
param = {'max_depth': 2, 'eta': 0, 'verbosity': 0,
|
||||
'objective': 'binary:logistic', 'tree_method': tree_method}
|
||||
'objective': 'binary:logistic', 'eval_metric': 'error',
|
||||
'tree_method': tree_method}
|
||||
evals_result = {}
|
||||
bst = xgb.train(param, dtrain, num_round, watchlist,
|
||||
callbacks=[xgb.callback.reset_learning_rate([
|
||||
@@ -131,7 +132,8 @@ class TestModels(unittest.TestCase):
|
||||
|
||||
# init learning_rate with 0 to check whether learning_rates work
|
||||
param = {'max_depth': 2, 'learning_rate': 0, 'verbosity': 0,
|
||||
'objective': 'binary:logistic', 'tree_method': tree_method}
|
||||
'objective': 'binary:logistic', 'eval_metric': 'error',
|
||||
'tree_method': tree_method}
|
||||
evals_result = {}
|
||||
bst = xgb.train(param, dtrain, num_round, watchlist,
|
||||
callbacks=[xgb.callback.reset_learning_rate(
|
||||
@@ -145,7 +147,7 @@ class TestModels(unittest.TestCase):
|
||||
# check if learning_rates override default value of eta/learning_rate
|
||||
param = {
|
||||
'max_depth': 2, 'verbosity': 0, 'objective': 'binary:logistic',
|
||||
'tree_method': tree_method
|
||||
'eval_metric': 'error', 'tree_method': tree_method
|
||||
}
|
||||
evals_result = {}
|
||||
bst = xgb.train(param, dtrain, num_round, watchlist,
|
||||
|
||||
@@ -115,7 +115,9 @@ class TestDMatrix(unittest.TestCase):
|
||||
|
||||
eval_res_0 = {}
|
||||
booster = xgb.train(
|
||||
{'num_class': 3, 'objective': 'multi:softprob'}, d,
|
||||
{'num_class': 3, 'objective': 'multi:softprob',
|
||||
'eval_metric': 'merror'},
|
||||
d,
|
||||
num_boost_round=2, evals=[(d, 'd')], evals_result=eval_res_0)
|
||||
|
||||
predt = booster.predict(d)
|
||||
@@ -130,9 +132,11 @@ class TestDMatrix(unittest.TestCase):
|
||||
assert sliced_margin.shape[0] == len(ridxs) * 3
|
||||
|
||||
eval_res_1 = {}
|
||||
xgb.train({'num_class': 3, 'objective': 'multi:softprob'}, sliced,
|
||||
num_boost_round=2, evals=[(sliced, 'd')],
|
||||
evals_result=eval_res_1)
|
||||
xgb.train(
|
||||
{'num_class': 3, 'objective': 'multi:softprob',
|
||||
'eval_metric': 'merror'},
|
||||
sliced,
|
||||
num_boost_round=2, evals=[(sliced, 'd')], evals_result=eval_res_1)
|
||||
|
||||
eval_res_0 = eval_res_0['d']['merror']
|
||||
eval_res_1 = eval_res_1['d']['merror']
|
||||
|
||||
@@ -58,7 +58,7 @@ class TestEarlyStopping(unittest.TestCase):
|
||||
y = digits['target']
|
||||
dm = xgb.DMatrix(X, label=y)
|
||||
params = {'max_depth': 2, 'eta': 1, 'verbosity': 0,
|
||||
'objective': 'binary:logistic'}
|
||||
'objective': 'binary:logistic', 'eval_metric': 'error'}
|
||||
|
||||
cv = xgb.cv(params, dm, num_boost_round=10, nfold=10,
|
||||
early_stopping_rounds=10)
|
||||
|
||||
@@ -274,7 +274,7 @@ def test_dask_classifier():
|
||||
X, y = generate_array()
|
||||
y = (y * 10).astype(np.int32)
|
||||
classifier = xgb.dask.DaskXGBClassifier(
|
||||
verbosity=1, n_estimators=2)
|
||||
verbosity=1, n_estimators=2, eval_metric='merror')
|
||||
classifier.client = client
|
||||
classifier.fit(X, y, eval_set=[(X, y)])
|
||||
prediction = classifier.predict(X)
|
||||
@@ -386,6 +386,7 @@ def run_empty_dmatrix_cls(client, parameters):
|
||||
y = dd.from_array(np.random.randint(low=0, high=n_classes, size=kRows))
|
||||
dtrain = xgb.dask.DaskDMatrix(client, X, y)
|
||||
parameters['objective'] = 'multi:softprob'
|
||||
parameters['eval_metric'] = 'merror'
|
||||
parameters['num_class'] = n_classes
|
||||
|
||||
out = xgb.dask.train(client, parameters,
|
||||
@@ -482,7 +483,7 @@ async def run_dask_classifier_asyncio(scheduler_address):
|
||||
X, y = generate_array()
|
||||
y = (y * 10).astype(np.int32)
|
||||
classifier = await xgb.dask.DaskXGBClassifier(
|
||||
verbosity=1, n_estimators=2)
|
||||
verbosity=1, n_estimators=2, eval_metric='merror')
|
||||
classifier.client = client
|
||||
await classifier.fit(X, y, eval_set=[(X, y)])
|
||||
prediction = await classifier.predict(X)
|
||||
|
||||
@@ -174,7 +174,7 @@ class TestPandas(unittest.TestCase):
|
||||
def test_cv_as_pandas(self):
|
||||
dm = xgb.DMatrix(dpath + 'agaricus.txt.train')
|
||||
params = {'max_depth': 2, 'eta': 1, 'verbosity': 0,
|
||||
'objective': 'binary:logistic'}
|
||||
'objective': 'binary:logistic', 'eval_metric': 'error'}
|
||||
|
||||
cv = xgb.cv(params, dm, num_boost_round=10, nfold=10)
|
||||
assert isinstance(cv, pd.DataFrame)
|
||||
|
||||
Reference in New Issue
Block a user