如何修复特征联合和管道中的元组对象错误(使用 sklearn 时)?

Posted

技术标签:

【中文标题】如何修复特征联合和管道中的元组对象错误(使用 sklearn 时)?【英文标题】:How to fix tuple object error in feature union & pipelines (while using sklearn)? 【发布时间】:2019-06-01 20:24:08 【问题描述】:

我有一个 56 列的 pandas 数据框。大约一半的列是浮点数,其他是字符串(文本数据),最后 col56 是标签列。数据集看起来像这样

Col1 Col2...Col26 Col27       Col 28   ..... Col55     Col 56
1    4      76    I like cats Cats are cool  Cat bags  1
.
.
.
1900 rows

我想同时使用数字和文本数据来运行分类算法。快速的谷歌搜索告诉我们最好的方法是使用 Feature Union

这是目前的代码

import pandas as pd
import numpy as np
from sklearn.preprocessing import FunctionTransformer
from sklearn.pipeline import FeatureUnion, Pipeline
from sklearn.svm import SVC
from sklearn.pipeline import FeatureUnion
from sklearn.feature_extraction.text import CountVectorizer

df=pd.read_csv('url')
X=df[[Col1...Col55]]
y=df[[Col56]]
from sklearn.model_selection import train_test_split
stop_list=(i, am, the...)
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=42)
pipeline = Pipeline([
    ('union',FeatureUnion([
        ('Col1', Pipeline([
            ('selector', ItemSelector(column='Col1')),
            ('caster', ArrayCaster())
            ])),
.
.
.
.
.
        ('Col27',Pipeline([
            ('selector', ItemSelector(column='Col27')),
            ('vectorizer', CountVectorizer())
            ])), 
.
.
. 
        ('Col55',Pipeline([
            ('selector', ItemSelector(column='Col55')),
            ('vectorizer', CountVectorizer())
            ]))
])),
('model',SVC())
])

然后我得到一个错误

TypeError                                 Traceback (most recent call last)
<ipython-input-8-7a2cab7bed7d> in <module>
    167         (' Col27',Pipeline([
    168             ('selector', ItemSelector(column=' Col27')),
--> 169             ('vectorizer', CountVectorizer(stop_words=stop_list))
    170         ]))

TypeError: 'tuple' object is not callable

我不明白,因为使用了完全相同的方法 here 和 here 而且似乎没有任何错误。我究竟做错了什么?我该如何解决这个问题?

【问题讨论】:

您显示的代码与错误不匹配。请发布完整且正确的代码。您是否使用])) 正确关闭了每个列管道? @VivekKumar 刚刚更正了它 我说的是内部Pipelines。查看'Col1' Pipeline 的末尾。所有其他管道都应该以这种方式结束,]))。它们未在此处显示在代码中。 @VivekKumar 是的,所有列都以与“Col1”相同的方式结束。 (在代码中添加了这部分以使其清晰) 您的错误似乎与 stop_list 相关,您可以在 stop_list 中发布您的完整代码吗? 【参考方案1】:

我认为问题在于 CountVectorizer。

    cv = CountVectorizer
    word_count_vector = cv.fit_transform(data)
    word_count_vector = cv.shape()

这会产生与您相同的错误。您实际上可以手动完成这些工作。使用 CountVectorizer 创建数据的稀疏矩阵,并使用 scipy 中的备用.hstack 将其与数值数据矩阵或数据帧对齐。它水平堆叠两个具有相同行和相同/不同列的矩阵。

【讨论】:

以上是关于如何修复特征联合和管道中的元组对象错误(使用 sklearn 时)?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 foldl 签名是管道而不是 SML 中的元组类型?

如何将字节对象转换为 python 3 中的元组列表?

根据值对python中的元组进行排序[重复]

如何将列表(元组内)中的元组转换为列表?

关于Python中元组的问题

如何比较和搜索列表中的元素与列表 SML 中的元组