[英]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.