TypeError: 预期是序列或类似数组,得到的是估计器[英] TypeError: Expected sequence or array-like, got estimator

本文是小编为大家收集整理的关于TypeError: 预期是序列或类似数组,得到的是估计器的处理方法,想解了TypeError: 预期是序列或类似数组,得到的是估计器的问题怎么解决?TypeError: 预期是序列或类似数组,得到的是估计器问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我正在开展一个对产品进行用户评论的项目.我正在使用 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 大小时到底发生了什么变化.

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

推荐答案

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

解决办法:

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

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

为什么有效:

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

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

本文地址:https://www.itbaoku.cn/post/1727946.html