在xgboost python中预测测试数据时出错

2024-06-05 13:44:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用xgboost python来执行文本分类

下面是我正在考虑的列车组

itemid       description                                            category
11802974     SPRO VUH3C1 DIFFUSER VUH1 TRIPLE Space heaters    Architectural Diffusers
10688548     ANTIQUE BRONZE FINISH PUSHBUTTON  switch           Door Bell Pushbuttons
9836436     Descente pour Cable tray fitting and accessories    Tray Cable Drop Outs

我正在使用Sckit learn的顾问器构造描述的文档项矩阵,它生成scipy矩阵(因为我有110万个巨大的数据,所以我使用稀疏表示来降低空间复杂性),使用下面的代码

^{pr2}$

之后,我将使用

 fs = feature_selection.SelectPercentile(feature_selection.chi2, percentile=40)
 documenttermmatrix_train= fs.fit_transform(documenttermmatrix,y1_train)

我使用xgboost分类器来训练模型

model = XGBClassifier(silent=False)

model.fit(documenttermmatrix_train, y_train,verbose=True)

下面是我正在考虑的测试集

itemid      description                       category
9836442     TRIPLE Space heaters              Architectural Diffusers
13863918    pushbutton switch                  Door Bell Pushbuttons

我正在为测试集构造单独的矩阵,就像我用下面的代码为火车集做的一样

 documenttermmatrix_test=countvec.fit_transform(testset['description'])

虽然预先确定测试集Xgboost期望列车集的所有特性都在测试集中,但这是不可能的(稀疏矩阵只表示非零项)

我不能将列车和测试集组合成一个数据集,因为我只需要为列车集进行特征选择

有人能告诉我怎样才能更进一步吗?在


Tags: train矩阵spacedescriptionfittriplecategoryswitch
3条回答

解决这个问题没有简单的方法,尽管这是很常见的。XGBoost和其他基于树的模型可以处理具有比训练集更多的变量的测试集(因为它可以忽略它们),但决不会少(因为它希望对它们做出决策)。在这种情况下,你有一些选择,按解决问题的愿望/可能性的降序排列:

  1. 不要使用稀疏矩阵。除非您是在实时应用程序或其他禁止性的生产环境中构建此模型,否则最简单的方法是使用一个普通的矩阵,该矩阵将保持列为零。

  2. 看看您是如何对数据进行分区的。可能只有一到两个因子存在不平衡的拆分,在这种情况下,您可以通过使用scikit learn的train_test_split()functionality来获得更为平等的表示。

  3. 自己修剪数据。与选项2类似,如果您认为两个条目是罪魁祸首,并且它们的删除不会损害模型,则可以尝试从原始数据集中删除它们。当然,这是最不可取的选择,但如果它们真的那么少,它们不会影响模型的预测能力。

但总的来说,这是一个不健康的数据集的迹象。我也建议你寻找其他方法,你可以把你的数据分类成更少的组,这样就不会有问题了。在

您必须在火车集上使用fit_transform,但只能在测试集上使用转换。因此,countvectorizer的默认输出是一个csr矩阵。它不适用于XGBClissifier,您必须将其转换为csc矩阵。只需做:X = csc_matrix(X)。在

不要在测试集上使用countvec.fit_transform(),只使用transform()。在

换行:

documenttermmatrix_test=countvec.fit_transform(testset['description'])

为此:

^{pr2}$

这将确保训练集中出现的那些特征只从测试集中获取,如果不可用,则在那里输入0。在

fit_transform()将忘记先前训练的数据,并生成新的矩阵,该矩阵可以具有与先前输出不同的特性。因此出现了错误。在

相关问题 更多 >