使用 FeatureUnion 从不同的列向 countvectorizer 添加特征
Add feature to countvectorizer from different column with FeatureUnion
我目前正在尝试向使用 scikit-learn 创建的 countvectorizer 矩阵添加附加功能。
工作流程如下:
我有一个数据框,其中包含一个包含文本的列和一个包含附加功能的列。
我首先将我的数据拆分为训练数据和测试数据数据帧。
然后我将 countvectorizer 应用到训练数据的文本列。
然后我将 countvectorizer 矩阵作为输入来拟合 RandomForest 分类器。
我现在想要实现的是,我想 运行 带有矩阵的 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')],
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()
.
我目前正在尝试向使用 scikit-learn 创建的 countvectorizer 矩阵添加附加功能。
工作流程如下: 我有一个数据框,其中包含一个包含文本的列和一个包含附加功能的列。
我首先将我的数据拆分为训练数据和测试数据数据帧。 然后我将 countvectorizer 应用到训练数据的文本列。 然后我将 countvectorizer 矩阵作为输入来拟合 RandomForest 分类器。
我现在想要实现的是,我想 运行 带有矩阵的 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')],
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()
.