- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在使用 xgboost 开发回归模型。由于 xgboost 有多个超参数,我用 GridSearchCV()
添加了交叉验证逻辑。作为试验,我设置了 max_depth: [2,3]
。我的 python 代码如下。
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import make_scorer
from sklearn.metrics import mean_squared_error
xgb_reg = xgb.XGBRegressor()
# Obtain the best hyper parameter
scorer=make_scorer(mean_squared_error, False)
params = {'max_depth': [2,3],
'eta': [0.1],
'colsample_bytree': [1.0],
'colsample_bylevel': [0.3],
'subsample': [0.9],
'gamma': [0],
'lambda': [1],
'alpha':[0],
'min_child_weight':[1]
}
grid_xgb_reg=GridSearchCV(xgb_reg,
param_grid=params,
scoring=scorer,
cv=5,
n_jobs=-1)
grid_xgb_reg.fit(X_train, y_train)
y_pred = grid_xgb_reg.predict(X_test)
y_train_pred = grid_xgb_reg.predict(X_train)
## Evaluate model
from sklearn.metrics import mean_squared_error
from sklearn.metrics import r2_score
print('RMSE train: %.3f, test: %.3f' %(np.sqrt(mean_squared_error(y_train, y_train_pred)),np.sqrt(mean_squared_error(y_test, y_pred))))
print('R^2 train: %.3f, test: %.3f' %(r2_score(y_train, y_train_pred),r2_score(y_test, y_pred)))
问题是 GridSearchCV
似乎没有选择最佳超参数。在我的例子中,当我将max_depth
设置为[2,3]
时,结果如下。在以下情况下,GridSearchCV
选择 max_depth:2
作为最佳超参数。
# The result when max_depth is 2
RMSE train: 11.861, test: 15.113
R^2 train: 0.817, test: 0.601
但是,如果我将 max_depth
更新为 [3]
(通过去掉 2
),测试成绩会比之前的好值如下。
# The result when max_depth is 3
RMSE train: 9.951, test: 14.752
R^2 train: 0.871, test: 0.620
我的理解是,即使我将 max_depth
设置为 [2,3]
,GridSearchCV
方法也应该选择 max_depth :3
作为最佳超参数,因为 max_depth:3
可以返回比 max_depth:2
更好的 RSME 或 R^2 分数。谁能告诉我为什么当我将 max_depth
设置为 [2,3]
时我的代码无法选择最佳超参数?
最佳答案
如果您使用 max_depth:2
运行第二个实验,那么结果无法与使用 max_depth:[2,3]
的第一个实验相比较,即使对于运行使用 max_depth:2
,因为您的代码中存在您未明确控制的随机源,即您的代码不可重现。
随机性的第一个来源是 CV 折叠;为了确保实验将在相同的数据分割上运行,您应该按如下方式定义 GridSearchCV:
from sklearn.model_selection import KFold
seed_cv = 123 # any random value here
kf = KFold(n_splits=5, random_state=seed_cv)
grid_xgb_reg=GridSearchCV(xgb_reg,
param_grid=params,
scoring=scorer,
cv=kf, # <- change here
n_jobs=-1)
随机性的第二个来源是 XGBRegressor 本身,它还包括一个 random_state
参数(参见 docs );你应该把它改成:
seed_xgb = 456 # any random value here (can even be the same with seed_cv)
xgb_reg = xgb.XGBRegressor(random_state=seed_xgb)
但即使有了这些安排,虽然您的数据拆分现在将是相同的,但在一般情况下构建的回归模型不一定如此;在这里,如果你保持这样的实验,即首先使用 max_depth:[2,3]
然后使用 max_depth:2
,结果确实是相同的;但是如果你把它改成,比如说,首先用 max_depth:[2,3]
然后用 max_depth:3
,它们将不,因为在第一个实验中,使用 max_depth:3
的运行将以随机数生成器的不同状态开始(即,使用 max_depth:2
运行完成后的状态).
在这样的条件下,不同运行的相同程度是有限的;对于一个非常细微的差异的例子,它仍然破坏了两个实验之间的精确再现性,请参阅我在 Why does the importance parameter influence performance of Random Forest in R? 中的回答
关于python - GridSearchCV 没有为 xgboost 选择最佳超参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69429691/
是否可以计算 xgboost 模型的内部节点预测? R 包 gbm 提供了对每棵树的内部节点的预测。 然而,xgboost 输出仅显示对模型最后一片叶子的预测。 xgboost 输出: 请注意,质量列
我想知道哪个损失函数使用 XGBoost 进行多类分类。我找到了 in this question二元情况下逻辑分类的损失函数。 我认为对于多类情况,它可能与 GBM 中的相同(对于 K 类)whic
XGBoost 使用加法训练的方法,在该方法中对先前模型的残差进行建模。 虽然这是顺序的,那么它如何并行计算呢? 最佳答案 Xgboost 不会像您提到的那样并行运行多棵树,您需要在每棵树之后进行预测
我正在看下面的图片。 有人可以解释一下它们是如何计算的吗?我以为 N 是 -1,是 +1,但后来我不明白这个小女孩怎么有 0.1。但这对于树 2 也不起作用。 最佳答案 我同意@user1808924
我已经使用 Amazon Sagemaker 构建了一个 XGBoost 模型,但是我找不到任何可以帮助我解释模型并验证它是否学习了正确的依赖关系的东西。 通常,我们可以通过 python API (
这是我的代码: xgb <- xgboost(data = as.matrix(df_all_combined), label = as.matrix(target_tr
在 xgboost 中可以设置参数 weight对于 DMatrix .这显然是一个权重列表,其中每个值都是相应样本的权重。 我找不到有关这些权重如何在梯度提升过程中实际使用的任何信息。他们是否与 e
不工作: import warnings warnings.filterwarnings('ignore') 我得到的警告: [14:24:45] WARNING: C:/Jenkins/worksp
我有一个用 Python 训练的 XGBoost 二元分类器模型。 我想在不同的脚本环境 (MQL4) 中使用纯数学运算而不使用 XGBoost 库 (.predict) 从该模型生成新输入数据的输出
我有一个仅包含分类特征和分类标签的数据模型。 因此,当我在 XGBoost 中手动构建该模型时,我基本上会将特征转换为二进制列(使用 LabelEncoder 和 OneHotEncoder),并使用
我使用 XGBoost 的 python 实现。目标之一是rank:pairwise并且最小化成对损失( Documentation )。但是,它没有说明输出的范围。我看到 -10 到 10 之间的数
我遇到了一个奇怪的问题: 我通过 hyperopt 定义了我的 XGB 超参数 'max_depth' hp.choice('max_depth',range(2,20)) 但我得到了 'max_de
我是 R 编程语言新手,我需要运行“xgboost”进行一些实验。问题是我需要交叉验证模型并获得准确性,我发现两种方法可以给我不同的结果: 使用“插入符号”: library(mlbench) lib
选择 auc、error 或 logloss 作为 XGBoost 的 eval_metric 对其性能有何影响?假设数据不平衡。它如何影响准确度、召回率和精确度? 最佳答案 在不同的评估矩阵 之间进
我是 Python 中 XGBoost 的新手,所以如果这里的答案很明显,我深表歉意,但我正在尝试使用 panda 数据框并在 Python 中获取 XGBoost 来给我使用 Scikit-Lear
我知道您可以为不平衡的数据集设置 scale_pos_weight。然而,如何处理不平衡数据集中的多分类问题。我经历过https://datascience.stackexchange.com/que
我正在使用 xgboost 的功能 pred_contribs 以便为我的模型的每个样本获得某种可解释性(shapley 值)。 booster.predict(test, pred_contribs
在 xgboost 0.81 中 cox ph 生存模型的新实现中,如何指定事件的开始和结束时间? 谢谢 例如,R 等效函数是: cph_mod = coxph(Surv(Start, Stop, S
我正在 R 中建模 claim 频率(泊松分布)。我正在使用 gbm和 xgboost包,但似乎xgboost没有将曝光考虑在内的偏移参数? 在 gbm ,人们会按如下方式考虑暴露: gbm.fit(
xgboost 包允许构建一个随机森林(实际上,它选择列的随机子集来为整棵树的 split 选择一个变量,而不是为了点头,因为它是算法的经典版本,但它可以忍受)。但是对于回归,似乎只使用了森林中的一棵
我是一名优秀的程序员,十分优秀!