Sklearn tfidf vectorize 在 fit_transform() 之后返回不同的形状

数据挖掘 Python scikit-学习 特征提取 tfidf
2022-02-22 14:46:58

我是 ML 新手,正在尝试使用 sklearn的基本示例。我已经使用 TF-IDF 实现了将文本(单维)转换为数字并得到了正确的预测

现在我有一个不同的用例来根据婚姻状态关系状态预测工作时间,所以我的训练数据现在是二维的。

我有DataFrame形状24420 rows * 2 columns-->(24420, 2)

DataFrame其传递给TfidfVectorizer.fit_transform()函数后,它变成了形状-->(2, 3)不知道为什么!

在训练mnb.fit(x_train_tf, y_train)时它会返回一个错误

ValueError:发现样本数量不一致的输入变量:[2, 24420]

你可以看到它的初始DataFrame形状24420*2转换为2*24420

所有代码都在这里

问题:

  1. 为什么fit_transform()形状改变后数据(2,3)会发生什么变化(24420,2)这表示什么?

  2. 为什么会ValueError: Found input variables with inconsistent numbers of samples [2, 24420]出现?

  3. 为什么最初DataFrame的形状变成了2*24420

实施有什么问题?

2个回答

您的实现有什么问题是您将数据帧直接传递给 tfidf 矢量化器。如果你检查你的数据,它看起来像这样 -

>>> x_train_tf.toarray()
array([[ 0.70710678,  0.        ,  0.70710678],
       [ 0.        ,  1.        ,  0.        ]])

如果您检查您获得的功能,您会看到 -

>>> tfidf.get_feature_names()
[u'marital', u'relationship', u'status']

发生的事情是,在传递数据帧时,TfidfVectorizer仅采用列名并将它们转换为数字形式。

我认为您不需要在这里使用tfidf据我了解,您的数据是分类文本,因此请使用pandas.get_dummies()而不是 tfidf。这会将您的分类数据转换为可用于建模的数字形式。

>>> pd.get_dummies(x_train.iloc[:10,])
       marital-status_Divorced  marital-status_Married-civ-spouse  marital-status_Never-married  marital-status_Widowed  relationship_Husband  relationship_Not-in-family  relationship_Own-child  relationship_Unmarried 
1521                   1                          0                              0                        0                       0                            1                         0                        0 
2274                   0                          1                              0                        0                       1                            0                         0                        0 
20209                  0                          1                              0                        0                       1                            0                         0                        0 
5529                   0                          1                              0                        0                       1                            0                         0                        0 
27639                  0                          1                              0                        0                       1                            0                         0                        0 
26670                  0                          0                              1                        0                       0                            1                         0                        0 
16635                  0                          0                              0                        1                       0                            0                         0                        1 
30824                  0                          0                              1                        0                       0                            1                         0                        0 
15181                  0                          0                              1                        0                       0                            0                         1                        0 
9119                   1                          0                              0                        0                       0                            0                         1                        0 

在这里,出于演示目的,我只取了 10 行。

我有一个类似的问题。我正在做的是:我加载了一个预训练的 tfidf 矢量化器。在要预测的新数据上,我打电话给我vectorizer.fit_transform(),我得到了类似的错误。

解决问题的方法是调用vectorizer.transform(). 这是因为,fit_transform()将拟合模型中的当前数据,这不是我们正在寻找的,因为已经拟合了矢量化器。我们只需要将新数据转换为已创建的模型。因此,调用vectorizer.transform()完成了工作。