我正在使用xgboost执行文本分类。
下面是我正在考虑的训练集
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万的巨大数据,我使用稀疏表示来降低空间复杂性),使用以下代码
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期望训练集的所有特征都在测试集中,但这是不可能的(稀疏矩阵仅表示非零条目)
我不能将训练集和测试集组合到单个数据集中,因为我只需要对训练集进行特征选择
有没有人能告诉我如何才能更进一步?
发布于 2017-11-23 13:30:18
只使用transform(),而不是在测试集上使用countvec.fit_transform()。
更改此行:
documenttermmatrix_test=countvec.fit_transform(testset['description'])要这样做:
documenttermmatrix_test=countvec.transform(testset['description'])这将确保训练集中存在的那些特征仅取自测试集中,如果不可用,则将0放在那里。
fit_transform()将忘记以前训练过的数据,并生成新的矩阵,该矩阵可以具有与以前的输出不同的特征。因此出现了错误。
发布于 2017-11-24 07:52:04
您必须在训练集上使用fit_transform,但仅在您的测试集上使用转换。因此,countvectorizer的默认输出是csr矩阵。它不适用于XGBClissifier,您必须将其转换为csc矩阵。只需执行以下操作:X = csc_matrix(X)。
发布于 2017-11-21 22:55:10
尽管这个问题很常见,但没有简单的方法来解决它。XGBoost和其他基于树的模型可以处理具有比训练集更多的变量的测试集(因为它可以忽略它们),但永远不会更少(因为它希望对它们做出决定)。在这种情况下,您有一些选择,按合意性/可能性的降序来解决您的问题:
train_test_split() functionality来获得更均匀的表示。自己对数据进行 但总的来说,这是一个不健康的数据集的迹象。我还建议您寻找其他方法,您可以将数据分类或分类到较少的组中,这样这就不会成为问题。
https://stackoverflow.com/questions/47407996
复制相似问题