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

时间:2017-04-25 13:31:37

标签: python machine-learning scikit-learn feature-selection

:)如果我的代码看起来像一个新手会写的东西,那么提前很抱歉。下面是我在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.

我假设我正在以错误的方式进行功能选择,我哪里出错了?

2 个答案:

答案 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