Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Scikit学习-结合TfidfVectorizer和OneHotEncoder的输出-维度_Python_Arrays_Pandas_Scikit Learn - Fatal编程技术网

Python Scikit学习-结合TfidfVectorizer和OneHotEncoder的输出-维度

Python Scikit学习-结合TfidfVectorizer和OneHotEncoder的输出-维度,python,arrays,pandas,scikit-learn,Python,Arrays,Pandas,Scikit Learn,我目前正在开发一种用于票证分类的机器学习算法,该算法将标题、描述和客户名称结合在一起,以预测票证应该分配给哪个团队,但在过去几天中一直处于停滞状态 标题和描述都是自由文本,因此我将通过TfidfVectorizer传递它们。客户名称是一个类别,为此我使用OneHotEncoder。我希望这些在管道中工作,这样就可以将它们与列转换器连接起来,在这里我可以传入整个数据帧并对其进行处理 file = "train_data.csv" train_data= pd.read_csv(train_file

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

标题和描述都是自由文本,因此我将通过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(onehotcoder().fit_transform(X_train['Customer']))
自身返回一个错误:预期的2d数组改为1d数组

我认为OneHotEncoder失败了,因为它需要一个数组(一个数据帧),每个数组的长度都是一个包含客户名称的数组。但是取而代之的是一个熊猫系列。通过使用.to_frame()将系列转换为数据帧,打印输出现在似乎与TfidfVectorizer输出的内容匹配,并且尺寸应该匹配

是否有办法修改管道中的OneHotEncoder,使其接受一维输入?或者我可以添加一些东西到管道中,在将其传递到OneHotEncoder之前将其转换?这就是错误的原因,我说得对吗?


谢谢。

我认为问题在于您给
TfIdfVectorizer
提供了两列(因此转换为
DataFrame
)。这将不起作用:
TFIDFvectorier
需要一个字符串列表。因此,一个直接的解决方案(并因此检查这是否是问题的根源)是将此行更改为:
string\u features='Description'
。注意这不是一个列表,它只是一个字符串。因此,
系列
被传递到
TFIDFvectorier
,而不是
数据帧

如果要合并这两个字符串列,可以

  • concatanenate字符串,因此保留一列(这是最简单的),或者

  • 安装两个不同的
    TFIDFvectoriers
    ,这更复杂,但性能可能更好。例如,见

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


我相信你所感知到的错误和实际管道之间的区别在于你给它的是
X_-train['Customer']
(又是一个
系列
),但在实际管道中你给它的是
X_-train['Customer']
(一个
数据帧
)。

非常感谢你,你说得完全正确。感谢您的洞察力和快速响应!检查此答案以获得完整的示例