作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一只 Pandas DataFrame
包括一列文本,我想矢量化文本 使用 scikit-learn 的 CountVectorizer
.但是,文本包含缺失值,因此我想 在矢量化之前输入一个常数值。
我最初的想法是创建一个 Pipeline
的 SimpleImputer
和 CountVectorizer
:
import pandas as pd
import numpy as np
df = pd.DataFrame({'text':['abc def', 'abc ghi', np.nan]})
from sklearn.impute import SimpleImputer
imp = SimpleImputer(strategy='constant')
from sklearn.feature_extraction.text import CountVectorizer
vect = CountVectorizer()
from sklearn.pipeline import make_pipeline
pipe = make_pipeline(imp, vect)
pipe.fit_transform(df[['text']]).toarray()
然而,
fit_transform
错误是因为
SimpleImputer
输出
二维数组 和
CountVectorizer
需要
一维输入 .这是错误消息:
AttributeError: 'numpy.ndarray' object has no attribute 'lower'
问题:我该如何修改这个
Pipeline
这样它会起作用吗?
Pipeline
将相同的预处理应用于新数据。 .
最佳答案
我找到的最佳解决方案是 插入自定义变压器 进Pipeline
重塑 SimpleImputer
的输出在传递给 CountVectorizer
之前从 2D 到 1D .
这是完整的代码:
import pandas as pd
import numpy as np
df = pd.DataFrame({'text':['abc def', 'abc ghi', np.nan]})
from sklearn.impute import SimpleImputer
imp = SimpleImputer(strategy='constant')
from sklearn.feature_extraction.text import CountVectorizer
vect = CountVectorizer()
# CREATE TRANSFORMER
from sklearn.preprocessing import FunctionTransformer
one_dim = FunctionTransformer(np.reshape, kw_args={'newshape':-1})
# INCLUDE TRANSFORMER IN PIPELINE
from sklearn.pipeline import make_pipeline
pipe = make_pipeline(imp, one_dim, vect)
pipe.fit_transform(df[['text']]).toarray()
已经
proposed on GitHub那个
CountVectorizer
只要第二维为 1(意思是:单列数据),就应该允许 2D 输入。对
CountVectorizer
的修改将是这个问题的一个很好的解决方案!
关于python - 如何在 scikit-learn 管道中的 CountVectorizer 之前包含 SimpleImputer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63000388/
我是一名优秀的程序员,十分优秀!