Pandas 使用FeatureUnion从不同列向countvectorizer添加要素

Pandas 使用FeatureUnion从不同列向countvectorizer添加要素,pandas,machine-learning,scikit-learn,random-forest,feature-extraction,Pandas,Machine Learning,Scikit Learn,Random Forest,Feature Extraction,我目前正在尝试向使用scikit learn创建的countvectorizer矩阵添加一个附加功能 工作流程如下所示: 我有一个数据框,它包括一个包含文本的列和一个包含附加功能的列 我首先将数据拆分为训练和测试数据帧。 然后在训练数据的文本列上应用countvectorizer。 然后,以countvectorizer矩阵为输入拟合一个随机森林分类器 我现在试图归档的是,我想用矩阵和数据帧另一列中的附加特性运行RandomForest分类器 我怎样才能做到最好?我已经读过关于scikit fe

我目前正在尝试向使用scikit learn创建的countvectorizer矩阵添加一个附加功能

工作流程如下所示: 我有一个数据框,它包括一个包含文本的列和一个包含附加功能的列

我首先将数据拆分为训练和测试数据帧。 然后在训练数据的文本列上应用countvectorizer。 然后,以countvectorizer矩阵为输入拟合一个随机森林分类器

我现在试图归档的是,我想用矩阵和数据帧另一列中的附加特性运行RandomForest分类器

我怎样才能做到最好?我已经读过关于scikit feature union的文章,但无法在我的数据框架中使用其他列

下面是一个代码示例:

# Split the data
x_train, x_test, y_train, y_test = train_test_split(df.drop(['gender'], axis=1), df['gender'], test_size=0.2)
df_x_train = pandas.DataFrame(x_train)
df_x_test = pandas.DataFrame(x_test)
df_y_train = pandas.DataFrame(y_train)
df_y_test  = pandas.DataFrame(y_test)

vectorizer = CountVectorizer()
X__train = vectorizer.fit_transform(df_x_train['text']).toarray()
X__test = vectorizer.transform(df_x_test['text']).toarray()

# Now here I would like to add df['feature_new'] to my X_train and X_test

model = RandomForest()
model.fit(X_train, df_y_train['gender'])
...


您正在查找的是
ColumnTransformer
,而不是
FeatureUnion
。后者将多个变压器应用于每个列,而前者允许您将变压器应用于特定列

preproc=ColumnTransformer(
[('text_vect',CountVectorizer(),'text'),
余数='通过',
)
x_序列预处理=预处理拟合变换(x_序列)
x_测试\u预处理=预处理转换(x_测试)
模型拟合(x\U系列预加工、y\U系列)
您可以为其他列添加另一个转换器,而不只是使用
余数传递它们。我会考虑使用<代码>管道<代码>将模型添加到与预处理相同的对象中;这就省去了一些关于“预处理”数据集的争论。请注意,
ColumnTransformer
中的列规范对维度有点挑剔;文本预处理器通常需要一维输入

至少如我所说,
ColumnTransformer
需要数据帧作为输入(因此
text
指的是列名)。如果输入为,则
train\u test\u split
的输出将是帧,并且sklearn方法都将帧作为输入,因此只需放弃帧转换和数组转换
.toarray()