几个小时以来,我试图理解 php-ml 的示例。我不明白这个例子中发生了什么。网络是从格式的 csv 文件中训练的"Текст предложения","язык"
这是示例本身
$dataset = new CsvDataset('data/languages.csv', 1);
$vectorizer = new TokenCountVectorizer(new WordTokenizer());
$tfIdfTransformer = new TfIdfTransformer();
$samples = [];
foreach ($dataset->getSamples() as $sample) {
$samples[] = $sample[0];
}
$vectorizer->fit($samples);
$vectorizer->transform($samples);
$tfIdfTransformer->fit($samples);
$tfIdfTransformer->transform($samples);
$dataset = new ArrayDataset($samples, $dataset->getTargets());
$randomSplit = new StratifiedRandomSplit($dataset, 0.1);
$classifier = new SVC(Kernel::RBF, 10000);
$classifier->train($randomSplit->getTrainSamples(), $randomSplit->getTrainLabels());
$predictedLabels = $classifier->predict($randomSplit->getTestSamples());
echo 'Accuracy: '.Accuracy::score($randomSplit->getTestLabels(), $predictedLabels);
目前尚不清楚数据在输入端的确切位置。我只知道输入是训练网络的数据。
如何将我的文本提交给输入并确定这句话用英语写成的可能性有多大?
这是示例本身的链接php-ml-examples/classification/languageDetection.php
代码以经典风格编写。
带有注释的代码(我不知道它们在php中是如何表示的,所以不要生气)。评论中可能存在不准确之处,因为我不了解您正在使用的库。
还有一种感觉就是代码里有一个逻辑炸弹,它就在于数据是
tfIdfTransformer和类标签一起传递的。vectorizer此外,我还有一些与 , 相关的设计vectorizer疑问tfIdfTransformer。此外,不仅要注意精确度,还要注意召回率。你可以在这里阅读。这个问题与样本可能不平衡的事实有关,即 在第0类中,您有 100,000 条消息,在第1类中,您有 100 条消息。在这种情况下,估计值太高了。此外,对于您的任务,在这个公式中,如果有 2 个类,您可以使用F-measure。有关更多信息,您可以在以下博客之一中查找有关如何评估算法的信息:一、二。当然,在您的情况下,这方面并没有诋毁,因为拆分为 testSet 和 trainSet 是以平衡的方式执行的(这由单词表示
Stratified)。但是,如果数据最初是不平衡的,那么基本上什么也做不了。并且有必要同时计算召回和precision。我还注意到没有执行CrossValidation,在这方面,模型估计的准确性可能会有很大差异。交叉验证包括重复分成测试集和验证集。在您的情况下,它是随机完成的。那些。:
这做了很多次。所有结果均取平均值。由于平均,评估中的错误得到补偿。