python - sklearn Count vectorizer - 如何在以后保存、加载和使用转换单个文本
问题描述
像往常一样,我正在努力将基本原理概念化。我已经在一个数据集上训练和测试了许多 1v1 估计器。训练数据是每个估计器的 count_vectorizer 和句子中所有单词的 tfidf 分数总和(每个估计器用于不同的分类器,每个分类器都有专用的词典)。因此 count_vectorizer 值保持不变,并且将其连接到与每个估计器的给定类相关的分数数组。
下面是一个玩具示例:
cv = CountVectorizer(min_df=2, ngram_range=(1, 3), stop_words=stopwords)
count_vector = cv.fit_transform(series_of_train_texts.tolist())
test_vector = cv.transform(series_of_test_texts.tolist())
df_train_scores = list(zip(df_train['score_1'], df_train['score_2'],
df_train['score_3']
))
training_array = np.array(df_train_list)
test_array = np.array(df_test_list)
X_train = np.hstack([count_vector.todense(), training_array])
X_test = np.hstack([test_vector.todense(),test_array])
svm_var = LinearSVC(tol=1e-5, max_iter=1500)
for class in groups:
svm_var.fit(X_train, df_train[class].tolist())
predictions= list(svm_var.predict(X_test))
我有两个问题:
- 如何引入一个需要首先通过计数矢量化器进行转换并在进行预测之前与各种 tfidf 分数连接的测试句子?
- 如果我 cv.transform([single_sentence]) 并与分数数组连接(1 发送所以一维数组)我得到一个形状不匹配 - 我可以强制重新形状,但我不知道为什么我会选择一个特定的形状或为什么我一开始就不必这样做。count_vectorizer 文档矩阵的形状为 (1, 3455) 的分数数组形状 = (3,)。
- 如何导出它以使其可重复使用
- 在 fit_transform 之后导出 count_vectorizer 吗?- 如果是这样,我如何导入它才能转换一个新句子?(在上面的代码中导出 count_vector - joblib.dump 并再次加载后,我不能立即使用转换 - 我需要 cv 和 count_vector - 它需要是那个特定的还是我实例化一个新的 cv?)
- 它是我导出的一个估算器吗?我不这么认为,因为它在 for 循环中对每个类进行了重新训练 - 所以我必须再次这样做还是将每个估计器保存在循环中?
我通常的解决方法是 1) 阅读文档;2)谷歌周围; 3)尝试我能想到的一切。当我到达 3 时,这是一个痛苦而漫长的过程,我尝试了我认为可能有效的每一种可能的组合,但却不知道我应该如何思考这个问题。
谁能帮我理解?
解决方案
持久化和重用训练模型的最简单方法是将其保存为一个对象。Pipeline
在 scikit-learn 中,您可以将预处理步骤和模型结合到对象中。一旦你创建了你的管道,你就可以fit()
使用你的训练集,然后joblib
像这个玩具示例一样使用它来保存它:
import joblib
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.svm import LinearSVC
from sklearn.pipeline import Pipeline
import pandas as pd
df = pd.DataFrame({
'A': ['abcde', 'abcde', 'xyz', 'xyz'],
'B': [0,0,1,1]}
)
X = df['A']
y = df['B']
model = Pipeline([('countVectorizer', CountVectorizer()),
('svc', LinearSVC())])
model.fit(X, y)
joblib.dump(model, 'model.joblib')
model2 = joblib.load('model.joblib')
model2.predict(['abde'])
推荐阅读
- c# - 如何在 Azure 上将“FFmpeg”与 c# 一起使用?
- node.js - Zeit/pkg:找不到模块“配置”
- python - 在熊猫中找到区间的交点
- amazon-web-services - 用于 EC2 Spot 顾问的 API/SDK
- vba - Excel VBA:如何在另一个工作表上创建图表之前对一个工作表上的数据进行排序?
- c - 这条线的最后一组括号是什么意思?
- reactjs - 未捕获的错误:Reference.push 失败:第一个参数在属性中包含 NaN
- c++ - 为什么包含标题时出现多个定义错误?
- c++ - 为什么不编译下面的数组的 const 左值引用?
- java - Android studio:Java 代码无法将输入发送到 Captive 门户网站