使用PHP进行鸢尾花分类(机器学习)【PHP-ML】

契机

普段はPHPで開発をしているのですが、以前から機械学習に興味がありPythonの勉強をしてみたりしていました。
機械学習・AI=Pythonという考えがあったのですが、ふとPHPで機械学習のライブラリがあるということを聞き使って見ることにしました。

安装图书馆

使用PHP-ML这个库。
使用composer进行安装。

composer require php-ai/php-ml

实践

我现在立即开始写代码。
事先准备了一些示例数据。
这次我们来尝试做一个机器学习中的经典案例,鸢尾花的分类。
我们将使用k近邻法来进行学习。
关于机器学习的方法,以下的文章应该会有所帮助。
机器学习的13种方法 ー初学者和中级者的解释!

数据准备

即使说数据已经准备好了,也不能直接使用。
因此,为了训练,我们需要对数据进行加工。(据说这是机器学习中最困难的部分)

// 学習データ120,テストデータ30(8:2)
// 学習させるためのデータと学習させた物のテストをするためのデータに分ける
const LERNING_NUM = 120;
const TEST_NUM = 30;

// データ取得
$dataset = new IrisDataset();
$samples = $dataset->getSamples();
$targets = $dataset->getTargets();

// データを加工
// ラベルと数値データが別々の配列になっているので、同じ配列にする
for ($i=0; $i < count($samples); $i++) { 
    $processedData[] = [
        'label' => $targets[$i],
        $columns[0] => (float)$samples[$i][0],
        $columns[1] => (float)$samples[$i][1],
        $columns[2] => (float)$samples[$i][2],
        $columns[3] => (float)$samples[$i][3],
    ];
}
// 同じ種類のデータで固まっているのでシャッフル
shuffle($processedData);

// 学習用データとテストデータを分割
$splitDatas = array_chunk($processedData, LERNING_NUM);

// 学習用データ
for ($i=0; $i < LERNING_NUM; $i++) {
    $learningSamples[] = [
        $splitDatas[0][$i]['sepal_length'],
        $splitDatas[0][$i]['sepal_width'],
        $splitDatas[0][$i]['petal_length'],
        $splitDatas[0][$i]['petal_width'],
    ];
    $learningTargets[] = $splitDatas[0][$i]['label'];
}

// テスト用データ
for ($i=0; $i < TEST_NUM; $i++) {
    $testSamples[] = [
        $splitDatas[1][$i]['sepal_length'],
        $splitDatas[1][$i]['sepal_width'],
        $splitDatas[1][$i]['petal_length'],
        $splitDatas[1][$i]['petal_width'],
    ];
    $testTargets[] = $splitDatas[1][$i]['label'];
    ;
}

学习

只需要这段代码就可以进行学习。
只需将之前处理过的数据传递过去。(非常方便)

$classifier = new KNearestNeighbors();
$classifier->train($learningSamples, $learningTargets);

考试

我们将测试其是否能够进行有效的分类。

$results = $classifier->predict($testSamples);

互相核对答案

我会仔细检查并予以回答。

$correctResult = 0;
// 正答数抽出
foreach ($results as $key => $result) {
    // 正答数
    if ($result === $testTargets[$key]) {
        $correctResult++;
    }
}
 
echo '正答率は' . ($correctResult/TEST_NUM)*100 . '%です。' . "\n";

输出结果

正答率は96.666666666667%です。

真不错呢。
顺便说一下,每次执行结果都会稍微变化。

// 2回目
正答率は90%です。
// 3回目
正答率93.333333333333%です。
.
.

我们运行大约10次,有超过90%的结果,可以认为很好了。

线衣

整个代码的样子是这样的。

<?php
require_once __DIR__ . '/vendor/autoload.php';

use Phpml\Dataset\Demo\IrisDataset;
use Phpml\Classification\KNearestNeighbors;

// 学習データ120,テストデータ30(8:2)
const LERNING_NUM = 120;
const TEST_NUM = 30;

// データ取得
$dataset = new IrisDataset();
$samples = $dataset->getSamples();
$targets = $dataset->getTargets();

// データを加工
for ($i=0; $i < count($samples); $i++) { 
    $processedData[] = [
        'label' => $targets[$i],
        $columns[0] => (float)$samples[$i][0],
        $columns[1] => (float)$samples[$i][1],
        $columns[2] => (float)$samples[$i][2],
        $columns[3] => (float)$samples[$i][3],
    ];
}
// データをシャッフル
shuffle($processedData);

// 学習用データとテストデータを分割
$splitDatas = array_chunk($processedData, LERNING_NUM);

// 学習用データ
for ($i=0; $i < LERNING_NUM; $i++) {
    $learningSamples[] = [
        $splitDatas[0][$i]['sepal_length'],
        $splitDatas[0][$i]['sepal_width'],
        $splitDatas[0][$i]['petal_length'],
        $splitDatas[0][$i]['petal_width'],
    ];
    $learningTargets[] = $splitDatas[0][$i]['label'];
}

// テスト用データ
for ($i=0; $i < TEST_NUM; $i++) {
    $testSamples[] = [
        $splitDatas[1][$i]['sepal_length'],
        $splitDatas[1][$i]['sepal_width'],
        $splitDatas[1][$i]['petal_length'],
        $splitDatas[1][$i]['petal_width'],
    ];
    $testTargets[] = $splitDatas[1][$i]['label'];
    ;
}
 
// 学習させる
$classifier = new KNearestNeighbors();
$classifier->train($learningSamples, $learningTargets);

// テスト
$results = $classifier->predict($testSamples);

$correctResult = 0;
// 正答率抽出
foreach ($results as $key => $result) {
    // 正答数
    if ($result === $testTargets[$key]) {
        $correctResult++;
    }
}

echo '正答率は' . ($correctResult/30)*100 . '%です。' . "\n";

最后

听说PHP有机器学习库,我试了一下,挺有趣的呢。
当然,和可以在Python等语言使用的库相比,它稍显逊色,但作为试验性质的话还是不错的。
嗯,如果要认真学习机器学习的话,还是得用Python…

bannerAds