gpt4 book ai didi

php - 如何在 php-ml 上使用朴素贝叶斯将新样本添加到同一标签?

转载 作者:行者123 更新时间:2023-11-30 09:27:57 25 4
gpt4 key购买 nike

我是文本分类方面的新手,我正在尝试创建一些概念验证,以更好地理解使用 PHP 的 ML 概念。所以我得到了this example ,并且我尝试添加一个新的小文本来“强化”我的标签(类别)之一,在本例中为日本:

<?php
include_once './vendor/autoload.php';
//source: https://www.softnix.co.th/2018/08/19/naive-bays-text-classification-with-php/
use Phpml\Classification\NaiveBayes;
use Phpml\FeatureExtraction\TokenCountVectorizer;
use Phpml\Tokenization\WhitespaceTokenizer;
use Phpml\Tokenization\WordTokenizer;
use Phpml\FeatureExtraction\TfIdfTransformer;

$arr_text = [
"London bridge is falling down",
"japan samurai Universal Studio spider man",
"china beijing",
"thai Chiangmai",
"Universal Studio Hollywood",
"2020 Olympic games"
];
$arr_label = [
"London","Japan","China","Thailand","USA","Japan"
];

$tokenize = new WordTokenizer();
$vectorizer = new TokenCountVectorizer($tokenize);

$vectorizer->fit($arr_text);
$vocabulary = $vectorizer->getVocabulary();
$arr_transform = $arr_text;
$vectorizer->transform($arr_transform);

$transformer = new TfIdfTransformer($arr_transform);
$transformer->transform($arr_transform);

$classifier = new NaiveBayes();
$classifier->train($arr_transform, $arr_label);

$arr_testset = [
'Hello Chiangmai I am Siam',
'I want to go Universal Studio',
'I want to go Universal Studio because I want to watch spider man',
'Sonic in 2020'
];

$vectorizer->transform($arr_testset);
$transformer->transform($arr_testset);
$result = $classifier->predict($arr_testset);
var_dump($result);

问题是,在标签数组上再次添加日本后,结果是:

array (size=4)
0 => string 'Japan' (length=5)
1 => string 'Japan' (length=5)
2 => string 'Japan' (length=5)
3 => string 'Japan' (length=5)

但我期待的是:

array (size=4)
0 => string 'Thailand' (length=8)
1 => string 'USA' (length=3)
2 => string 'Japan' (length=5)
3 => string 'Japan' (length=5)

那么,如何将新样本添加到同一标签中?

最佳答案

您的训练数据集存在两个问题:

  1. 规模太小,代表性不够
  2. 与其他标签相比,您在训练 Japan 标签时提供了两倍的数据

因此,Japan 标签的模型是在两个单词完全不相关且不重复的句子上进行训练的。其他标签仅针对一个短句子进行训练。

这导致 underfitted日本标签模型从训练数据中“学习得不够”,无法正确对训练数据进行建模,也无法推广到新数据。换句话说,它太笼统了,几乎任何句子都会触发。其余标签的型号为overfitted - 他们对训练数据建模得太好,并且仅在那些非常接近训练集数据的句子上触发。

因此,Japan 标签几乎可以捕获任何句子。在标签列表的开头,它会捕获列表中紧随其后的任何标签发生更改以评估句子之前的所有句子。当然,您可以将 Japan 标签移到列表末尾,但更好的解决方案是 - 扩大所有标签的训练数据集。

您还可以评估过度拟合的标签模型效果 - 例如,尝试向您的测试集添加“London Bridge down”和“London down”句子 - 第一个给您 London,第二个 - Japan,因为第一个句子足够接近 London 标签的句子训练集,而第二个 - 则不然。

所以继续以这种方式添加训练集数据,只要让你的训练集足够大和有代表性即可。

关于php - 如何在 php-ml 上使用朴素贝叶斯将新样本添加到同一标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57940564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com