转换为DMatrix后XGBoost训练和测试功能的差异


问题内容

只是想知道下一种情况怎么可能:

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

在此处输入图片说明
我将火车数据集作为 csr_matrix 传递给了5233列,在转换为DMatrix之后,我获得了5322个特征。

稍后在预测步骤中,由于上述错误:(

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

在此处输入图片说明

错误:…训练数据没有以下字段:f5232

如何保证将 训练/测试 数据集正确转换为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)

问题答案:

另一种可能性是仅在训练数据中而不在测试数据中具有一个功能级别。这种情况大多数发生在后一个热编码中,该热编码的结果是对于每个级别的分类特征都有较大的矩阵级别。在您的情况下,看起来“
f5232”在培训或测试数据中是排他的。如果这两种情况下的模型评分都可能引发错误(在ML包的大多数实现中),原因是:

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

解决方案:

  1. 最好的“自动”解决方案是仅保留那些列,这些列对于一次热编码训练和测试都是通用的。
  2. 对于临时分析,如果由于重要性而不能舍弃功能级别,则进行分层抽样以确保将所有级别的功能都分配给训练和测试数据。