php - 如何在 PHP 中增加 PHP-AI 中的功能数量?
问题描述
我正在用 PHP 构建一个逻辑回归平台。当数据框中只有一个特征时,以下代码片段可以正常工作。例如这样的 CSV 文件:
"sample","language"
"Hello, how are you?","english",
"Je voudrais une boîte de chocolats.","french"
...
然而,当我尝试使用这样的数据框根据泰坦尼克号的存活率(假设:兄弟姐妹和配偶的数量是否影响存活率)训练具有 2 个特征的 AI 时:
"SibSp","Parch","Survived",
"1", "1", "1",
"3", "3", "1",
"4", "1", "0"
...
我收到此错误:
Phpml\Exception\InvalidArgumentException 给定数组的大小不匹配
我的代码片段看起来像这样,$request->features
保存了这个数据框的特征数量,因为features +1
它将保存实际结果(1 = 幸存,0 = 死亡):
$dataset = new CsvDataset($file, (int) $request->features);
$vectorizer = new TokenCountVectorizer(new WordTokenizer());
$tfIdfTransformer = new TfIdfTransformer();
$samples = [];
for($i = 0; $i <= $request->features -1; $i++):
foreach ($dataset->getSamples() as $sample):
$samples[$i][] = $sample[$i];
endforeach;
endfor;
for($i = 0; $i <= count($samples) -1; $i++):
$vectorizer->fit($samples[$i]);
$vectorizer->transform($samples[$i]);
$tfIdfTransformer->fit($samples[$i]);
$tfIdfTransformer->transform($samples[$i]);
endfor;
$dataset = new ArrayDataset($samples, $dataset->getTargets()); # This throws the error
我正在使用PHP-AI/PHP-ML,这里有一个AI 如何与框架提供的仅 1 个功能的数据框一起工作的示例。
我了解错误,$dataset->getTargets()
仅包含 1 个数组,而 as$samples
包含 2 个数组。然而,这让我很困惑,因为它应该是这样的(理论上)。
一旦经过训练以记住其训练状态,我会将分类器(或经过训练的 AI)作为序列化对象存储在我的数据库中。当我只使用具有一项功能的数据框时,一切正常。有没有人有在 PHP-ML 库中使用 PHP-AI 的经验可以提供帮助?
如何增加 PHP-AI 中的功能数量?
更新以显示我的数组包含哪些值:
$samples
看起来像这样(兄弟姐妹数组,配偶数组):
array ( 0 => array ( 0 => array ( ), 1 => array ( ), 2 => array ( ), 3 => array ( ), 4 => array ( ), 5 => array ( ), 6 => array ( ), 7 => array ( ), ), 1 => array ( 0 => array ( ), 1 => array ( ), 2 => array ( ), 3 => array ( ), 4 => array ( ), 5 => array ( ), 6 => array ( ), 7 => array ( ), ), )
$dataset->getTargets()
看起来像这样(幸存或死亡):
array ( 0 => '1', 1 => '1', 2 => '0', 3 => '1', 4 => '0', 5 => '0', 6 => '1', 7 => '1', )
我相信该$samples
数组应该是 1 个包含 [SibSp, Spous] 子数组的数组。我想不出如何将数组重新组织成这样。
解决方案
在摆弄代码并研究错误以及如何解决它之后 - 我意识到$samples
数据应该表示为
Array [ 0 => [SibSp, Spous], 1 => [SibSp, Spous], ... ]
因此,通过像这样重新摆弄数据:
$result = [];
foreach($samples as $arr) {
foreach($arr as $k => $v) {
$result[$k][] = $v;
}
}
我可以达到这个预期的结果。我仍然必须将样本推入矢量化器,$sample
但最终的数据集必须重新调整:
for($i = 0; $i <= count($samples) -1; $i++):
$vectorizer->fit($samples[$i]);
$vectorizer->transform($samples[$i]);
$tfIdfTransformer->fit($samples[$i]);
$tfIdfTransformer->transform($samples[$i]);
endfor;
$dataset = new ArrayDataset($result, $dataset->getTargets());
推荐阅读
- uwp - 有没有办法动态更改列表视图及其项目样式
- sql - 完成的 COMMIT 语句是否意味着它已完成提交?
- ionic-framework - 错误:共享组件中的 StaticInjectorError HttpClient
- matlab - 我需要帮助找到导数吗?
- ruby-on-rails - 如何从数组中删除空哈希
- rust - 如果没有实现 Copy 或 Clone 特征,那么重用借用的结构字段的最佳方法是什么?
- reporting-services - 在 ssrs 的表达式中添加换行符 (vbcrlf) 时如何删除默认限定符 (") 而无需触及 reportserverconfig 文件?
- excel - 过滤数据的 Excel Sumproduct
- python - 多页表格的写入/打印表格内容
- javascript - 如何在点击时交换图像?