Как увеличить количество функций в PHP-AI в PHP? - PullRequest
0 голосов
/ 05 января 2019

Я строю платформу логистической регрессии на PHP. Следующий фрагмент кода работает нормально, когда во фрейме данных есть только одна функция. Например, CSV-файл, подобный следующему:

"sample","language"
"Hello, how are you?","english",
"Je voudrais une boîte de chocolats.","french"
...

Однако, когда я пытаюсь обучить ИИ с двумя функциями, основанными на титановой выживаемости (гипотеза: влияет ли количество братьев и сестер и супругов на выживаемость) с таким фреймом данных:

"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 массив, где $samples содержит 2 массива. Однако это поставило меня в тупик, поскольку так и должно быть (в теории).

Я храню классификатор (или обученный ИИ) как сериализованный объект в моей базе данных, как только он был обучен запоминать свое обученное состояние. Все работает нормально, когда я использую только фрейм данных с одной функцией. У кого-нибудь есть опыт использования PHP-AI в библиотеке PHP-ML, который может помочь?

Как я могу увеличить количество функций внутри 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]. Я не могу думать, как реорганизовать массив, чтобы быть таким.

1 Ответ

0 голосов
/ 05 января 2019

После возни с кодом и исследования ошибки и способов ее устранения - я понял, что данные $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());
...