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

问题描述 投票:1回答:1

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

标题和描述都是自由文本,所以我通过TfidfVectorizer传递它们。客户名称是一个类别,为此我使用的是OneHotEncoder。我希望这些在管道中工作,所以让它们与列变换器连接,我可以传入整个数据帧并对其进行处理。

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)

但是我收到一个错误:除了连接轴之外的所有输入数组维度必须完全匹配。

在查看之后,print(OneHotEncoder().fit_transform(X_train['Customer']))自己返回一个错误:预期的2d数组得到了1d数组。

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

有没有办法可以在管道中修改OneHotEncoder,以便它接受输入,因为它在1维?或者有什么我可以添加到管道,将其转换为OneHotEncoder之前将其转换?我是对的,这是错误的原因吗?

谢谢。

python arrays pandas scikit-learn
1个回答
1
投票

我相信问题在于你给TfIdfVectorizer两个列(因此转换为DataFrame)。这不起作用:TfIdfVectorizer需要一个字符串列表。因此,立即解决(因此检查这是否实际上是问题的根源),正在将此行更改为:string_features = 'Description'。请注意,这不是列表,只是一个字符串。因此,Series传递给TfIdfVectorizer,而不是DataFrame

如果你想组合两个字符串列,你也可以

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

我相信你的感知误差和实际管道之间的区别在于你给它X_train['Customer'](再次是Series),但在实际的管道中你给它X_train[['Customer']](一个DataFrame)。

© www.soinside.com 2019 - 2024. All rights reserved.