divineomega/eloquent-attribute-value-prediction

使用机器学习预测Laravel Eloquent模型属性值!

v1.0.0 2020-11-19 23:42 UTC

This package is auto-updated.

Last update: 2024-08-29 05:13:15 UTC


README

🖥️🧠💪 Eloquent Attribute Value Prediction

❤️ 为Laravel开发者提供的机器学习! ❤️

使用此包,您将能够利用机器学习的力量来预测您的Laravel Eloquent模型的属性值!🌟

使用直观的语法,您可以预测类别(字符串)和连续(数值)属性值。下面是示例。

$animal = new \App\Models\Animal();
$animal->size = 'small';
$animal->has_wings = false;
$animal->domesticated = true;

$animal->name = $animal->predict('name');

// 'cat'

$predictions = $animal->getPredictions('name');

// [
//   'cat' => 0.43,
//   'dog' => 0.40,
//   'bird' => 0.10,
//   'elephant => 0.9,
// ]

$house = new \App\Models\House();
$house->num_bedrooms = 3;
$house->num_bathrooms = 1;

$house->value = $house->predict('value');

// 180000

安装

只需运行以下Composer命令即可安装。

composer require divineomega/eloquent-attribute-value-prediction

安装后,您需要设置模型以进行属性预测。

设置

假设您有一个包含三种鸢尾花数据的IrisFlowers表。在这个例子中,我们想要能够根据花萼长度和宽度以及花瓣长度和宽度预测花的种类。

首先,我们需要为IrisFlower模型设置属性预测。

这通过向我们的模型添加HasPredictableAttributes接口和PredictsAttributes特质来完成,如下所示。

<?php

namespace App\Models;

use DivineOmega\EloquentAttributeValuePrediction\Interfaces\HasPredictableAttributes;
use DivineOmega\EloquentAttributeValuePrediction\Traits\PredictsAttributes;
use Illuminate\Database\Eloquent\Model;

class IrisFlower extends Model implements HasPredictableAttributes
{
    use PredictsAttributes;

}

然后,我们需要告诉我们的模型我们希望预测哪些属性。我们通过添加registerPredictableAttributes()函数来实现。

在这个例子中,我们希望使用预测species属性,基于sepal_lengthsepal_widthpetal_lengthpetal_width属性。这可以通过以下格式的数组来完成。

public function registerPredictableAttributes(): array
    {
        return [
            'species' => [
                'sepal_length',
                'sepal_width',
                'petal_length',
                'petal_width',
            ],
        ];
    }

您还需要将使用的属性添加到$casts数组中。重要的是机器学习算法知道每个属性中存储的数据类型,并且它是一致的。

对于我们的IrisFlower示例,以下格式是合适的。

protected $casts = [
        'sepal_length' => 'float',
        'sepal_width' => 'float',
        'petal_length' => 'float',
        'petal_width' => 'float',
        'species' => 'string',
    ];

训练

在您可以对属性值进行预测之前,您必须使用您自己的数据对机器学习模型进行训练。一般来说,您提供给模型的更多数据,其性能越好,并且越准确。

您可以使用eavp:train Artisan命令来训练您的模型,如下例所示。

php artisan eavp:train \\App\\Models\\IrisFlower

将为您希望预测的每个属性训练一个模型。当它们被训练时,它们将被保存到storage/eavp/model/目录中供将来使用。

请注意,根据您使用的数据量以及机器学习模型的复杂性,训练过程可能需要一些时间。尽可能多的训练进度将输出到控制台。

您可以重新运行此命令(手动或按计划)来重新训练您的机器学习模型。以前训练的模型将自动替换。

预测

一旦您设置了Eloquent模型并训练了机器学习模型,您就可以开始预测属性了。

例如,要预测鸢尾花的种类,您可以创建一个新的IrisFlower对象并填写一些已知的属性,然后调用predict方法。

$flower = new \App\Models\IrisFlower();
$flower->sepal_length = 5.1;
$flower->sepal_width = 3.5;
$flower->petal_length = 1.4;
$flower->petal_width = 0.2;

$species = $flower->predict('species');  

predict方法应该传递您希望预测的属性名称。然后它将返回预测作为字符串或数值类型。

在我们的示例中,这应该是“setosa”物种,基于Iris花数据集

高级

预测置信度

如果您希望,还可以检索机器学习模型对预测正确的置信度。这是通过getPredictions方法完成的。

$flower = new \App\Models\IrisFlower();
$flower->sepal_length = 4.5;
$flower->sepal_width = 2.3;
$flower->petal_length = 1.3;
$flower->petal_width = 0.3;

$predictions = $flower->getPredictions('species');

/*
array:3 [
  "setosa" => 0.69785665879791
  "versicolor" => 0.30214334120209
  "virginica" => 0.0
]
*/

在这个例子中,您可以看到机器学习模型对花朵是Setosa有大约70%的置信度,对Versicolor有大约30%的置信度,对Virginica的置信度为0%。

请注意,只有当您尝试预测的属性是非数值属性时,才能使用getPredictions方法。

更改属性估计器

默认情况下,属性值是通过K-d Neighbors进行预测的。这是一种比标准K最近邻算法更有效的方法。

用于预测属性值的人工智能算法称为“估计器”。如果您愿意,可以修改每个属性使用的估计器。

要这样做,您需要向您的模型添加一个registerEstimators方法。

public function registerEstimators(): array
{
    return [
        'species' => new MultilayerPerceptron([
            new Dense(50),
            new Dense(50),
        ]),
    ];
}

在上面的例子中,我们将species属性的估计器更改为具有两个密集连接隐藏层的多层感知器分类器(神经网络)。

在底层,这个包使用了Rubix ML库。这意味着您可以使用任何它支持的估计器。

请参阅选择估计器页面,了解您可以使用的所有可用估计器列表,用于属性预测。