我目前正在尝试添加一个额外的功能到一个反矢量矩阵,这是由scikit-learn创建的。
工作流程如下:我有一个数据框架,其中包括一个带有文本的列和一个包含附加功能的列。
我首先将数据分成训练数据框和测试数据框。然后对训练数据的文本列应用反矢量器。然后我拟合一个随机森林分类器与反矢量矩阵作为输入。
我现在试图存档的是,我想运行随机森林分类器与矩阵和附加功能,这是在我的数据框的另一列。
我该如何做得最好?我已经读过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')],
remainder='passthrough',
)
x_train_preproc = preproc.fit_transform(x_train)
x_test_preproc = preproc.transform(x_test)
model.fit(x_train_preproc, y_train)
您可以为其他列添加另一个变压器,而不是仅仅通过remainder
传递它们。我会考虑使用Pipeline
将模型添加到与预处理相同的对象中;它为您节省了一些处理"预处理"文件的时间。数据集。请注意,ColumnTransformer
中的列规范在维度方面有点挑剔;文本预处理器通常需要一维输入。
ColumnTransformer
,至少像我给它的那样,需要数据框作为输入(这样text
引用列名)。如果输入是帧,那么train_test_split
的输出将是帧,并且sklearn方法都将帧作为输入,所以只需放弃.toarray()
的帧转换和数组转换。