为了账号安全,请及时绑定邮箱和手机立即绑定

Scikit Learn - 结合 TfidfVectorizer 和 OneHotEncoder

Scikit Learn - 结合 TfidfVectorizer 和 OneHotEncoder

莫回无 2021-11-16 15:11:57
我目前正在开发一种用于票证分类的机器学习算法,该算法将标题、描述和客户名称结合在一起,以预测票证应该分配给哪个团队,但过去几天一直被卡住。标题和描述都是自由文本,所以我通过 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']))它自己返回一个错误:预期的二维数组改为一维数组。我相信 OneHotEncoder 失败了,因为它需要一个数组数组(一个 Pandas 数据帧),每个数组的长度为 1,包含客户名称。但相反只是得到一个熊猫系列。通过使用 .to_frame() 将系列转换为数据帧,打印输出现在似乎与 TfidfVectorizer 输出的内容匹配,并且尺寸应该匹配。有没有办法可以修改管道中的 OneHotEncoder 以便它接受一维输入?或者有什么我可以添加到管道中的东西,可以在它传递到 OneHotEncoder 之前将其转换?我是否正确,这是错误的原因?谢谢。
查看完整描述

1 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

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

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

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

我相信您感知到的错误与实际管道之间的区别在于您提供了它X_train['Customer'](再次 a Series),但在实际管道中您提供了它X_train[['Customer']]( a DataFrame)。


查看完整回答
反对 回复 2021-11-16
  • 1 回答
  • 0 关注
  • 223 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信