簡體   English   中英

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

[英]How to increase the amount of features in PHP-AI in PHP?

我正在用 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 個數組,而$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());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM