TypeError:预期的序列或类似数组,得到了估计器

Posted

技术标签:

【中文标题】TypeError:预期的序列或类似数组,得到了估计器【英文标题】:TypeError: Expected sequence or array-like, got estimator 【发布时间】:2017-02-06 08:00:24 【问题描述】:

我正在开展一个对产品进行用户评论的项目。我正在使用 TfidfVectorizer 从我的数据集中提取特征,以及我手动提取的其他一些特征。

df = pd.read_csv('reviews.csv', header=0)

FEATURES = ['feature1', 'feature2']
reviews = df['review']
reviews = reviews.values.flatten()

vectorizer = TfidfVectorizer(min_df=1, decode_error='ignore', ngram_range=(1, 3), stop_words='english', max_features=45)

X = vectorizer.fit_transform(reviews)
idf = vectorizer.idf_
features = vectorizer.get_feature_names()
FEATURES += features
inverse =  vectorizer.inverse_transform(X)
  
for i, row in df.iterrows():
   for f in features:
      df.set_value(i, f, False)
      for inv in inverse[i]:
        df.set_value(i, inv, True)

train_df, test_df = train_test_split(df, test_size = 0.2, random_state=700)

上面的代码工作正常。但是,当我将 max_features 从 45 更改为更高的值时,tran_test_split 行出现错误。

回溯如下:

Traceback (most recent call last):
  File "analysis.py", line 120, in <module>
    train_df, test_df = train_test_split(df, test_size = 0.2, random_state=700)
  File "/Users/user/Tools/anaconda/lib/python2.7/site-packages/sklearn/cross_validation.py", line 1906, in train_test_split
    arrays = indexable(*arrays)
  File "/Users/user/Tools/anaconda/lib/python2.7/site-packages/sklearn/utils/validation.py", line 201, in indexable
    check_consistent_length(*result)
  File "/Users/user/Tools/anaconda/lib/python2.7/site-packages/sklearn/utils/validation.py", line 173, in check_consistent_length
    uniques = np.unique([_num_samples(X) for X in arrays if X is not None])
  File "/Users/user/Tools/anaconda/lib/python2.7/site-packages/sklearn/utils/validation.py", line 112, in _num_samples
    'estimator %s' % x)
TypeError: Expected sequence or array-like, got estimator

我不确定当我更改增加 max_features 大小时到底发生了什么变化。

如果您需要更多数据或我遗漏了什么,请告诉我

【问题讨论】:

df.info() 是什么? 您应该将 X 和 y 传递给 train_test_split(),而不是 pandas Frame 对象。 @sergzach 我用了这个答案***.com/a/24151789/3735157 @sergzach 当我使用来自 Tfidf 的 45 个功能时,代码运行良好。但是当我增加上述功能时,它会给我带来错误。我采用了另一种技术将我的特征集拆分为训练和测试,并且适用于超过 45 个特征。所以我的问题是当我从 45 岁增加时发生了什么变化。 @NickilMaveli df.info &lt;class 'pandas.core.frame.DataFrame'&gt; RangeIndex: 49998 entries, 0 to 49997 Columns: 934 entries, Unnamed: 0 to yes dtypes: bool(914), float64(3), int64(16), object(1) memory usage: 51.2+ MB None。请注意,934 是因为目前我正在通过 tfidf 添加 900 个功能。 【参考方案1】:

我知道这很旧,但我遇到了同样的问题,虽然 @shahins 的答案有效,但我想要一些可以保留数据框对象的东西,这样我就可以在训练/测试拆分中建立索引。

解决办法:

将数据框列重命名为其他东西(任何东西):

df = df.rename(columns = 'fit': 'fit_feature')

为什么有效:

问题实际上并不是功能的数量,而是导致问题的特定功能。我猜您将“适合”一词作为您的文本功能之一(并且它没有显示为较低的max_features 阈值)。

查看 sklearn 源代码,它会检查您的任何对象是否具有“适合”属性,以确保您没有通过 sklearn 估算器。该代码正在检查 sklearn 估计器的 fit 方法,但是当您有数据框的 fit 列时也会引发异常(请记住 df.fitdf['fit'] 都选择“适合”列)。

【讨论】:

【参考方案2】:

我遇到了这个问题,我尝试了类似的方法,它对我有用:

train_test_split(df.as_matrix(), test_size = 0.2, random_state=700)

【讨论】:

实际上,这与@elphz 描述的原因相同。有一个名为“fit”的列会导致问题。您可以重命名它或将其转换为矩阵。如果您想保留原始列名(例如特征是单词),那么这是更好的方法。【参考方案3】:
train_test_split(x.as_matrix(), y.as_matrix(), test_size=0.2, random_state=0)

这对我有用。

【讨论】:

以上是关于TypeError:预期的序列或类似数组,得到了估计器的主要内容,如果未能解决你的问题,请参考以下文章

mysql-connector-python cursor_cent.py 文件上的 Django 迁移错误“TypeError:序列项 1:预期类似字节的对象,str found”

TypeError:列表中列表的预期字符串或类似字节的对象

TypeError:预期的字符串或类似字节的对象 HashingVectorizer

Django DateField TypeError 预期的字符串或类似字节的对象

在抓取网站时,'TypeError:预期的字符串或类似字节的对象'

TypeError: Django中日期范围的预期字符串或类似字节的对象错误。