Python 使用sklearn-ValueError进行特征选择:X的形状与拟合期间不同

Python 使用sklearn-ValueError进行特征选择:X的形状与拟合期间不同,python,machine-learning,scikit-learn,feature-selection,Python,Machine Learning,Scikit Learn,Feature Selection,:)如果我的代码看起来像一个新手会写的东西,我会事先表示非常抱歉。下面是我用python编写的部分代码。我在摆弄sklearn和机器学习技术。 我根据不同的数据集训练了几个朴素贝叶斯模型,并将它们存储在trained_模型中 在此步骤之前,我使用用于特征选择的chi2函数创建了SelectPercentile类的对象chi_squared。根据我的理解,我应该编写data_feature_reduced=chi_squared.transform(一些数据),然后在这样的训练时使用data_fe

:)
如果我的代码看起来像一个新手会写的东西,我会事先表示非常抱歉。下面是我用python编写的部分代码。我在摆弄
sklearn
和机器学习技术。 我根据不同的数据集训练了几个朴素贝叶斯模型,并将它们存储在
trained_模型中
在此步骤之前,我使用用于特征选择的
chi2
函数创建了SelectPercentile类的对象
chi_squared

根据我的理解,我应该编写
data_feature_reduced=chi_squared.transform(一些数据)
,然后在这样的训练时使用
data_feature_reduced
,ie:
nb.fit(数据特征减少,数据目标)

这就是我们所做的,并将结果对象
nb
(以及一些其他信息)存储在列表中

我现在正试图将这些模型应用于不同的数据集(如果这与问题有关的话,实际上来自同一来源)

我必须承认,我对特征选择部分有点陌生。 以下是我得到的错误:

ValueError:X的形状与安装期间不同。
在第
行,卡方检验数据=卡方变换(X检验数据)


我假设我以一种不正确的方式进行特征选择,我哪里出错了?

为什么不使用管道来简化它呢?这样你就不必变换两次并处理形状了

from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression

chi_squarer = SelectKBest(chi2, k=100) # change accordingly
lr = LogisticRegression() # or naive bayes

clf = pipeline.Pipeline([('chi_sq', chi_squarer), ('model', lr)])

# for training:
clf.fit(training_data, targets)

# for predictions:
clf.predict(test_data)

您还可以在管道中添加
new\u vect

为什么不使用管道使其变得简单?这样您就不必变换两次并处理形状

from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression

chi_squarer = SelectKBest(chi2, k=100) # change accordingly
lr = LogisticRegression() # or naive bayes

clf = pipeline.Pipeline([('chi_sq', chi_squarer), ('model', lr)])

# for training:
clf.fit(training_data, targets)

# for predictions:
clf.predict(test_data)

您还可以在管道中添加
新的\u vect
,感谢大家的帮助

我将只粘贴帮助我解决@Vivek Kumar问题的评论


此错误是由以下行引起的
new\u vect.fit\u transform()
。例如 经过训练的模型,您应该使用与 在训练时使用

相同的
StemedVectorize
对象将
X_测试_数据
转换为相同的形状,即它在训练期间所具有的形状。目前,您使用的对象不同,并且在其上进行拟合(
fit_transform
是fit and transform),因此形状不同。因此会产生错误


谢谢大家的帮助

我将只粘贴帮助我解决@Vivek Kumar问题的评论


此错误是由以下行引起的
new\u vect.fit\u transform()
。例如 经过训练的模型,您应该使用与 在训练时使用

相同的
StemedVectorize
对象将
X_测试_数据
转换为相同的形状,即它在训练期间所具有的形状。目前,您使用的对象不同,并且在其上进行拟合(
fit_transform
是fit and transform),因此形状不同。因此会产生错误


是的。数据->使用ur向量器->使用管道。根据需要更改模型和k值。在此处阅读有关管道的更多信息:我想使用已经训练好的模型进行预测,不会在管道中调用拟合方法重新训练模型吗?我正在尝试检查新数据的准确性。是的。数据->使用ur向量器->使用pipeline.根据您的需要更改模型和k值。在此处阅读有关管道的更多信息:我想使用已经训练好的模型进行预测,不会在管道中调用fit方法重新训练模型吗?我正在尝试检查新数据的准确性此错误是由以下行引起的
new_vect.fit_transform()
。像你训练过的模型一样,你应该使用训练时使用的相同的
词干向量器
。我想这就是我所做的。或者我应该使用相同的对象吗?会有什么区别?与已经训练过的模型和未训练过的模型有相同的区别。相同的词干向量器对象将变换还原为相同的形状,即训练期间的形状。当前,您使用不同的对象并对其进行拟合(fit_transform是fit and transform),因此形状不同。因此错误此错误是由于此行
new_vect.fit_transform()
。像你训练过的模型一样,你应该使用训练时使用的相同的
词干向量器
。我想这就是我所做的。或者我应该使用相同的对象吗?会有什么区别?与已经训练过的模型和未训练过的模型有相同的区别。相同的词干向量器对象将变换还原为相同的形状,即训练期间的形状。当前,您使用不同的对象并在其上进行拟合(拟合变换是拟合和变换),因此形状不同。因此会产生错误