python - HashingVectorizer 与 TfidfVectorizer 导出文件大小
问题描述
我正在使用以下内容生成模型:
from sklearn.linear_model import SGDClassifier
text_clf = OnlinePipeline([('vect', HashingVectorizer()),
('clf-svm', SGDClassifier(loss='log', penalty='l2', alpha=1e-3, max_iter=5, random_state=None)),
])
当我使用以下导出此模型时:
from sklearn.externals import joblib
joblib.dump(text_clf, 'text_clf.joblib')
我text_clf.joblib
的是45MB。当我替换HashingVectorizer()
并TfidfVectorizer()
重新导出时,我的模型是 9kb。
为什么会有这样的文件差异,并且无论如何要减少 HashingVectorizer 导出的大小。
解决方案
HashingVectorizer
是无状态的,因此不会在内存中保留任何内容。它是从传递HashingVectorizer
到SGDClassifier
.
默认情况下,根据数据计算的特征数为
n_features=1048576
因此,SGDClassifier
必须为所有这些功能保存coef_
等intercept_
变量。如果您的问题是多类的,这将会增加。对于大于 2 的类,存储将按类数增加。
需要有关TfidfVectorizer
功能的更多详细信息。在这种情况下,它的大小TfidfVectorizer.vocabulary_
只有 9kb,它的大小是多少?您可以通过以下方式访问它:
len(text_clf.named_steps['vect'].vocabulary_)
推荐阅读
- html - Angular 绑定 web api 格式
- excel - 根据计算值将多达 300 个数组字符串打印到 PDF
- javascript - 使用 jsPDF 创建单选按钮
- php - 带有布尔值的 GraphQL Where 子句不起作用(wpgraphql)
- javascript - 如何更改表单的输入文本颜色
- android - 如何使用 android.graphics.Path 正确变形形状?
- oracle - 如何在 Oracle 中使用 REGEXP_SUBSTR 从分隔字符串中获取第 n 个字符串
- java - 带有同步列表的 ConcurrentModificationException
- ansible - 使用 Ansible 的 apt 模块安装时如何获取目标文件夹?
- python - 通过文件夹/文件属性获取主机名