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()
。像你训练过的模型一样,你应该使用训练时使用的相同的词干向量器
。我想这就是我所做的。或者我应该使用相同的对象吗?会有什么区别?与已经训练过的模型和未训练过的模型有相同的区别。相同的词干向量器对象将变换new_vect.fit_transform()
。像你训练过的模型一样,你应该使用训练时使用的相同的词干向量器
。我想这就是我所做的。或者我应该使用相同的对象吗?会有什么区别?与已经训练过的模型和未训练过的模型有相同的区别。相同的词干向量器对象将变换