Python 如何将外部功能添加到管道中?

Python 如何将外部功能添加到管道中?,python,scikit-learn,pipeline,gridsearchcv,feature-engineering,Python,Scikit Learn,Pipeline,Gridsearchcv,Feature Engineering,很多年前这里也有类似的问题,但没有答案。我有同样的问题。在构建管道和执行网格搜索以找到最佳超参数之前,我想在稀疏矩阵(来自TfidfVectorizer)中添加新的数据列(在我的例子中是3列虚拟变量) 目前,我可以使用下面的代码,在不使用GridSearch和Pipeline的情况下逐个模型地完成此操作 # this is an NLP project X = df["text"] # column of text y = df["target"] # c

很多年前这里也有类似的问题,但没有答案。我有同样的问题。在构建
管道
和执行
网格搜索
以找到最佳超参数之前,我想在稀疏矩阵(来自
TfidfVectorizer
)中添加新的数据列(在我的例子中是3列虚拟变量)

目前,我可以使用下面的代码,在不使用
GridSearch
Pipeline
的情况下逐个模型地完成此操作

# this is an NLP project
X = df["text"] # column of text
y = df["target"] # continuous target variable
X_train, X_unseen, y_train, y_unseen = train_test_split(X, y, test_size=0.5, stratify=df_merged["platform"], random_state=42)

# vectorize
tvec = TfidfVectorizer(stop_words="english")
X_train_tvec = tvec.fit_transform(X_train)

# get dummies
dummies = pd.get_dummies(df["dummies"]).values
# add dummies to tvec sparse matrix
X_train_tvec_dumm = hstack([X_train_tvec, dummies]).toarray()
从这里,我可以将我的模型拟合到
X_train\u tvec_dumm
训练数据上,其中包括
TfidfVectorizer
中单词向量的稀疏矩阵(形状:n_行,n_列)和3个虚拟列。因此,最终形状为(n_行,n_列+3)

我尝试构建
管道,如下所示

# get dummies
dummies = pd.get_dummies(df["dummies"]).values

def add_dummies(matrix):
    return hstack([matrix, dummies]).toarray()


pipe = Pipeline([
    ("features", FeatureUnion([
        ("tvec", TfidfVectorizer(stop_words="english")),
        ("dummies", add_dummies(??))    <-- how do I add this step into the pipeline?
    ])),
    ("ridge", RidgeCV())
])

pipe_params = {
    'features__tvec__max_features': [200, 500],
    'features__tvec__ngram_range': [(1,1), (1,2)]
}

gs = GridSearchCV(pipe, param_grid=pipe_params, cv=4)
gs.fit(X_train, y_train)
print(gs.best_score_)
#得到假人
dummies=pd.get_dummies(df[“dummies”])。值
def添加_假人(矩阵):
返回hstack([matrix,dummies]).toarray()
管道([
(“特色”,特色联盟([
(“tvec”,TFIDF矢量器(stop_words=“english”),

(“dummies”,添加dummies(??)而不是
从pandas获取dummies
使用
onehotcoder
sklearn。预处理
,以及
ColumnTransformer
sklearn。组合
。制作一个数据框,其中包含“文本”和“类别| dummie”列作为特征

OneHotEncoder
需要整数类型的功能。如果您的功能不是int类型,请先编码|将它们映射到int,然后应用
OneHotEncoder

#。。。
从sklearn.compose导入ColumnTransformer
从sklearn.pipeline导入管道
从sklearn.impute导入SimpleImputer
从sklearn.preprocessing导入OneHotEncoder
text_功能=['text']
text_transformer=管道(步骤=[
('vectorizer',TfidfVectorizer(stop_words=“english”)))
分类特征=['category']
分类变压器=管道(步骤=[
('inputer',simplemputer(strategy='constant',fill_value='missing'),
('onehot',onehotcoder(handle_unknown='ignore'))])
预处理器=列转换器(
变形金刚=[
(“文本”、文本转换器、文本功能),
('cat',分类变压器,分类特征)])
管道=管道(步骤=[(“预处理器”,预处理器),
(“脊”,RidgeCV())
])
# ...

使用
sklearn中的
onehotcoder
代替从pandas中获取假人。预处理
,以及
sklearn中的
ColumnTransformer
。组合
。制作一个包含“文本”和“类别”假人”列的数据框

OneHotEncoder
需要整数类型的功能。如果您的功能不是int类型,请先编码|将它们映射到int,然后应用
OneHotEncoder

#。。。
从sklearn.compose导入ColumnTransformer
从sklearn.pipeline导入管道
从sklearn.impute导入SimpleImputer
从sklearn.preprocessing导入OneHotEncoder
text_功能=['text']
text_transformer=管道(步骤=[
('vectorizer',TfidfVectorizer(stop_words=“english”)))
分类特征=['category']
分类变压器=管道(步骤=[
('inputer',simplemputer(strategy='constant',fill_value='missing'),
('onehot',onehotcoder(handle_unknown='ignore'))])
预处理器=列转换器(
变形金刚=[
(“文本”、文本转换器、文本功能),
('cat',分类变压器,分类特征)])
管道=管道(步骤=[(“预处理器”,预处理器),
(“脊”,RidgeCV())
])
# ...

感谢您提供的解决方案!我不知道
ColumnTransformer
。我将添加一个选项,用于对列中的文本进行矢量化,它应该是
text\u features=“text”
不带方括号,否则会得到1x1的稀疏矩阵。感谢您的解决方案!我不知道
ColumnTransformer
。我要补充的是,对于列中的文本矢量化,应该是
text\u features=“text”
不带方括号,否则会得到1x1的稀疏矩阵。