gpt4 book ai didi

python - 转换为 DMatrix 后 XGBoost 在训练和测试特征上的差异

转载 作者:太空狗 更新时间:2023-10-30 02:17:53 26 4
gpt4 key购买 nike

只是想知道下一个案例怎么可能:

 def fit(self, train, target):
xgtrain = xgb.DMatrix(train, label=target, missing=np.nan)
self.model = xgb.train(self.params, xgtrain, self.num_rounds)

enter image description here我将训练数据集作为包含 5233 列的 csr_matrix 传递,在转换为 DMatrix 后我得到了 5322 个特征。

稍后在预测步骤中,由于上述错误,我得到了一个错误:(

 def predict(self, test):
if not self.model:
return -1
xgtest = xgb.DMatrix(test)
return self.model.predict(xgtest)

enter image description here

Error: ... training data did not have the following fields: f5232

如何保证将我的train/test 数据集正确转换为 DMatrix?

有没有机会在 Python 中使用类似于 R 的东西?

# get same columns for test/train sparse matrixes
col_order <- intersect(colnames(X_train_sparse), colnames(X_test_sparse))
X_train_sparse <- X_train_sparse[,col_order]
X_test_sparse <- X_test_sparse[,col_order]

不幸的是,我的方法不起作用:

def _normalize_columns(self):
columns = (set(self.xgtest.feature_names) - set(self.xgtrain.feature_names)) | \
(set(self.xgtrain.feature_names) - set(self.xgtest.feature_names))
for item in columns:
if item in self.xgtest.feature_names:
self.xgtest.feature_names.remove(item)
else:
# seems, it's immutable structure and can not add any new item!!!
self.xgtest.feature_names.append(item)

最佳答案

另一种可能性是只在训练数据而不是测试数据中拥有一个特征级别。这种情况主要发生在 post one hot encoding 其结果是大矩阵时,每个级别的分类特征都有级别。在您的情况下,“f5232”看起来在训练或测试数据中都是独占的。如果任一案例模型评分可能会抛出错误(在大多数 ML 包的实现中),因为:

  1. 如果专用于训练:模型对象将在模型方程中引用该特征。评分时会抛出错误,提示我找不到此列。
  2. 如果专用于测试(不太可能,因为测试数据通常小于训练数据):模型对象将不会在模型方程中引用此特征。在评分时它会抛出错误,说我得到了这一列,但模型方程没有这一列。这也不太可能,因为大多数实现都认识到这种情况。

解决方案:

  1. 最好的“自动化”解决方案是只保留那些列,这些列在一次热编码后的训练和测试中都是通用的。
  2. 对于即席分析,如果由于功能的重要性而无法降低功能级别,则进行分层抽样以确保将所有级别的功能分配给训练和测试数据。

关于python - 转换为 DMatrix 后 XGBoost 在训练和测试特征上的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38740885/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com