【问题标题】:Why am I getting different results from Scikit-learn API vs Learning API of XGBoost?为什么我从 Scikit-learn API 与 XGBoost 的 Learning API 得到不同的结果?
【发布时间】:2019-09-22 10:53:32
【问题描述】:

我使用了 XGBoost 的 Scikit-learn API(在 python 中)。我的准确率约为 68%。我使用了相同的参数集并使用了 XGBoost 的学习 API;我的准确率约为 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%

【问题讨论】:

  • 这些算法是不确定的。您无法保证它们会为您提供完全相同的性能。

标签: scikit-learn xgboost rapids


【解决方案1】:

我相信差异是因为您没有在standard xgboost API (xgb.train()) 中指定提升轮数。因此,它使用默认值 10。

'n_estimators' 是一个 sklearn 特定的术语。

另外,与上面给出的评论相反,当在同一系统上多次运行时,这种特定算法预计是确定性的。

【讨论】:

  • 我尝试了您的建议,但不幸的是,这并没有解决问题。
  • 为了进一步了解,我需要完全重现您的示例。请用数据发布整个脚本。如有必要,您可以使用 sklearn 数据集生成器。
猜你喜欢
  • 2017-07-30
  • 2016-10-22
  • 2017-07-26
  • 1970-01-01
  • 1970-01-01
  • 2017-12-22
  • 1970-01-01
  • 1970-01-01
  • 2013-02-02
相关资源
最近更新 更多