Почему я получаю разные результаты от Scikit-learn API и Learning API XGBoost? - PullRequest
1 голос
/ 04 мая 2019

Я использовал API Scikit-learn для XGBoost (в python).Моя точность была ~ 68%.Я использовал тот же набор параметров и использовал Learning API для XGBoost;моя точность была ~ 60%.Насколько я понимаю, Scikit-Learn API - это оболочка вокруг Learning API, и поэтому они должны давать мне те же результаты.Я не понимаю, почему я получаю разные результаты от этих двух API.

    cores=16
    random_state=0

    params = {
        'n_estimators': 100, 
        'learning_rate': 0.1,
        'max_depth': 3,
        'min_child_weight': 1.0,
        'subsample': 1.0,
        'gamma': 0.0,
        'tree_method':'gpu_exact',
        'colsample_bytree': 1.0,
        'alpha' : 0.0,
        'lambda': 1.0,
        'nthread': cores,
        'objective': 'binary:logistic',
        'booster': 'gbtree',
        'seed': random_state,
        'eta':0.1,
        'silent': 1
    }

    model = XGBClassifier(**params)
    r = model.fit(X_train,y_train)
    print(model)

    # make predictions for test data
    y_pred = model.predict(X_test)
    predictions = [round(value) for value in y_pred]

    # evaluate predictions
    accuracy = accuracy_score(y_test, predictions)
    print("Accuracy: %.2f%%" % (accuracy * 100.0))

Результаты:

XGBClassifier(alpha=0.0, base_score=0.5, booster='gbtree',
       colsample_bylevel=1, colsample_bytree=1.0, eta=0.1, gamma=0.0,
       lambda=1.0, learning_rate=0.1, max_delta_step=0, max_depth=3,
       min_child_weight=1.0, missing=None, n_estimators=100, n_jobs=1,
       nthread=16, objective='binary:logistic', random_state=0,
       reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=0, silent=1,
       subsample=1.0, tree_method='gpu_exact')

Точность: 68,32%

    dtrain = xgb.DMatrix(X_train, label=y_train)
    dvalid = xgb.DMatrix(X_test, label=y_test)

    # fit model no training data
    model = xgb.train(params=params,dtrain=dtrain)

    # make predictions for test data
    y_pred = model.predict(dvalid)
    predictions = [round(value) for value in y_pred]

    # evaluate predictions
    accuracy = accuracy_score(y_test, predictions)
    print("Accuracy: %.2f%%" % (accuracy * 100.0))

Результаты:

Точность: 60,25%

1 Ответ

2 голосов
/ 07 мая 2019

Я полагаю, что разница в том, что вы не указали количество бустеров в стандартном API xgboost (xgb.train ()). В результате используется значение по умолчанию 10.

n_estimators - это терминология, специфичная для sklearn.

Кроме того, вопреки приведенному выше комментарию этот конкретный алгоритм, как ожидается, будет детерминированным при многократном запуске в одной и той же системе.

...