如何使用以下三个步骤在python中定义管道:预处理,预测和后处理?

时间:2019-12-17 11:57:41

标签: scikit-learn pipeline post-processing

我正在尝试使用sklearn.pipeline.Pipeline在python中定义管道以执行3个步骤:预处理,预测和后处理。最终目标是定义一个Google Cloud Function,我只需传递joblib模型并获得该标签的预测标签和预测概率。

我成功地通过前两个步骤定义了管道,并且运行良好。但是,当我尝试包括第三步(后处理)时,我收到错误消息。我尝试了各种方法并获得了不同的错误消息。 在以下代码中,如果我从管道中删除('proba', FunctionTransformer(findProba()),一切正常。我似乎无法弄清楚如何将后处理步骤包括到我的管道中。

Scikit-learn将管道类(请参见https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.Pipeline.html)定义为:

  

具有最终估计量的变换管道。

     

依次应用变换列表和最终估计量。管道的中间步骤必须是“转换”,也就是说,它们必须实现拟合和转换方法。最终估算器只需实现拟合。可以使用memory参数来缓存管道中的转换器。

阅读此定义后,我开始想知道是否有可能在估算器之后添加一个步骤。但是就我而言,我确实需要能够返回该类(就我而言,是konto)和得到该案例的概率(proba)。如果我在第二步之后停止,则无法在在线预测期间计算并返回概率。

我提供了代码摘要以显示我在做什么:

from nltk import word_tokenize
from nltk.corpus import stopwords
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import numpy as np
from sklearn.model_selection import train_test_split 
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.pipeline import Pipeline
from sklearn.naive_bayes import MultinomialNB
from datetime import date
import time 

import warnings
warnings.filterwarnings('ignore')


def findProba(model,Input_Text):
    Input_Text = [Input_Text]
    Y_predicted = model.predict(Input_Text)
    Y_predict_proba = model.predict_proba(Input_Text)
    max_proba_rows = np.amax(Y_predict_proba, axis=1)*100
    round_off_proba = np.around(max_proba_rows, decimals = 1)
    d = dict()
    d['Konto'] = Y_predicted[0]
    d['proba'] = round_off_proba[0]
    return d


df_total = pd.read_csv('dataset_mars2019_trimmed_mapped.csv')
df=df_total.sample(frac=0.001, random_state=1)

X_train, X_test, y_train, y_test = train_test_split(df['Input_Data'], df['LABEL'], random_state = 0, test_size=0.25)

text_clf = Pipeline([('tfidf', TfidfVectorizer()),
                     ('clf', MultinomialNB()),
                     ('proba', FunctionTransformer(findProba()),
])

 _ = text_clf.fit(X_train, y_train)


from sklearn.externals import joblib
joblib.dump(text_clf, 'model.joblib')

1 个答案:

答案 0 :(得分:1)

sklearn.pipeline.Pipeline的语义如下:一系列转换器(即实现fittransform)后跟最终的预测变量(即实现fit和{{ 1}}(可选predictpredict_proba等)。

由于所有scikit学习指标仅期望decision_functionpredict的输出,因此做您喜欢的事情并不容易。

我认为最简单的方法是实现自己的元估算器,从而实现您想要的结果:

predict_proba