<p>错误与测试数据的<code>fit_transform</code>有关。您<code>fit_transform</code>培训数据和仅<code>transform</code>测试数据:</p>
<pre class="lang-py prettyprint-override"><code># change this
X_test_tfidf = ifidf_vectorizer.fit_transform(X_test)
X_test_tfidf.shape
(2, 12)
# to
X_test_tfidf = ifidf_vectorizer.transform(X_test)
X_test_tfidf.shape
</code></pre>
<p><strong>原因</strong>:
当您执行<code>fit_transform</code>时,您可以使用<code>fit</code>来教授您的模型向量。模型学习用于转换数据的向量。使用训练数据学习向量,然后使用<code>transform</code>将它们应用于训练和测试</p>
<p>如果对测试数据执行<code>fit_transform</code>,则替换在训练数据中学习的向量,并将其替换为测试数据。鉴于您的测试数据小于列车数据,您可能会得到两种不同的矢量化</p>
<p><strong>更好的方法</strong>
最好的方法是使用<em>管道</em>,这将使您的流程易于理解</p>
<pre class="lang-py prettyprint-override"><code>from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.svm import LinearSVC
from sklearn.pipeline import Pipeline
clf = Pipeline(steps=[
('vectorizer', TfidfVectorizer()),
('model', LinearSVC()),
])
# train
clf.fit(X_train,y_train)
# predict
clf.predict(X_test)
</code></pre>
<p>这很容易,因为转换正在照顾您。在拟合模型时,不必担心<code>fit_transform</code>,在预测或评分时,也不必担心<code>transform</code></p>
<p>如果使用,则可以独立访问这些功能</p>
<pre class="lang-py prettyprint-override"><code>
clf.named_steps('vectorizer') # or 'model'
</code></pre>
<p>在引擎盖下,当您执行<code>clf.fit</code>操作时,您的数据将使用<code>fit_transform</code>传递到向量器,然后传递到<code>model</code>。当您预测或评分时,您的数据将在到达您的模型之前通过<code>transform</code>抛出向量器</p>