首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在xgboost中预测测试数据时出错

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

Stack Overflow用户
提问于 2017-11-21 16:01:12
回答 3查看 383关注 0票数 2

我正在使用xgboost执行文本分类。

下面是我正在考虑的训练集

代码语言:javascript
复制
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的counvectorizer向量器构建文档术语描述矩阵,该向量器生成scipy矩阵(因为我有110万的巨大数据,我使用稀疏表示来降低空间复杂性),使用以下代码

代码语言:javascript
复制
countvec = CountVectorizer()
documenttermmatrix=countvec.fit_transform(trainset['description'])

之后,我将对上面的矩阵应用特征选择,使用

代码语言:javascript
复制
 fs = feature_selection.SelectPercentile(feature_selection.chi2, percentile=40)
 documenttermmatrix_train= fs.fit_transform(documenttermmatrix,y1_train)

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

代码语言:javascript
复制
model = XGBClassifier(silent=False)

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

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

代码语言:javascript
复制
itemid      description                       category
9836442     TRIPLE Space heaters              Architectural Diffusers
13863918    pushbutton switch                  Door Bell Pushbuttons

我正在使用下面的代码为测试集构造独立矩阵,就像为训练集构造独立矩阵一样

代码语言:javascript
复制
 documenttermmatrix_test=countvec.fit_transform(testset['description'])

在预测测试集时,Xgboost期望训练集的所有特征都在测试集中,但这是不可能的(稀疏矩阵仅表示非零条目)

我不能将训练集和测试集组合到单个数据集中,因为我只需要对训练集进行特征选择

有没有人能告诉我如何才能更进一步?

EN

回答 3

Stack Overflow用户

发布于 2017-11-23 13:30:18

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

更改此行:

代码语言:javascript
复制
documenttermmatrix_test=countvec.fit_transform(testset['description'])

要这样做:

代码语言:javascript
复制
documenttermmatrix_test=countvec.transform(testset['description'])

这将确保训练集中存在的那些特征仅取自测试集中,如果不可用,则将0放在那里。

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

票数 3
EN

Stack Overflow用户

发布于 2017-11-24 07:52:04

您必须在训练集上使用fit_transform,但仅在您的测试集上使用转换。因此,countvectorizer的默认输出是csr矩阵。它不适用于XGBClissifier,您必须将其转换为csc矩阵。只需执行以下操作:X = csc_matrix(X)

票数 2
EN

Stack Overflow用户

发布于 2017-11-21 22:55:10

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

  1. Don't使用稀疏矩阵。除非您是在实时应用程序或其他禁止的生产环境中构建此模型,否则最简单的做法是使用普通矩阵,该矩阵将使zeros.
  2. Look列保持您对数据的分区方式。可能只有一两个因素具有不平衡的拆分,在这种情况下,您可以通过尝试使用scikit的train_test_split() functionality来获得更均匀的表示。自己对数据进行
  3. Prune。类似于选项2,如果您认为有几个条目是罪魁祸首,并且它们的删除不会损害您的模型,您可以尝试从原始数据集中删除它们。当然,这是最不可取的选择,但如果它们真的那么少,也不会影响模型的预测能力。

但总的来说,这是一个不健康的数据集的迹象。我还建议您寻找其他方法,您可以将数据分类或分类到较少的组中,这样这就不会成为问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47407996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档