我正在用PHP构建Logistic回归平台。当数据框中只有一个功能时,以下代码段可以正常工作。例如这样的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,这里是example of how the AI works和data frame一起使用的框架,它仅提供1个功能。
我了解错误,$dataset->getTargets()
仅包含1个数组,而$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
数组应该是包含[SibSp,Spous]的子数组的1个数组。我想不出如何重新组织这样的数组。
答案 0 :(得分:1)
摆弄代码并研究错误以及如何解决之后,我意识到$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());