我正在使用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的counvectorizer构建文档术语描述矩阵,它使用下面的代码生成scipy矩阵(因为我有1.1亿的巨大数据,我使用稀疏表示来减少空间复杂度)
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'])
虽然预测testset Xgboost期望trainset的所有功能都在testset中但是不可能(稀疏矩阵仅表示非零条目)
我无法将列车和测试集合组合成单个数据集,因为我只需要为列车集做特征选择
任何人都可以告诉我如何进一步接近?
答案 0 :(得分:2)
不要在testset上使用<?php
class exampleThread extends Thread
{
var $Mobile;
var $code;
public function __construct($Mobile, $code)
{
$this->Mobile = $Mobile;
$this->code = $code;
}
public function run()
{
}
};
?>
,而只使用countvec.fit_transform()
。
更改此行:
transform()
对此:
documenttermmatrix_test=countvec.fit_transform(testset['description'])
这将确保训练集中存在的那些功能仅从测试集中获取,如果不可用,则将0放在那里。
fit_transform()将忘记之前训练过的数据并制作新的矩阵,该矩阵可以具有与先前输出不同的特征。因此错误。
答案 1 :(得分:2)
您必须在列车集上使用HttpContext.Current.Cache
,但只能在您的测试集上进行转换。因此,fit_transform
的默认输出是csr矩阵。它不能与countvectorizer
一起使用,您必须将其转换为csc矩阵。只需:XGBClissifier
。
答案 2 :(得分:0)
这个问题没有简单的方法,因为它很常见。 XGBoost和其他基于树的模型可以处理比训练集更多变量的测试集(因为它可以忽略它们),但从不会更少(因为它期望对它们做出决定) 。在这种情况下,你有一些选择,按需要/可能性的降序排列你的问题:
不要使用稀疏矩阵。除非您在实时应用程序或其他禁止生产环境中构建此模型,否则最简单的方法是使用一个保持零列的普通矩阵。
了解您如何对数据进行分区。可能只有一两个因素存在不平衡分割,在这种情况下您可能会获得通过玩scikit学习train_test_split()
functionality来获得更平等的代表性。
自行修剪数据。与选项2类似,如果您认为一些条目是罪魁祸首,并且它们的删除不会对您的模型造成伤害,您可以尝试从原始数据集中删除它们。当然,这是最不可取的选择,但如果它们真的很少,那么它们就不会影响模型的预测能力。
但从广义上讲,这是不健康数据集的标志。我还建议您查看其他方法,将数据分类或分类为更少的组,这样就不会出现问题。