我正在使用TNT搜索文本分类模块, https://github.com/teamtnt/tntsearch,而且效果很好,问题是我不知道如何解释结果-更具体地说是正确匹配的可能性。我已经读过它使用Naive Bayes classifier,但是我无法找到结果是什么样的概率分布。我有自己的小型测试数据集,包含约50个值(50/10 = 5个类别),并且猜测非常正确。
但是,此工具提供的似然数在-15到-25范围内为负数。
问题是,什么价值可以解释为不可信?假设该工具的把握度仅为<33%。什么值对应于此假设?
答案 0 :(得分:1)
我已经与TNTSearch开发人员联系。分类器实际上不返回概率,而是“最高分数”。而且仅是最佳匹配。
根据建议,我对代码进行了一些更改。
在类private string serialRx = string.Empty;
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
serialRx += serialPort1.ReadExisting();
string[] lines = serialRx.Split(new char[] { '$' },
StringSplitOptions.None);
for (int i = 0; i < lines.Length - 1; i++)
{
if (lines[i].StartsWith("GPGSV"))
{
string[] values = lines[i].Split(new char[] { ',' });
foreach (var value in values)
{
Invoke(new Action(() => displaySplits(value)));
}
Invoke(new Action(() => displayReceivedText(lines[i])));
}
}
}
中,我更改了TeamTNT\TNTSearch\Classifier\TNTClassifier
方法中的位(受here启发的softmax函数):
predict
然后可以在public function predict($statement)
{
$words = $this->tokenizer->tokenize($statement);
$best_likelihoods = [];
$best_likelihood = -INF;
$best_type = '';
foreach ($this->types as $type) {
$best_likelihoods[$type] = -INF;
$likelihood = log($this->pTotal($type)); // calculate P(Type)
$p = 0;
foreach ($words as $word) {
$word = $this->stemmer->stem($word);
$p += log($this->p($word, $type));
}
$likelihood += $p; // calculate P(word, Type)
if ($likelihood > $best_likelihood) {
$best_likelihood = $likelihood;
$best_likelihoods[$type] = $likelihood;
$best_type = $type;
}
}
return [
'likelihood' => $best_likelihood,
'likelihoods' => $best_likelihoods,
'probability' => $this->softmax($best_likelihoods),
'label' => $best_type
];
}
中找到百分比概率。