我正在使用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 LEAL LEAL的顾问器构建文档术语矩阵,该级别的scipy矩阵(由于我有1100万的大数据,我正在使用稀疏表示来降低空间复杂性)使用以下代码
countvec = CountVectorizer()
documenttermmatrix=countvec.fit_transform(trainset['description'])
之后,我将使用
对上述矩阵应用功能选择 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期望火车集的所有功能都在测试集中,但不可能(稀疏矩阵仅表示非零条目)
我无法将火车和测试集合到单个数据集中,因为我只需要为火车集做选择
谁能告诉我如何进一步接近?
,而不是在测试集上使用countvec.fit_transform()
,而仅使用transform()
。
更改此行:
documenttermmatrix_test=countvec.fit_transform(testset['description'])
:
documenttermmatrix_test=countvec.transform(testset['description'])
这将确保训练集中存在的那些功能仅取自测试集,如果不可用,则将0放在那里。
fit_transform()将忘记以前的训练数据,并制作新的矩阵,该矩阵具有与以前的输出不同的功能。因此错误。
您必须在火车集上使用fit_transform
,但仅在测试集上转换。因此,countvectorizer
的默认输出是CSR矩阵。它不适用于XGBClissifier
,您必须将其转换为CSC矩阵。简单地: X = csc_matrix(X)
。
在这个问题上没有简单的方法,这是常见的。XGBOOST和其他基于树的模型可以使用> 变量来处理测试集(因为它可以忽略它们),但从来没有更少(因为它期望对它们做出决策)。在这种情况下,您有一些选择,以期望/可能性的降序解决您的问题:
-
不要使用稀疏矩阵。,除非您在实时应用程序或以其他方式的生产环境中构建此模型,否则最简单的事情就是使用普通矩阵这将保留零的列。
-
查看如何分区数据。可能只有一个或两个因素,有一个不平衡的拆分,在这种情况下,您可能能够获得更多的相等通过使用Scikit Learn的
train_test_split()
功能来表示。 -
修剪数据。类似于选项2,如果您认为有几个入口是罪魁祸首,并且它们的删除不会损害您的模型,则可以尝试将其从原始数据集中删除。当然,这是最不可取的选择,但是如果它们确实很少,它们将不会影响您的模型的预测能力。
,但总体而言,这是一个不健康数据集的标志。我还建议您查看您可以键入或将数据分类为较少组的其他方式,这样这不是问题。