Machine learning 使用scikit学习文本分类:如何获取新文档&x27;pickle模型的s表示

Machine learning 使用scikit学习文本分类:如何获取新文档&x27;pickle模型的s表示,machine-learning,scikit-learn,logistic-regression,tf-idf,document-classification,Machine Learning,Scikit Learn,Logistic Regression,Tf Idf,Document Classification,我有一个文档二项分类器,它使用文档训练集的tf idf表示,并对其应用逻辑回归: lr_tfidf = Pipeline([('vect', tfidf),('clf', LogisticRegression(random_state=0))]) lr_tfidf.fit(X_train, y_train) 我将模型保存在pickle中,并使用它对新文档进行分类: text_model = pickle.load(open('text_model.pkl', 'rb')) results =

我有一个文档二项分类器,它使用文档训练集的tf idf表示,并对其应用逻辑回归:

lr_tfidf = Pipeline([('vect', tfidf),('clf', LogisticRegression(random_state=0))])

lr_tfidf.fit(X_train, y_train)
我将模型保存在pickle中,并使用它对新文档进行分类:

text_model = pickle.load(open('text_model.pkl', 'rb'))
results = text_model.predict_proba(new_document)
如何在不显式计算的情况下获得模型用于此新文档的表示(特性+频率)

编辑:我试图更好地解释我想要得到什么。 如果我使用predict_proba,我猜新文档将表示为术语频率向量(根据存储的模型中使用的规则),这些频率将乘以逻辑回归模型学习的系数,以预测类别。我说得对吗?如果是,我如何获得predict_proba使用的新文档的术语和术语频率


我正在使用sklearn v 0.19

正如我从评论中了解到的,您需要从管道内部访问tfidfVectorizer。这可以通过以下方式轻松实现:

tfidfVect = text_model.named_steps['vect']
现在,您可以使用矢量器的来获取tfidf值

tfidf_vals = tfidfVect.transform(new_document)

tfidf\u vals
将是一个稀疏的单行矩阵,其中包含在
新文档中找到的术语的tfidf。要检查此矩阵中存在哪些术语,您需要使用
tfidfVect.get_feature_names()

Tfidf传统上是术语频率乘以文档频率的弓形向量。您可能能够从Tfidf内部对象数据中分解原始计数。您能提供代码吗?虽然原始计数是不够的。。。我需要文档中每个术语的实际tfidf值。如果您正在酸洗管道,那么它将tfidf模型包含为
vect
,因此您可以直接使用它!当你对管道进行pickle处理时,它只包含训练集中的文档而不是新文档。TF-IDF向量是从语料库(训练数据)中生成的,我不确定你从评论中寻找的是什么,我同意@eugenio正在寻找的答案。在你想要的管道中获得步骤并使用它来矢量化。谢谢,这正是我所需要的。唯一的问题是一些额外的预处理活动(例如,自定义词干分析器)保存在模型中,但无法从tfidfVect访问,我认为最简单的解决方案是在拟合之前应用它们。问题:通过将我得到的每个tfidf与相应的逻辑回归系数相乘,我可以说该术语对将新文档分类为1类有多大影响,我说的对吗?它是一个二项式分类器,可用类别为0或1。