Scikit Learn-结合TfidfVectorizer和OneHotEncoder的输出-维

时间:2019-02-22 09:56:12

标签: python arrays pandas scikit-learn

我目前正在开发一种用于票证分类的机器学习算法,该算法将“标题”,“描述”和“客户名”组合在一起,以预测票证应分配给哪个团队,但过去几天一直被卡住。

标题和描述都是自由文本,因此我将它们传递给TfidfVectorizer。客户名称是一个类别,为此,我正在使用OneHotEncoder。我希望它们可以在管道中工作,因此可以将它们与列转换器连接在一起,在其中可以传递整个数据帧并对其进行处理。

Newline
:   (   '\r' '\n'?
    |   '\n'
    )
    -> skip
;

但是我得到一个错误:除串联轴外,所有输入数组的尺寸都必须完全匹配。

查看后,file = "train_data.csv" train_data= pd.read_csv(train_file) string_features = ['Title', 'Description'] string_transformer = Pipeline(steps=[('tfidf', TfidfVectorizer())) categorical_features = ['Customer'] categorical_transformer = Pipeline(steps=[('OHE', preprocessing.OneHotEncoder())) preprocessor = ColumnTransformer(transformers = [('str', string_transformer, string_features), ('cat', categorical_transformer, categorical_features)]) clf = Pipeline(steps=[('preprocessor', preprocessor),('clf', SGDClassifier())] X_train = train_data.drop('Team', axis=1) y_train = train_data['Team'] clf.fit(X_train, y_train) 本身会返回错误:预期的2d数组将改为1d数组。

我认为OneHotEncoder失败了,因为它期望一个数组数组(一个pandas数据框),每个数组的长度为一个,包含客户名称。但是,相反,只是获得了熊猫系列。通过使用.to_frame()将系列转换为数据帧,现在打印的输出似乎与TfidfVectorizer的输出匹配,并且尺寸应匹配。

有没有一种方法可以修改管道中的OneHotEncoder,以便它按一维形式接受输入?还是我可以添加一些将在将其传递到OneHotEncoder之前对其进行转换的管道?我是对的,这是错误的原因吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

我认为问题在于您在TfIdfVectorizer中提供了两列(因此将其转换为DataFrame)。这将不起作用:TfIdfVectorizer需要一个字符串列表。因此,立即解决方案(并因此检查是否实际上是问题的根源)将这一行更改为:string_features = 'Description'。请注意,这不是列表,它只是一个字符串。因此,Series被传递给TfIdfVectorizer,而不是DataFrame

如果您想同时合并两个字符串列,则可以

如果这不能解决您的问题,我建议您共享一些样本数据,以便我们实际测试正在发生的事情。

我相信您所感知的错误与实际管道之间的差异在于,您给了它X_train['Customer'](还是Series),但是在实际管道中却给了它X_train[['Customer']](a DataFrame)。