如何通过预处理、预测和后处理三个步骤在 python 中定义管道?
How to define a pipeline in python with three steps: preprocessing, predicting and postprocessing?
我正在尝试使用 sklearn.pipeline.Pipeline 在 python 中定义管道以执行 3 个步骤:预处理、预测和 post 处理。最终目标是定义一个 Google Cloud Function,我只是在其中传递 joblib 模型并获得预测标签和该标签的预测概率。
我成功地通过前 2 个步骤定义了管道,并且工作正常。但是,当我尝试包括第三个(post-处理)步骤时,我收到错误消息。我尝试了各种方法并收到不同的错误消息。
在下面的代码中,如果我从管道中删除 ('proba', FunctionTransformer(findProba())
一切正常。我似乎无法弄清楚如何将 post 处理步骤包含到我的管道中。
Scikit-learn 将管道 class(参见 https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.Pipeline.html)定义为:
Pipeline of transforms with a final estimator.
Sequentially apply a list of transforms and a final estimator. Intermediate steps of the pipeline must be ‘transforms’, that is, they must implement fit and transform methods. The final estimator only needs to implement fit. The transformers in the pipeline can be cached using memory argument.
阅读此定义后,我开始怀疑是否可以在估算器之后添加一个步骤。但就我而言,我真的需要能够 return class(在我的情况下是 konto)以及获得该案例的概率(proba)。如果我在第二步之后停止,我将无法计算和 return 在线预测期间的概率。
我包含代码摘要以显示我在做什么:
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')
sklearn.pipeline.Pipeline
的语义如下:一系列转换器(即实现 fit
和 transform
),然后是最终预测器(即实现 fit
和predict
(可选 predict_proba
、decision_function
等)。
由于所有 scikit-learn 指标只期望 predict
或 predict_proba
输出,因此做你喜欢的事情并不容易。
我认为最简单的方法是实现您自己的元估计器,它将生成您想要的结果:
from sklearn.base import BaseEstimator
class PostProcessor(BaseEstimator):
def __init__(self, predictor):
self.predictor = predictor
def fit(self, X, y):
self.predictor.fit(X, y)
def predict(self, X):
y_pred = self.predictor.predict(X)
y_pred_proba = self.predictor.predict_proba(X)
# do something with those
return np.hstack([y_pred, y_pred_proba])
我正在尝试使用 sklearn.pipeline.Pipeline 在 python 中定义管道以执行 3 个步骤:预处理、预测和 post 处理。最终目标是定义一个 Google Cloud Function,我只是在其中传递 joblib 模型并获得预测标签和该标签的预测概率。
我成功地通过前 2 个步骤定义了管道,并且工作正常。但是,当我尝试包括第三个(post-处理)步骤时,我收到错误消息。我尝试了各种方法并收到不同的错误消息。
在下面的代码中,如果我从管道中删除 ('proba', FunctionTransformer(findProba())
一切正常。我似乎无法弄清楚如何将 post 处理步骤包含到我的管道中。
Scikit-learn 将管道 class(参见 https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.Pipeline.html)定义为:
Pipeline of transforms with a final estimator.
Sequentially apply a list of transforms and a final estimator. Intermediate steps of the pipeline must be ‘transforms’, that is, they must implement fit and transform methods. The final estimator only needs to implement fit. The transformers in the pipeline can be cached using memory argument.
阅读此定义后,我开始怀疑是否可以在估算器之后添加一个步骤。但就我而言,我真的需要能够 return class(在我的情况下是 konto)以及获得该案例的概率(proba)。如果我在第二步之后停止,我将无法计算和 return 在线预测期间的概率。
我包含代码摘要以显示我在做什么:
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')
sklearn.pipeline.Pipeline
的语义如下:一系列转换器(即实现 fit
和 transform
),然后是最终预测器(即实现 fit
和predict
(可选 predict_proba
、decision_function
等)。
由于所有 scikit-learn 指标只期望 predict
或 predict_proba
输出,因此做你喜欢的事情并不容易。
我认为最简单的方法是实现您自己的元估计器,它将生成您想要的结果:
from sklearn.base import BaseEstimator
class PostProcessor(BaseEstimator):
def __init__(self, predictor):
self.predictor = predictor
def fit(self, X, y):
self.predictor.fit(X, y)
def predict(self, X):
y_pred = self.predictor.predict(X)
y_pred_proba = self.predictor.predict_proba(X)
# do something with those
return np.hstack([y_pred, y_pred_proba])