我正在开发一个对产品进行用户评论的项目。我使用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
大小时到底发生了什么变化。
如果您需要更多数据或我遗漏了某些内容,请告诉我
答案 0 :(得分:8)
我知道这是旧的,但我遇到了同样的问题,虽然@shahins的答案有效,但我想要保留数据框对象的东西,以便我可以在火车/测试分割中进行索引。
将数据框列重命名为适合的东西(其他):
df = df.rename(columns = {'fit': 'fit_feature'})
实际上并不是问题的特征数量,特别是导致问题的一个特征。我猜你正在将“fit”这个词作为你的一个文字特征(而且它没有显示出较低的max_features
阈值)。
查看sklearn源代码,它会检查以确保您没有通过测试查看任何对象是否具有“适合”属性来传递sklearn估算器。代码正在检查sklearn估算工具的fit
方法,但如果您拥有数据框的fit
列,也会引发异常(请记住df.fit
和df['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)
这对我有用。