我正在使用一个项目来检测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。