ValueError:发现样本数量不一致的输入变量:[29675、9574、29675]

Posted

技术标签:

【中文标题】ValueError:发现样本数量不一致的输入变量:[29675、9574、29675]【英文标题】:ValueError: Found input variables with inconsistent numbers of samples: [29675, 9574, 29675] 【发布时间】:2020-01-02 23:10:24 【问题描述】:

我是 ML 的初学者。问题是我在不同的文件中有训练和测试数据,并且长度不同,因此我收到以下错误:

   Traceback (most recent call last):
   File "C:/Users/Ellen/Desktop/Python/ML_4.py", line 35, in <module>
   X_train, X_test, y_train, y_test = 
   train_test_split(processed_features_train, processed_features_test, 
   labels, test_size=1, random_state=0)
   File "C:\Python\Python37\lib\site- 
   packages\sklearn\model_selection\_split.py", line 2184, in 
   train_test_split
   arrays = indexable(*arrays)
   File "C:\Python\Python37\lib\site-packages\sklearn\utils\validation.py", 
   line 260, in indexable
   check_consistent_length(*result)
   File "C:\Python\Python37\lib\site-packages\sklearn\utils\validation.py", 
   line 235, in check_consistent_length
   " samples: %r" % [int(l) for l in lengths])
   ValueError: Found input variables with inconsistent numbers of samples: 
   [29675, 9574, 29675]

我不知道如何解决这些错误。以下是我的代码:

  tweets_train = pd.read_csv('Final.csv')
  features_train = tweets_train.iloc[:, 1].values
  labels= tweets_train.iloc[:, 0].values
  vectorizer = CountVectorizer(stop_words=stopwords.words('english'))
  processed_features_train = 
  vectorizer.fit_transform(features_train).toarray()
  tweets_test = pd.read_csv('DataF1.csv')
  features_test= tweets_test.iloc[:, 1].values.astype('U')  
  vectorizer = CountVectorizer(stop_words=stopwords.words('english')) 
  processed_features_test = 
  vectorizer.fit_transform(features_test).toarray()

  X_train, X_test, y_train, y_test = 
  train_test_split(processed_features_train, processed_features_test, 
  labels, test_size=1, random_state=0)
  text_classifier = RandomForestClassifier(n_estimators=200, random_state=0)
  #regr.fit(X_train, y_train)
  text_classifier.fit(X_train, y_train)
  predictions = text_classifier.predict(X_test)
  print(confusion_matrix(y_test,predictions))
  print(classification_report(y_test,predictions))

产生错误的行是:X_train, X_test, y_train, y_test = train_test_split(processed_features_train,processed_features_test, 标签,test_size=1,random_state=0)

processed_features_train.shape 产生的输出为 (29675, 28148) 而, processes_features_test.shape 产生的输出为 (9574, 11526)

样本数据如下——(第一列为'labels',第二列为'text')

  neutral tap to explore the biggest change to world wars since world war 
  neutral tap to explore the biggest change to sliced bread. 
  negative apple blocked 
  neutral apple applesupport can i have a yawning emoji ? i think i am 
  asking for the 3rd or 5th time 
  neutral apple made with 20  more child labor 
  negative apple is not she the one who said she hates americans ? 

训练数据文件和测试数据文件中只有 3 个标签(正、负、中性)。

【问题讨论】:

在某些时候您的数据不一致,您可能拥有比标签更多的数据,或者在某些时候您的数据可能在其他方面有所不同。 如果我在同一个文件中拆分测试和训练数据,那么,我不会收到任何错误。 等等,如果你已经拆分了训练和测试文件,你为什么还要尝试使用 train_test_split? 我阅读了教程,到处都使用了train_test_split()。谢谢,Ben 注意到这一点,因为我也对这个函数的使用持怀疑态度,尤其是当 test_size 设置为 1 时。你能帮忙解决我的问题吗? 【参考方案1】:

    由于您的测试集位于一个单独的文件中,因此无需拆分数据(除非您想要一个验证集,或者测试集是指竞赛,未标记)。

    您不应该在测试数据上安装新的 Vectorizer;这样做意味着训练和测试集中的列之间没有联系。相反,请使用vectorizer.transform(features_test)(使用与您fit_transformed 训练数据相同的对象vectorizer)。

那么,试试吧:

tweets_train = pd.read_csv('Final.csv')    
features_train = tweets_train.iloc[:, 1].values 
labels_train = tweets_train.iloc[:, 0].values
vectorizer = CountVectorizer(stop_words=stopwords.words('english'))
processed_features_train = vectorizer.fit_transform(features_train).toarray() 
tweets_test = pd.read_csv('DataF1.csv')
features_test= tweets_test.iloc[:, 1].values.astype('U')
labels_test = tweets_test.iloc[:, 0].values
processed_features_test = vectorizer.transform(features_test).toarray() 

text_classifier = RandomForestClassifier(n_estimators=200, random_state=0) 
text_classifier.fit(processed_features_train, labels_train) 
predictions = text_classifier.predict(processed_features_test)
print(confusion_matrix(labels_test,predictions))
print(classification_report(labels_test,predictions))

【讨论】:

@TriptiAgrawal,已编辑以解决训练/测试拆分问题。 text_classifier.fit(processed_features_train, labels) 文件“C:\Python\Python37\lib\site-packages\sklearn\metrics\classification.py”,第 253 行,位于混淆矩阵 y_type、y_true、y_pred = _check_targets(y_true, y_pred) 文件“C:\Python\Python37\lib\site-packages\sklearn\metrics\classification.py”,第 71 行,在 _check_targets check_consistent_length(y_true, y_pred) 文件“C:\Python\Python3 ..\validation.py", line 235, in check_consistent_length " samples: %r" % [int(l) for l in lengths]) ValueError: 发现样本数量不一致的输入变量:[29679, 27435] 谢谢,本。您的帮助无疑改进了我的代码,但问题仍然存在。我在上面的评论中粘贴了最新的回溯。训练数据形状输出为:(29679, 27501),测试数据输出为 (27435, 27501) 嗨 Ben,我重新启动计算机并重新运行代码。我没有错误,所以我接受了你的回答。再次感谢!【参考方案2】:

确保样本数等于标签数

我有同样的错误,发现是因为样本数不等于标签数。

更具体地说,我有这个代码

clf = MultinomialNB().fit(X_train, Y_train)

X_train 的大小不等于 Y_train。 然后,我检查了我的代码并修复了错误。

【讨论】:

【参考方案3】:

这是因为您将三个数据集传递给 train_test_split,而不仅仅是 X, y 作为它的参数。

【讨论】:

好的,我同意。我怎样才能解决我的问题。训练数据和测试数据位于不同的文件中,并且具有不同的维度......此外,是否有必要将标签作为整数而不是标签“正”、“负”和“中性”。

以上是关于ValueError:发现样本数量不一致的输入变量:[29675、9574、29675]的主要内容,如果未能解决你的问题,请参考以下文章

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

混淆矩阵 - ValueError:发现样本数量不一致的输入变量

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

ValueError:发现样本数量不一致的输入变量:[29675、9574、29675]

Sklearn:ValueError:发现样本数量不一致的输入变量:[1, 6]

GridseachCV - ValueError:发现样本数量不一致的输入变量:[33 1]