Python Sklearn管道连接轴的所有输入数组维度必须完全匹配

Python Sklearn管道连接轴的所有输入数组维度必须完全匹配,python,scikit-learn,Python,Scikit Learn,我不明白这个错误是从哪里来的: ValueError:串联轴的所有输入数组维度必须完全匹配,但沿维度0,索引0处的数组大小为1,索引1处的数组大小为2 理由 问题是在预处理器管道中,该管道的工作方式是tweet\u text\u transformer的输出和numeric\u transformer的输出水平堆叠,要成功实现这一点,两个输出(tweet\u text\u transformer和numeric\u transformer)必须具有相同的行数(即:轴0或尺寸-0中的元素数量) 但

我不明白这个错误是从哪里来的:

ValueError:串联轴的所有输入数组维度必须完全匹配,但沿维度0,索引0处的数组大小为1,索引1处的数组大小为2

理由 问题是在
预处理器
管道中,该管道的工作方式是
tweet\u text\u transformer
的输出和
numeric\u transformer
的输出水平堆叠,要成功实现这一点,两个输出(tweet\u text\u transformer和numeric\u transformer)必须具有相同的行数(即:轴0或尺寸-0中的元素数量)

但是当执行上述管道时,
tweet\u text\u处理器
,尽管我们希望它给出2*2矩阵,实际上有4个元素,因为CountVectorizer将输出存储为稀疏矩阵,它会删除矩阵中的任何零(以节省内存)这将数组减少到2*2矩阵,但其中只有3个元素,当与数值_转换器的输出叠加时,它不满足上述条件(因为数值转换器在轴0上有两个元素,而twwet_文本_处理器不会)

解决方案
  • 创建一个自定义转换器,将此稀疏矩阵转换为numpy数组
  • 另外,因为只有一列,所以压缩Pandas数据帧以将其转换为Panadas系列

上面的代码应该可以工作,如果解释不清楚(希望是这样),请告诉我。

请提供完整的错误输出。我有完全相同的错误。你有没有发现?
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer
from sklearn.pipeline import Pipeline
from sklearn.svm import LinearSVC
from sklearn.preprocessing import MinMaxScaler
from sklearn.compose import ColumnTransformer

data = [[1, 3, 4, 'text', 'pos'], [9, 3, 6, 'text more', 'neg']]
data = pd.DataFrame(data, columns=['Num1', 'Num2', 'Num3', 'Text field', 'Class'])

tweet_text_transformer = Pipeline(steps=[
    ('count_vectoriser', CountVectorizer()),
    ('tfidf', TfidfTransformer())
])

numeric_transformer = Pipeline(steps=[
    ('scaler', MinMaxScaler())
])

preprocessor = ColumnTransformer(transformers=[
    # (name, transformer, column(s))
    ('tweet', tweet_text_transformer, ['Text field']),
    ('numeric', numeric_transformer, ['Num1', 'Num2', 'Num3'])
])

pipeline = Pipeline(steps=[
    ('preprocessor', preprocessor),
    ('classifier', LinearSVC())
])

X_train = data.loc[:, 'Num1':'Text field']
y_train = data['Class']
pipeline.fit(X_train, y_train)
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer
from sklearn.pipeline import Pipeline
from sklearn.svm import LinearSVC
from sklearn.preprocessing import MinMaxScaler
from sklearn.compose import ColumnTransformer

data = [[1, 3, 4, 'text', 'pos'], [9, 3, 6, 'text more', 'neg']]
data = pd.DataFrame(data, columns=['Num1', 'Num2', 'Num3', 'Text field', 'Class'])



class TweetTextProcessor(BaseEstimator, TransformerMixin):
    def __init__(self):
        self.tweet_text_transformer = Pipeline(steps=[
        ('count_vectoriser', CountVectorizer()),
        ('tfidf', TfidfTransformer())    ])
       
        
    def fit(self, X, y=None):
        return self

    def transform(self, X, y=None):
       
        return  self.tweet_text_transformer.fit_transform(X.squeeze()).toarray()
        




numeric_transformer = Pipeline(steps=[
    ('scaler', MinMaxScaler())
])

preprocessor = ColumnTransformer(transformers=[
    ('tweet', TweetTextProcessor(), ['Text field']),
    ('numeric', numeric_transformer, ['Num1', 'Num2', 'Num3'])
])

pipeline = Pipeline(steps=[
    ('preprocessor', preprocessor),
    ('classifier', LinearSVC())
])

X_train = data.loc[:, 'Num1':'Text field']
y_train = data['Class']
pipeline.fit(X_train, y_train)