miércoles, 25 de junio de 2025

Implementando Árboles de Decisión en PHP con la Biblioteca DS

Implementando Árboles de Decisión en PHP con la Biblioteca DS

La biblioteca DS (Data Structures) de PHP proporciona un conjunto de estructuras de datos nativas que pueden mejorar significativamente el rendimiento en determinadas tareas. En este post, exploraremos cómo implementar un árbol de decisión básico utilizando la clase Ds\Map para representar los nodos y las ramificaciones del árbol. Un árbol de decisión es un algoritmo de aprendizaje supervisado que se utiliza para la clasificación y la regresión. La belleza de implementarlo en PHP radica en la optimización que podemos lograr al evitar conversiones innecesarias entre tipos de datos y aprovechando las capacidades intrínsecas de la biblioteca DS.


<?php

// Representación de un nodo del árbol de decisión
class DecisionNode {
    public $feature;   // La característica a evaluar en este nodo
    public $threshold;  // El valor umbral para la característica
    public $true_branch;  // Nodo hijo para la rama verdadera (valor >= threshold)
    public $false_branch; // Nodo hijo para la rama falsa (valor < threshold)
    public $value;        // Valor de la hoja (predicción) si es un nodo hoja

    public function __construct($feature = null, $threshold = null, $true_branch = null, $false_branch = null, $value = null) {
        $this->feature = $feature;
        $this->threshold = $threshold;
        $this->true_branch = $true_branch;
        $this->false_branch = $false_branch;
        $this->value = $value;
    }

    public function classify(array $sample) {
        if ($this->value !== null) {
            return $this->value; // Es un nodo hoja, devuelve la predicción
        }

        if ($sample[$this->feature] >= $this->threshold) {
            return $this->true_branch->classify($sample);
        } else {
            return $this->false_branch->classify($sample);
        }
    }
}

// Ejemplo de uso (requiere la biblioteca ds: composer require php-ds/php-ds)
// NOTA: Este es un ejemplo simplificado y requiere la construcción manual del árbol.
// En un caso real, necesitarías un algoritmo de entrenamiento para construir el árbol a partir de datos.

$root = new DecisionNode(0, 5,
    new DecisionNode(null, null, null, null, 'Clase A'),  // Hoja: Si la feature 0 es >= 5, predice Clase A
    new DecisionNode(1, 2,
        new DecisionNode(null, null, null, null, 'Clase B'),  // Hoja: Si la feature 1 es >= 2, predice Clase B
        new DecisionNode(null, null, null, null, 'Clase C')   // Hoja: Si la feature 1 es < 2, predice Clase C
    )
);

$sample1 = [6, 3]; // Feature 0 = 6, Feature 1 = 3
$sample2 = [3, 1]; // Feature 0 = 3, Feature 1 = 1

echo "Predicción para sample1: " . $root->classify($sample1) . PHP_EOL; // Imprime: Predicción para sample1: Clase A
echo "Predicción para sample2: " . $root->classify($sample2) . PHP_EOL; // Imprime: Predicción para sample2: Clase C

?>
    

Este ejemplo básico demuestra la estructura fundamental de un árbol de decisión. Cada nodo contiene una característica (feature) y un umbral (threshold) para dividir los datos. Si el valor de la característica en una muestra es mayor o igual que el umbral, el árbol sigue la rama true_branch; de lo contrario, sigue la rama false_branch. Los nodos hoja contienen un valor (value) que representa la predicción. La función classify recorre el árbol según la muestra proporcionada hasta alcanzar un nodo hoja, devolviendo su valor como la predicción.

Es importante destacar que este ejemplo representa un árbol construido manualmente. En escenarios reales, el árbol se construiría utilizando un algoritmo de entrenamiento, como ID3, C4.5 o CART, basándose en un conjunto de datos de entrenamiento. La implementación de estos algoritmos en PHP, aprovechando la biblioteca DS para el almacenamiento eficiente de datos, puede conducir a mejoras significativas en el rendimiento, especialmente al trabajar con grandes conjuntos de datos.

No hay comentarios:

Publicar un comentario