如何在使用php-ml的朴素贝叶斯算法时为同一标签添加新样本?

我在文本分类方面是个新手,正在尝试创建一些概念验证,以更好地理解使用PHP进行机器学习的概念。所以我找到了这个例子,我尝试添加一个小的新文本来“加强”我的一个标签(类别),在这种情况下,是日本

<?phpinclude_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. 在训练日本标签时,你提供了比其他标签多一倍的数据

因此,日本标签的模型是在两个完全不相关且没有重复词的句子上训练的。其他标签仅在一个短句上训练。

这导致了日本标签模型的欠拟合,它从训练数据中“学到的不够多”,无法正确地建模训练数据,也无法推广到新数据。换句话说,它过于宽泛,几乎对任何句子都会触发。而其他标签的模型则是过拟合的——它们对训练数据的拟合过于完美,只会在与训练集数据非常接近的句子上触发。

因此,日本标签几乎能捕获任何句子。而且由于它在标签列表的开头,它会捕获所有句子,而列表中后面的标签还没有机会评估这些句子。当然,你可以将日本标签移到列表末尾,但更好的解决方案是——扩大所有标签的训练数据集。

你也可以评估过拟合标签模型的影响——例如,尝试在你的测试集中添加“London bridge down”和“London down”这样的句子——第一个句子会给你伦敦,第二个句子会给你日本,因为第一个句子与伦敦标签的训练集句子足够接近,而第二个则不然。

所以,请按照这种方式继续添加训练集数据,只需确保你的训练集足够大且具有代表性即可。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注