维洛特烦恼 2020-05-20 00:35 采纳率: 0%
浏览 4707

关于xgboost.train()和xgboost.XGBClassifier().fit()的预测输出问题

问题:在用xgboost做多分类学习时遇到了问题,参数均一样,训练集和验证集也是一样的,评估用的是自己写的评估函数ndcg算法,但是用xgb.train()和XGBClassifier().fit()后评估打分的差距相差太大,想问是predict的结果不一样嘛?为什么会有这种情况出现?

# 数据集整理均是一样的
X_train, X_test, y_train, y_test = train_test_split(xtrain_new,ytrain_new,test_size=0.2,random_state=RANDOM_STATE)
train_xgb = xgb.DMatrix(X_train, label= y_train)
test_xgb = xgb.DMatrix(X_test, label = y_test)

sklearn接口:_

# 用sklearn接口
xgb1 = XGBClassifier(max_depth=6,# 构建树的深度
                     learning_rate=0.1,# 如同学习率
                     n_estimators=100,#决策树数量
                     silent=False,
                     objective='multi:softprob',
                     booster='gbtree',
                     num_class=12,# 类别数
                     n_jobs=4,
                     gamma=0.2,
                     min_child_weight=1,
                     subsample=0.8,# 随机采样训练样本
                     colsample_bytree=0.7,# 生成树列采样
                     seed=RANDOM_STATE)# 随机种子

xgb_bst1 = xgb1.fit(X_train,y_train)
y_pred = xgb_bst1.predict(X_test)
test_ndcg_score = ndcg_score(y_test, y_pred, k=k_ndcg)
print(test_ndcg_score) #评估打分

结果:
图片说明

下面是原生接口:

# 下面是原生接口,参数也是一样
params={
    'max_depth':6,# 构建树的深度,越大越容易过拟合
    'eta':0.1,# 如同学习率
    'num_round':100,#决策树数量
    'objective':'multi:softprob',# 多分类的问题
    'booster':'gbtree',
    'num_class':12,# 类别数,与 multisoftmax 并用
    'n_jobs':4,
    'gamma':0.2,# 用于控制是否后剪枝的参数,越大越保守
    'min_child_weight':1,
    'subsample':0.8,# 随机采样训练样本
    'colsample_bytree':0.7,
    'seed':RANDOM_STATE# 随机种子
}
watchlist = [ (train_xgb,'train'), (test_xgb, 'test') ]
# 训练模型
xgb2 = xgb.train(params,
                train_xgb,
                params['num_round'],
                watchlist,
                feval = customized_eval,
                verbose_eval = 3,
                early_stopping_rounds = 5)
# 预测模型评估
y_pred = np.array(xgb2.predict(test_xgb))
test_ndcg_score = ndcg_score(y_test, y_pred, k=k_ndcg)
print(test_ndcg_score)# 评估打分

结果:图片说明

ndcg_score函数是自己写的,multi:softprob的输出应该是一个概率矩阵,不明白为什么评估差距很大,希望有人能解答!!谢谢!!

  • 写回答

2条回答 默认 最新

  • baiyaoqian 2020-11-04 13:10
    关注

    使用XGBClassifier()时,预测概率是用的 predict_proba()但你用的是predict()

    评论

报告相同问题?

悬赏问题

  • ¥15 fluent的在模拟压强时使用希望得到一些建议
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样
  • ¥15 java的GUI的运用
  • ¥15 Web.config连不上数据库
  • ¥15 我想付费需要AKM公司DSP开发资料及相关开发。
  • ¥15 怎么配置广告联盟瀑布流
  • ¥15 Rstudio 保存代码闪退