Scikit Learn - 结合 TfidfVectorizer 和 OneHotEncoder

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


标题和描述都是自由文本,所以我通过 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 之前将其转换?我是否正确,这是错误的原因?


谢谢。


莫回无
浏览 224回答 1
1回答

翻翻过去那场雪

我相信问题在于你给了两列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)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python