我试图在python中定义一个管道,使用sklearn.pipeline.Pipeline执行三个步骤:预处理、预测和后处理。最终的目标是定义一个Google函数,其中我只传递j强有力的模型,并得到这个标签的预测标签和预测概率。
我成功地用前两个步骤定义了管道,它工作得很好。但是,当我试图包含第三个步骤(后处理)时,我会得到错误消息。我尝试过不同的方法,得到了不同的错误信息。在下面的代码中,如果我从管道中删除('proba', FunctionTransformer(findProba()),一切都正常。我似乎不知道如何将后处理步骤包含到我的管道中。
Scikit-learn将管道类(参见https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.Pipeline.html)定义为:
带最终估计量的
变换流水线。
依次应用转换列表和最终估计器。管道的中间步骤必须是“转换”,也就是说,它们必须实现fit和transform方法。最后的估计只需实现fit。管道中的变压器可以使用内存参数进行缓存。
读了这个定义,我开始怀疑是否有可能在估值器之后包含一个步骤。但是在我的例子中,我确实需要能够返回类(在我的例子中是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')发布于 2019-12-17 14:02:21
sklearn.pipeline.Pipeline的语义如下:一个变压器序列(即实现fit和transform),后面是一个最终的预测器(即实现fit和predict (可选的predict_proba、decision_function等)。
因为所有的scikit学习指标都只期望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])https://stackoverflow.com/questions/59373800
复制相似问题