我目前正在开发一种用于票证分类的机器学习算法,该算法将标题、描述和客户名称结合在一起,以预测票证应该分配给哪个团队,但过去几天一直被卡住。标题和描述都是自由文本,所以我通过 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
。
如果您想组合两个字符串列,您可以
连接字符串,所以你保留一列(这是最简单的),或者
适合两个不同的
TfIdfVectorizers
,这更复杂但可能表现更好。例如,参见Computing separate tfidf score for two different columns using sklearn
如果这不能解决您的问题,我建议您分享一些示例数据,以便我们可以实际测试正在发生的事情。
我相信您感知到的错误与实际管道之间的区别在于您提供了它X_train['Customer']
(再次 a Series
),但在实际管道中您提供了它X_train[['Customer']]
( a DataFrame
)。
添加回答
举报
0/150
提交
取消