我在文本分类方面是个新手,正在尝试创建一些概念验证,以更好地理解使用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)
那么,如何为同一标签添加新样本呢?
回答:
你的训练数据集存在两个问题:
- 数据量太小且不够代表性
- 在训练
日本
标签时,你提供了比其他标签多一倍的数据
因此,日本
标签的模型是在两个完全不相关且没有重复词的句子上训练的。其他标签仅在一个短句上训练。
这导致了日本
标签模型的欠拟合,它从训练数据中“学到的不够多”,无法正确地建模训练数据,也无法推广到新数据。换句话说,它过于宽泛,几乎对任何句子都会触发。而其他标签的模型则是过拟合的——它们对训练数据的拟合过于完美,只会在与训练集数据非常接近的句子上触发。
因此,日本
标签几乎能捕获任何句子。而且由于它在标签列表的开头,它会捕获所有句子,而列表中后面的标签还没有机会评估这些句子。当然,你可以将日本
标签移到列表末尾,但更好的解决方案是——扩大所有标签的训练数据集。
你也可以评估过拟合标签模型的影响——例如,尝试在你的测试集中添加“London bridge down”和“London down”这样的句子——第一个句子会给你伦敦
,第二个句子会给你日本
,因为第一个句子与伦敦
标签的训练集句子足够接近,而第二个则不然。
所以,请按照这种方式继续添加训练集数据,只需确保你的训练集足够大且具有代表性即可。