XGBoost 和 Sklearn 中的日志丢失是不是相同?
Posted
技术标签:
【中文标题】XGBoost 和 Sklearn 中的日志丢失是不是相同?【英文标题】:Is log loss in XGBoost and Sklearn the same?XGBoost 和 Sklearn 中的日志丢失是否相同? 【发布时间】:2017-04-28 06:47:31 【问题描述】:我正在使用 XGBoost 处理一个新数据集。以下是我的代码:
import xgboost as xgb
import pandas as pd
import numpy as np
train = pd.read_csv("train_users_processed_onehot.csv")
labels = train["Buy"].map("Y":1, "N":0)
features = train.drop("Buy", axis=1)
data_dmat = xgb.DMatrix(data=features, label=labels)
params="max_depth":5, "min_child_weight":2, "eta": 0.1, "subsamples":0.9, "colsample_bytree":0.8, "objective" : "binary:logistic", "eval_metric": "logloss", "seed": 2333
rounds = 6000
result = xgb.cv(params=params, dtrain=data_dmat, num_boost_round=rounds, early_stopping_rounds=50, as_pandas=True, seed=2333)
print result
结果为(省略中间结果):
test-logloss-mean test-logloss-std train-logloss-mean
0 0.683354 0.000058 0.683206
165 0.622318 0.000661 0.607680
但是当我尝试使用GridSearchCV
进行参数调整时,我发现结果完全不同。更具体地说,这是我的代码:
import xgboost as xgb
from sklearn.model_selection import GridSearchCV
from xgboost.sklearn import XGBClassifier
import numpy as np
import pandas as pd
train_dataframe = pd.read_csv("train_users_processed_onehot.csv")
train_labels = train_dataframe["Buy"].map("Y":1, "N":0)
train_features = train_dataframe.drop("Buy", axis=1)
params = "max_depth": [5], "min_child_weight": [2]
estimator = XGBClassifier(learning_rate=0.1, n_estimators=170, max_depth=2, min_child_weight=4, objective="binary:logistic", subsample=0.9, colsample_bytree=0.8, seed=2333)
gsearch1 = GridSearchCV(estimator, param_grid=params, n_jobs=4, iid=False, verbose=1, scoring="neg_log_loss")
gsearch1.fit(train_features.values, train_labels.values)
print pd.DataFrame(gsearch1.cv_results_)
print gsearch1.best_params_
print -gsearch1.best_score_
我得到了:
mean_fit_time mean_score_time mean_test_score mean_train_score
0 87.71497 0.209772 -3.134132 -0.567306
很明显,3.134132 与 0.622318 有很大不同。这是什么原因?
谢谢!
【问题讨论】:
我对这个问题做了更多的研究,请移步***.com/questions/41135987/… 【参考方案1】:您将不同的参数传递给两者:
最大深度:5 比 2 eta:0.1 与 0.3(默认) min_child_weight:2 比 4您传递给 sklearn 的参数更加保守(您不太可能过度拟合模型),因此该算法不会过多地尝试将模型拟合到数据中。反过来,在第二次你会得到一个较低的分数——这正是预期的结果。
【讨论】:
据我所知,param
中指定的参数将覆盖XGBClassifier
中指定的参数,而XGBClassifier
中的learning_rate
正是XGBoost 中的eta
,所以我想我'传递相同的参数给他们。以上是关于XGBoost 和 Sklearn 中的日志丢失是不是相同?的主要内容,如果未能解决你的问题,请参考以下文章
多类文本分类期间 xgboost sklearn 中的 feature_names 不匹配