我正在使用一个项目来检测out-of-domain
文本输入,在功能的帮助IsolationForest
下tf-idf
。以下是我总结的作品:
训练
在 tfidf 上:
- 使用 . 拟合和转换域内数据集
CountVectorizer()
。 - 用我的这个安装一个 tfidftransformer()
CountVectorizer()
并保存变压器(在测试期间使用它)。 - 因此,使用
tfidftransformer()
- 保存
CountVectorizer()
'svocabulary_
和TfidfTransformer()
objectpickle
用于测试时间使用。
- 使用 . 拟合和转换域内数据集
关于隔离森林:
- 收集转换后的域内数据集并训练
IsolationForest()
新颖性检测器。 - 使用 保存模型
joblib
。
- 收集转换后的域内数据集并训练
测试:
- 加载所有保存的模型。
- 在复制所有类似于训练步骤的步骤(仅限转换)后,获取当前域外输入文本的 tfidf 转换特征。
IsolationForest
使用保存的模型预测它是否在域外。
但是我发现即使 tf-idf 功能对于我的每个测试输入都完全不同,IsolationForest
总是预测为 1。
可能出了什么问题?
注意:我还尝试IsolationForest
通过模仿tf-idf
变压器的输出来输入虚拟向量来建模,以确保tf-idf
模块是否对此负责,但无论我提供哪个随机向量,我总是得到 1 作为输出IsolationForest
。另请注意,tf-idf
有很多功能(令牌),在我的情况下,计数是 48015。