:)如果我的代码看起来像一个新手会写的东西,那么提前很抱歉。下面是我在python中的代码的一部分。我正在摆弄sklearn
和机器学习技巧。
我根据不同的数据集训练了几个朴素贝叶斯模型并将它们存储在trained_models
中
在此步骤之前,我使用chi_squared
函数创建了SelectPercentile类的对象chi2
。从我的理解,我应该写 data_feature_reduced = chi_squared.transform(some_data)
然后使用{{1}在这样的训练时,即:data_feature_reduced
这就是做了什么,并存储了结果对象 nb.fit(data_feature_reduced, data.target)
(以及list_models列表中的一些其他信息。
我现在正尝试将这些模型应用于不同的数据集(实际上来自同一来源,如果这对问题很重要)
nb
我必须承认我对功能选择部分有点陌生。 这是我得到的错误:
for name, model, intra_result, dev, training_data, chi_squarer in trained_models:
cross_results = []
new_vect= StemmedVectorizer(ngram_range=(1, 4), stop_words='english', max_df=0.90, min_df=2)
for data in demframes:
data_name = data[0]
X_test_data = new_vect.fit_transform(data[1].values.astype('U'))
Y_test_data = data[2]
chi_squared_test_data = chi_squarer.transform(X_test_data)
final_results.append((name, "applied to", data[0], model.score(X_test_data,Y_test_data)))
在第ValueError: X has a different shape than during fitting.
行
我假设我正在以错误的方式进行功能选择,我哪里出错了?
答案 0 :(得分:1)
感谢大家的帮助:) 我将粘贴帮助我从@ Vivek-Kumar解决问题的评论。
“此错误是由于此行new_vect.fit_transform()。就像您训练的模型一样,您应该使用在训练时使用的相同StemmedVectorizer
相同的StemmedVectorizer对象会将X_test_data转换为相同的形状,即训练期间的形状。目前,您正在使用不同的对象和拟合(fit_transform是适合和变换),因此形状是不同的。因此错误“
答案 1 :(得分:0)
为什么不使用管道来简化它?这样你就不必变换两次并照顾形状。
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_vect