Fasttext 在一个标签模型分类上不一致
Fasttext inconsistent on one label model classification
我正在使用官方 FastText python 库 (v0.9.2) 进行意图分类。
import fasttext
model = fasttext.train_supervised(input='./test.txt',
loss='softmax',
dim=200,
bucket=2000000,
epoch=25,
lr=1.0)
其中 test.txt 仅包含一个示例文件,例如:
__label__greetings hi
并预测两个话语结果为:
print(model.words)
print('hi', model.predict('hi'))
print('bye', model.predict('bye'))
app_1 | ['hi']
app_1 | hi (('__label__greetings',), array([1.00001001]))
app_1 | bye ((), array([], dtype=float64))
这是我的预期输出,同时如果为同一标签设置两个样本:
__label__greetings hi
__label__greetings hello
OOV 的结果不正确。
app_1 | ['hi', '</s>', 'hello']
app_1 | hi (('__label__greetings',), array([1.00001001]))
app_1 | bye (('__label__greetings',), array([1.00001001]))
我知道问题出在 </s>
标记上,可能是文本文件中的 \n
?当词汇表上没有任何单词时,文本将被替换为 </s>
.有任何火车选项或方法可以跳过此行为吗?
谢谢!
FastText 是一种大型的、需要大量数据的算法,它从随机初始化开始。您不应该期望结果是合理的或确实符合对玩具大小数据集的任何期望 - 其中(例如)您的 n-gram 桶的 100%-minus-epsilon 不会接受任何训练。
我也不希望 supervised
模式能够可靠地预测真实数据集上的无标签——它希望所有训练数据都有标签,但我没有看到它的用途预测“不在训练数据中”的隐含 'ghost' 类别与单个已知标签(如“one-class classification”)。
(据推测,我认为您可能必须显式地向 FastText supervised
模式提供 __label__not-greetings
标记的对比数据——如果您没有其他任何东西,也许只是合成随机字符串——以便它有希望有意义地预测“不问候”。)
鉴于此,我认为您输入 bye
的第一个结果不正确,第二个结果也不正确。两者都只是来自训练不足的模型的噪声结果,该模型被要求做出一种它不知道能够做出的区分。
除了gojomo的回答,我们可以说你的训练数据集绝对太小。
如果你没有显着的标注数据集,可以试试零样本分类:从一个预训练的语言模型开始,你只设置一些标签,让模型尝试对句子进行分类。
Here 你可以看到并测试一个有趣的演示。
另请阅读此 good article 关于零镜头分类的理论和实施。
我正在使用官方 FastText python 库 (v0.9.2) 进行意图分类。
import fasttext
model = fasttext.train_supervised(input='./test.txt',
loss='softmax',
dim=200,
bucket=2000000,
epoch=25,
lr=1.0)
其中 test.txt 仅包含一个示例文件,例如:
__label__greetings hi
并预测两个话语结果为:
print(model.words)
print('hi', model.predict('hi'))
print('bye', model.predict('bye'))
app_1 | ['hi']
app_1 | hi (('__label__greetings',), array([1.00001001]))
app_1 | bye ((), array([], dtype=float64))
这是我的预期输出,同时如果为同一标签设置两个样本:
__label__greetings hi
__label__greetings hello
OOV 的结果不正确。
app_1 | ['hi', '</s>', 'hello']
app_1 | hi (('__label__greetings',), array([1.00001001]))
app_1 | bye (('__label__greetings',), array([1.00001001]))
我知道问题出在 </s>
标记上,可能是文本文件中的 \n
?当词汇表上没有任何单词时,文本将被替换为 </s>
.有任何火车选项或方法可以跳过此行为吗?
谢谢!
FastText 是一种大型的、需要大量数据的算法,它从随机初始化开始。您不应该期望结果是合理的或确实符合对玩具大小数据集的任何期望 - 其中(例如)您的 n-gram 桶的 100%-minus-epsilon 不会接受任何训练。
我也不希望 supervised
模式能够可靠地预测真实数据集上的无标签——它希望所有训练数据都有标签,但我没有看到它的用途预测“不在训练数据中”的隐含 'ghost' 类别与单个已知标签(如“one-class classification”)。
(据推测,我认为您可能必须显式地向 FastText supervised
模式提供 __label__not-greetings
标记的对比数据——如果您没有其他任何东西,也许只是合成随机字符串——以便它有希望有意义地预测“不问候”。)
鉴于此,我认为您输入 bye
的第一个结果不正确,第二个结果也不正确。两者都只是来自训练不足的模型的噪声结果,该模型被要求做出一种它不知道能够做出的区分。
除了gojomo的回答,我们可以说你的训练数据集绝对太小。
如果你没有显着的标注数据集,可以试试零样本分类:从一个预训练的语言模型开始,你只设置一些标签,让模型尝试对句子进行分类。
Here 你可以看到并测试一个有趣的演示。
另请阅读此 good article 关于零镜头分类的理论和实施。