如何在 scikit-learn 的 Pipeline 中在 CountVectorizer 之前包含 SimpleImputer?

我有一个包含文本列的 pandas DataFrame,我想使用 scikit-learn 的 CountVectorizer对文本进行向量化。然而,文本中包含缺失值,因此我想在向量化之前用一个常量值进行填补

我的初步想法是创建一个由 SimpleImputerCountVectorizer 组成的 Pipeline

import pandas as pdimport numpy as npdf = pd.DataFrame({'text':['abc def', 'abc ghi', np.nan]})from sklearn.impute import SimpleImputerimp = SimpleImputer(strategy='constant')from sklearn.feature_extraction.text import CountVectorizervect = CountVectorizer()from sklearn.pipeline import make_pipelinepipe = make_pipeline(imp, vect)pipe.fit_transform(df[['text']]).toarray()

然而,fit_transform 会报错,因为 SimpleImputer 输出的是一个二维数组,而 CountVectorizer 需要一维输入。这是错误信息:

AttributeError: 'numpy.ndarray' object has no attribute 'lower'

问题:我如何修改这个 Pipeline 使其正常工作?

注意:我知道我可以在 pandas 中填补缺失值。然而,我希望在 scikit-learn 中完成所有预处理,以便可以使用 Pipeline 对新数据应用相同的预处理。


回答:

我找到的最佳解决方案是在 Pipeline插入一个自定义转换器,将 SimpleImputer 的输出从二维转换为一维,然后再传递给 CountVectorizer

这是完整的代码:

import pandas as pdimport numpy as npdf = pd.DataFrame({'text':['abc def', 'abc ghi', np.nan]})from sklearn.impute import SimpleImputerimp = SimpleImputer(strategy='constant')from sklearn.feature_extraction.text import CountVectorizervect = CountVectorizer()# 创建转换器from sklearn.preprocessing import FunctionTransformerone_dim = FunctionTransformer(np.reshape, kw_args={'newshape':-1})# 在 Pipeline 中包含转换器from sklearn.pipeline import make_pipelinepipe = make_pipeline(imp, one_dim, vect)pipe.fit_transform(df[['text']]).toarray()

GitHub 上提出,只要第二维度为 1(意味着:单列数据),CountVectorizer 就应该允许二维输入。对 CountVectorizer 的这种修改将是解决此问题的绝佳方案!

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注