如何在PHP中增加PHP-AI中的功能?

时间:2019-01-05 15:59:10

标签: php artificial-intelligence logistic-regression

我正在用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 worksdata 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个数组。我想不出如何重新组织这样的数组。

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());