【问题标题】:CountVector raising ValueErrorCountVector 提高 ValueError
【发布时间】:2021-08-07 15:13:59
【问题描述】:

尝试在我的 MultinomialNB 数据集上执行 train_test_split 数据格式如图_1:

figure_1

其中 duration_label 是目标,其他都是特征

由于某些特征是字符串,我需要使用 CountVector 将它们转换为浮点数,以便 MultinomialNB 工作

这就是我遇到这个问题的地方

X = df_train.iloc[:,0:5]
y = df_train.duration_label

vectorizer = CountVectorizer(stop_words = 'english')
vectorizer.fit(X)
X = vectorizer.transform(X)

X_train, X_test, y_train, y_test = train_test_split(X, y, train_size = 0.8, random_state = 0)

引发了这个错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-29-37ab36fb46be> in <module>
----> 1 X_train, X_test, y_train, y_test = train_test_split(X, y, train_size = 0.8, random_state = 0)

/opt/anaconda3/lib/python3.8/site-packages/sklearn/model_selection/_split.py in train_test_split(*arrays, **options)
   2125         raise TypeError("Invalid parameters passed: %s" % str(options))
   2126 
-> 2127     arrays = indexable(*arrays)
   2128 
   2129     n_samples = _num_samples(arrays[0])

/opt/anaconda3/lib/python3.8/site-packages/sklearn/utils/validation.py in indexable(*iterables)
    290     """
    291     result = [_make_indexable(X) for X in iterables]
--> 292     check_consistent_length(*result)
    293     return result
    294 

/opt/anaconda3/lib/python3.8/site-packages/sklearn/utils/validation.py in check_consistent_length(*arrays)
    253     uniques = np.unique(lengths)
    254     if len(uniques) > 1:
--> 255         raise ValueError("Found input variables with inconsistent numbers of"
    256                          " samples: %r" % [int(l) for l in lengths])
    257 

ValueError: Found input variables with inconsistent numbers of samples: [5, 40000]

难道我根本不应该使用 CountVector 吗?

【问题讨论】:

    标签: python pandas dataframe machine-learning scikit-learn


    【解决方案1】:

    您没有正确使用CountVectorizerscikit-learn 的文本转换器通常需要一维输入。更具体地说,可以是字符串或字节类型的项目序列。

    但是,您将整个数据帧传递给 CountVectorizer,这会导致对您的数据进行一些奇怪的处理。当您检查错误消息时,它显示Xy 中的样本数不一致,X 中只有 5 个样本,y 中只有 40000 个。

    发生的情况是CountVectorizerX 的列名误认为是要转换的原始文档。这就是 X 中只有 5 个样本的原因。

    要修复这个特定的处理错误,只需将需要处理的列传递给CountVectorizer。查看您的数据框,这将是步骤或成分:

    X = df_train['steps']
    
    vectorizer = CountVectorizer(stop_words='english')
    X = vectorizer.fit_transform(X)
    

    这就是它应该被使用的方式。


    注意

    话虽如此,您需要进行更多预处理才能使用CountVectorizer,因为您的数据格式不正确。您应该考虑将两个文本列合并为一个以一起处理它们。此外,您应该确保原始文档是字符串类型。目前,您已将它们分别存储在每个数据点的列表中,这将导致处理错误。

    【讨论】:

    • 所以我必须单独对每个特征进行矢量化,然后将它们堆叠起来?
    • 你可以这样做。但我不推荐这种方法,因为您可能会大大增加数据的维度并使预测任务更加困难。正如答案中提到的,我建议将成分和步骤组合成一列并将它们矢量化为一个文档(无论如何看起来这些都是食谱)。这将导致更少的维度,因为在每列中找到的单词可能有很大的重叠。但是,好与坏总是取决于具体情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    • 2017-11-13
    • 2019-08-09
    • 1970-01-01
    相关资源
    最近更新 更多