【问题标题】:Error predicting: X has n features per sample, expecting m错误预测:X 每个样本有 n 个特征,期望 m
【发布时间】:2018-12-14 22:16:34
【问题描述】:

我得到以下代码,我将文本转换为 tf:

...
x_train, x_test, y_train, y_test = model_selection.train_test_split(dataset['documents'],dataset['classes'],test_size=test_percentil)
#Term document matrix
count_vect = CountVectorizer(ngram_range=(1, Ngram), min_df=1, max_features=MaxVocabulary)
x_train_counts = count_vect.fit_transform(x_train)
x_test_counts=count_vect.transform(x_test)
#Term Inverse-Frequency
tf_transformer = TfidfTransformer(use_idf=True).fit(x_train_counts)
lista=tf_transformer.get_params()
x_train_tf = tf_transformer.transform(x_train_counts)
x_test_tf=tf_transformer.transform(x_test_counts)
...

然后,我训练一个模型并使用 pickle 保存它。 当我在另一个程序中尝试预测新数据时,问题就来了。 基本上,我得到了:

count_vect = CountVectorizer(ngram_range=(1, 1), min_df=1, max_features=None)
x_counts = count_vect.fit_transform(dataset['documents'])

#Term Inverse-Frequency
tf_transformer = TfidfTransformer(use_idf=True).fit(x_counts)
x_tf = tf_transformer.transform(x_train_counts)

model.predict(x_tf)

当我执行这段代码时,输​​出是

ValueError: X 每个样本有 8933 个特征;期待 7488

我知道这是 TfIdf 表示的问题,我听说我需要使用相同的 tf_transformer 和矢量化器来获得预期的输入形状,但我不知道如何实现这一点。 我可以存储其他转换器和矢量化器,但我尝试使用不同的组合,但一无所获。

【问题讨论】:

  • 你为什么要再次初始化count_vecttf_transformer
  • 因为我在另一个python代码中
  • 您不能使用picklejoblib 保存和加载TFidf 结果吗?

标签: python python-3.x scikit-learn tf-idf


【解决方案1】:
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.externals import joblib
a = pd.Series(["hello, this is me", "hello this is me too"])
b = pd.Series(["hello, this is John", "hi it's Doe"])
tfidf = TfidfVectorizer().fit(a)
joblib.dump(tfidf, 'path_to/tfidf.pkl')
tfidf = joblib.load('path_to/tfidf.pkl')
tfidf.transform(b).todense()

【讨论】:

  • 在 tfidfVectorizer() 上使用 fit_transform 而不是 fit。下一步该做什么?
【解决方案2】:

在另一个程序中,您正在实例化一个新对象,它不会知道以前的数据有那么多列。

您需要以与保存模型相同的方式保存CountVectorizerTfidfTransformer,并在另一个程序中以相同的方式加载它们。

另外,您可以只使用TfidfVectorizer 而不是 CountVectorizer + TfidfTransformer,因为它可以完成组合的工作,并使您的工作(保存和加载它们更容易)。

所以在训练期间这样做:

...
x_train, x_test, y_train, y_test = model_selection.train_test_split(dataset['documents'],dataset['classes'],test_size=test_percentil)
#Term document matrix
tf_vect = TfidfVectorizer(ngram_range=(1, Ngram), min_df=1, max_features=MaxVocabulary, use_idf=True)
x_train_tf = tf_vect.fit_transform(x_train)
x_test_tf = tf_vect.transform(x_test)

...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-15
    • 2015-11-13
    • 1970-01-01
    • 2021-04-20
    • 2015-05-01
    • 2020-10-03
    • 2020-03-07
    • 2020-05-21
    相关资源
    最近更新 更多