我目前正在开发一种用于票证分类的机器学习算法,该算法将“标题”,“描述”和“客户名”组合在一起,以预测票证应分配给哪个团队,但过去几天一直被卡住。
标题和描述都是自由文本,因此我将它们传递给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之前对其进行转换的管道?我是对的,这是错误的原因吗?
谢谢。
答案 0 :(得分:1)
我认为问题在于您在TfIdfVectorizer
中提供了两列(因此将其转换为DataFrame
)。这将不起作用:TfIdfVectorizer
需要一个字符串列表。因此,立即解决方案(并因此检查是否实际上是问题的根源)将这一行更改为:string_features = 'Description'
。请注意,这不是列表,它只是一个字符串。因此,Series
被传递给TfIdfVectorizer
,而不是DataFrame
。
如果您想同时合并两个字符串列,则可以
连接字符串,因此保留一列(最简单的列),或者
适合两个不同的TfIdfVectorizers
,这虽然更复杂但性能可能更好。例如查看Computing separate tfidf scores for two different columns using sklearn
如果这不能解决您的问题,我建议您共享一些样本数据,以便我们实际测试正在发生的事情。
我相信您所感知的错误与实际管道之间的差异在于,您给了它X_train['Customer']
(还是Series
),但是在实际管道中却给了它X_train[['Customer']]
(a DataFrame
)。