【问题标题】:ValueError: Found input variables with inconsistent numbers of samples: [1, 3185]ValueError:发现样本数量不一致的输入变量:[1, 3185]
【发布时间】:2018-06-03 10:10:21
【问题描述】:
# -*- coding: utf-8 -*-
"""
Created on Sun Jun  3 01:36:10 2018

@author: Sharad
"""
import numpy as np
import pickle
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
dbfile=open("D:/df_train_api.pk", 'rb')
df=pickle.load(dbfile)


y=df[['label']]
features=['groups']
X=df[features].copy()
X.columns
y.columns

#for spiliting into training and test data

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=324)
#for vectorizing
count_vect = CountVectorizer()
X_train_counts = count_vect.fit_transform(X_train)
X_train_counts.shape

from sklearn.feature_extraction.text import TfidfTransformer
tfidf_transformer = TfidfTransformer()
X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)
X_train_tfidf.shape

from sklearn.naive_bayes import MultinomialNB
clf = MultinomialNB().fit(X_train_tfidf, y_train)

问题在于向量化,因为它给了我 X_train_counts 的大小 [1,1]。我不知道为什么。这就是为什么 MultinomialNB 无法执行该操作,因为 y_train 的大小为 [1, 3185]。 我是机器学习的新手。任何帮助将不胜感激。

追溯:

Traceback (most recent call last):

  File "<ipython-input-52-5b5949203f76>", line 1, in <module>
    runfile('C:/Users/Sharad/.spyder-py3/hypothizer.py', wdir='C:/Users/Sharad/.spyder-py3')

  File "C:\Users\Sharad\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 705, in runfile
    execfile(filename, namespace)

  File "C:\Users\Sharad\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 102, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Users/Sharad/.spyder-py3/hypothizer.py", line 37, in <module>
    clf = MultinomialNB().fit(X_train_tfidf, y_train)

  File "C:\Users\Sharad\Anaconda3\lib\site-packages\sklearn\naive_bayes.py", line 579, in fit
    X, y = check_X_y(X, y, 'csr')

  File "C:\Users\Sharad\Anaconda3\lib\site-packages\sklearn\utils\validation.py", line 583, in check_X_y
    check_consistent_length(X, y)

  File "C:\Users\Sharad\Anaconda3\lib\site-packages\sklearn\utils\validation.py", line 204, in check_consistent_length
    " samples: %r" % [int(l) for l in lengths])

ValueError: Found input variables with inconsistent numbers of samples: [1, 3185]

【问题讨论】:

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


【解决方案1】:

CountVectorizer(以及通过继承,TfidfTransformer 和 TfidfVectorizer)期望 fit()fit_transform() 中的原始文档的可迭代:

raw_documents : iterable
    An iterable which yields either str, unicode or file objects.

所以在内部它会这样做:

for doc in raw_documents:
    do_processing(doc)

当您在其中传递 pandas DataFrame 对象时,for ... in X 将仅生成列名。因此只处理一个文档(而不是该列中的数据)。

你需要这样做:

X = df[features].values().ravel()

或者这样做:

X=df['groups'].copy()

上面的代码和你正在做的代码有区别。你正在这样做:

X=df[features].copy()

这里的features 已经是一个列列表。所以基本上这变成了:

X=df[['groups']].copy()

区别在于这里的双括号(返回一个数据框)和我的代码中的单括号(返回一个系列)。

for value in X 在 X 是系列时按预期工作,但仅在 X 是数据框时返回列名。

希望这很清楚。

【讨论】:

    猜你喜欢
    • 2022-01-16
    • 2021-07-29
    • 2020-11-15
    • 2021-10-09
    • 2020-07-05
    • 2017-06-30
    • 1970-01-01
    • 1970-01-01
    • 2017-09-27
    相关资源
    最近更新 更多