Scipy hstack 报错 "TypeError: no supported conversion for types: (dtype('float64'), dtype('O'))

16 投票
1 回答
33714 浏览
提问于 2025-04-17 21:26

我正在尝试使用hstack把一列整数值和通过TF-IDF创建的一系列列合并在一起,这样我就可以在分类器中使用这些列/特征。

我用pandas读取这一列数据,检查有没有缺失值(NA),并把这些缺失值替换成数据框中最大的值,代码如下:

  OtherColumn = p.read_csv('file.csv', delimiter=";", na_values=['?'])[["OtherColumn"]]
  OtherColumn = OtherColumn.fillna(OtherColumn.max())
  OtherColumn = OtherColumn.convert_objects(convert_numeric=True)

接着,我读取我的文本列,并运行TF-IDF来生成很多特征,代码如下:

  X = list(np.array(p.read_csv('file.csv', delimiter=";"))[:,2])

  tfv = TfidfVectorizer(min_df=3,  max_features=None, strip_accents='unicode',  
        analyzer='word',token_pattern=r'\w{1,}',ngram_range=(1, 2), use_idf=1,smooth_idf=1,sublinear_tf=1)
  tfv.fit(X)

最后,我想把这些所有的内容合在一起,这里就出现了错误,程序无法运行。同时,我也不确定我在这里使用StandardScaler是否合适,代码如下:

  X =  sp.sparse.hstack((X, OtherColumn.values)) #error here
  sc = preprocessing.StandardScaler().fit(X)
  X = sc.transform(X)
  X_test = sc.transform(X_test)

完整的错误信息是:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-13-79d1e70bc1bc> in <module>()
---> 47 X =  sp.sparse.hstack((X, OtherColumn.values))
     48 sc = preprocessing.StandardScaler().fit(X)
     49 X = sc.transform(X)

C:\Users\Simon\Anaconda\lib\site-packages\scipy\sparse\construct.pyc in hstack(blocks, format, dtype)
    421 
    422     """
--> 423     return bmat([blocks], format=format, dtype=dtype)
    424 
    425 

C:\Users\Simon\Anaconda\lib\site-packages\scipy\sparse\construct.pyc in bmat(blocks, format, dtype)
    537     nnz = sum([A.nnz for A in blocks[block_mask]])
    538     if dtype is None:
--> 539         dtype = upcast(*tuple([A.dtype for A in blocks[block_mask]]))
    540 
    541     row_offsets = np.concatenate(([0], np.cumsum(brow_lengths)))

C:\Users\Simon\Anaconda\lib\site-packages\scipy\sparse\sputils.pyc in upcast(*args)
     58             return t
     59 
---> 60     raise TypeError('no supported conversion for types: %r' % (args,))
     61 
     62 

TypeError: no supported conversion for types: (dtype('float64'), dtype('O'))

1 个回答

17

在讨论过的这个问题中,提到你可能需要明确地将输入转换为 sparse.hstack。因为 sparse 的代码没有 numpy 的代码那么强大。

如果 X 是一个稀疏数组,数据类型是 float,而 A 是一个密集数组,数据类型是 object,那么有几种解决方案。

sparse.hstack(X, A) # error
sparse.hstack(X.astype(object), A) # cast X to object; return object
sparse.hstack(X, A.astype(float)) # cast A to float; return float
hstack(X.A, A) # make X dense, result will be type object

如果 A 中包含一些 NaN(表示缺失值),那么使用 A.astype(float) 是可行的。关于 NaN 的更多信息,可以查看 这个链接。如果 A 是因为其他原因(比如不规则的列表)而被标记为对象类型,那么我们需要重新考虑这个问题。

另一种可能的解决方案是使用 Pandas 的 concat 方法。你可以查看 这个链接。我认为 Pandas 对这些问题的关注程度比 sparse 的开发者要高。

撰写回答