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

时间:2016-09-28 11:11:36

标签: python-2.7 pandas scikit-learn

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

如果您需要更多数据或我遗漏了某些内容,请告诉我

3 个答案:

答案 0 :(得分:8)

我知道这是旧的,但我遇到了同样的问题,虽然@shahins的答案有效,但我想要保留数据框对象的东西,以便我可以在火车/测试分割中进行索引。

解决方案:

将数据框列重命名为适合的东西(其他):

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

为什么会这样:

实际上并不是问题的特征数量,特别是导致问题的一个特征。我猜你正在将“fit”这个词作为你的一个文字特征(而且它没有显示出较低的max_features阈值)。

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

答案 1 :(得分:3)

我有这个问题,我尝试过这样的事情,它对我有用:

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

答案 2 :(得分:0)

train_test_split(x.as_matrix(), y.as_matrix(), test_size=0.2, random_state=0)

这对我有用。