PHP
Aprendizaje automático
Buscar..
Observaciones
El tema utiliza PHP-ML para todos los algoritmos de aprendizaje automático. La instalación de la biblioteca se puede hacer usando
composer require php-ai/php-ml
El repositorio github para el mismo se puede encontrar aquí .
También vale la pena señalar que los ejemplos que se dan son conjuntos de datos muy pequeños solo para fines de demostración. El conjunto de datos real debería ser más completo que eso.
Clasificación utilizando PHP-ML
La clasificación en aprendizaje automático es el problema que identifica a qué conjunto de categorías pertenece una nueva observación. La clasificación cae dentro de la categoría de Supervised Machine Learning
.
Cualquier algoritmo que implementa clasificación se conoce como clasificador
Los clasificadores soportados en PHP-ML son
- SVC (Clasificación de vectores de soporte)
- k-vecinos más cercanos
- Ingenuo bayes
El método de train
y predict
es el mismo para todos los clasificadores. La única diferencia sería en el algoritmo subyacente utilizado.
SVC (Clasificación de vectores de soporte)
Antes de comenzar con la predicción de una nueva observación, debemos entrenar a nuestro clasificador. Considere el siguiente código
// Import library
use Phpml\Classification\SVC;
use Phpml\SupportVectorMachine\Kernel;
// Data for training classifier
$samples = [[1, 3], [1, 4], [2, 4], [3, 1], [4, 1], [4, 2]]; // Training samples
$labels = ['a', 'a', 'a', 'b', 'b', 'b'];
// Initialize the classifier
$classifier = new SVC(Kernel::LINEAR, $cost = 1000);
// Train the classifier
$classifier->train($samples, $labels);
El código es bastante sencillo. $cost
utilizado anteriormente es una medida de cuánto queremos evitar errores de clasificación de cada ejemplo de capacitación. Por un valor menor de $cost
puede obtener ejemplos mal clasificados. Por defecto se establece en 1.0
Ahora que hemos capacitado al clasificador, podemos comenzar a hacer algunas predicciones reales. Considera los siguientes códigos que tenemos para las predicciones.
$classifier->predict([3, 2]); // return 'b'
$classifier->predict([[3, 2], [1, 5]]); // return ['b', 'a']
El clasificador en el caso anterior puede tomar muestras sin clasificar y predice sus etiquetas. predict
método de predict
puede tomar una sola muestra, así como una serie de muestras.
k-vecinos más cercanos
El clasificador de este algoritmo toma dos parámetros y puede inicializarse como
$classifier = new KNearestNeighbors($neighbor_num=4);
$classifier = new KNearestNeighbors($neighbor_num=3, new Minkowski($lambda=4));
$neighbor_num
es el número de vecinos más cercanos para escanear en el algoritmo knn , mientras que el segundo parámetro es la métrica de distancia, que por defecto en el primer caso sería Euclidean
. Más sobre Minkowski se puede encontrar aquí .
A continuación se muestra un breve ejemplo de cómo usar este clasificador.
// Training data
$samples = [[1, 3], [1, 4], [2, 4], [3, 1], [4, 1], [4, 2]];
$labels = ['a', 'a', 'a', 'b', 'b', 'b'];
// Initialize classifier
$classifier = new KNearestNeighbors();
// Train classifier
$classifier->train($samples, $labels);
// Make predictions
$classifier->predict([3, 2]); // return 'b'
$classifier->predict([[3, 2], [1, 5]]); // return ['b', 'a']
Clasificador NaiveBayes
NaiveBayes Classifier
se basa en Bayes' theorem
y no necesita ningún parámetro en el constructor.
El siguiente código demuestra una implementación de predicción simple
// Training data
$samples = [[5, 1, 1], [1, 5, 1], [1, 1, 5]];
$labels = ['a', 'b', 'c'];
// Initialize classifier
$classifier = new NaiveBayes();
// Train classifier
$classifier->train($samples, $labels);
// Make predictions
$classifier->predict([3, 1, 1]); // return 'a'
$classifier->predict([[3, 1, 1], [1, 4, 1]); // return ['a', 'b']
Caso practico
Hasta ahora solo usamos matrices de enteros en todos nuestros casos, pero ese no es el caso en la vida real. Por lo tanto, permítame tratar de describir una situación práctica sobre cómo usar los clasificadores.
Supongamos que tiene una aplicación que almacena las características de las flores en la naturaleza. En aras de la simplicidad, podemos considerar el color y la longitud de los pétalos. Entonces, dos características serían usadas para entrenar nuestros datos.
color
es el más simple donde puede asignar un valor int a cada uno de ellos y para la longitud, puede tener un rango como(0 mm,10 mm)=1 , (10 mm,20 mm)=2
. Con los datos iniciales entrena a tu clasificador. Ahora, uno de sus usuarios necesita identificar el tipo de flor que crece en su patio trasero. Lo que hace es seleccionar elcolor
de la flor y agrega la longitud de los pétalos. El clasificador en ejecución puede detectar el tipo de flor ("Etiquetas en el ejemplo anterior")
Regresión
En la clasificación utilizando PHP-ML
asignamos etiquetas a una nueva observación. La regresión es casi la misma con la diferencia de que el valor de salida no es una etiqueta de clase sino un valor continuo. Es ampliamente utilizado para predicciones y previsiones. PHP-ML soporta los siguientes algoritmos de regresión
- Regresión de vectores de apoyo
- Regresión lineal de LeastSquares
La regresión tiene el mismo train
y métodos de predict
que los utilizados en la clasificación.
Regresión de vectores de apoyo
Esta es la versión de regresión para SVM (Máquina de vectores de soporte). El primer paso como en la clasificación es entrenar a nuestro modelo.
// Import library
use Phpml\Regression\SVR;
use Phpml\SupportVectorMachine\Kernel;
// Training data
$samples = [[60], [61], [62], [63], [65]];
$targets = [3.1, 3.6, 3.8, 4, 4.1];
// Initialize regression engine
$regression = new SVR(Kernel::LINEAR);
// Train regression engine
$regression->train($samples, $targets);
En la regresión, $targets
no son etiquetas de clase en lugar de clasificación. Este es uno de los factores diferenciadores para los dos. Después de entrenar nuestro modelo con los datos, podemos comenzar con las predicciones reales.
$regression->predict([64]) // return 4.03
Tenga en cuenta que las predicciones devuelven un valor fuera del objetivo.
Regresión lineal de LeastSquares
Este algoritmo utiliza el least squares method
para aproximar la solución. Lo siguiente demuestra un simple código de entrenamiento y predicción.
// Training data
$samples = [[60], [61], [62], [63], [65]];
$targets = [3.1, 3.6, 3.8, 4, 4.1];
// Initialize regression engine
$regression = new LeastSquares();
// Train engine
$regression->train($samples, $targets);
// Predict using trained engine
$regression->predict([64]); // return 4.06
PHP-ML también ofrece la opción de Multiple Linear Regression
. Un código de ejemplo para el mismo puede ser el siguiente
$samples = [[73676, 1996], [77006, 1998], [10565, 2000], [146088, 1995], [15000, 2001], [65940, 2000], [9300, 2000], [93739, 1996], [153260, 1994], [17764, 2002], [57000, 1998], [15000, 2000]];
$targets = [2000, 2750, 15500, 960, 4400, 8800, 7100, 2550, 1025, 5900, 4600, 4400];
$regression = new LeastSquares();
$regression->train($samples, $targets);
$regression->predict([60000, 1996]) // return 4094.82
Multiple Linear Regression
es particularmente útil cuando múltiples factores o rasgos identifican el resultado.
Caso practico
Ahora tomemos una aplicación de regresión en el escenario de la vida real.
Supongamos que ejecuta un sitio web muy popular, pero el tráfico sigue cambiando. Desea una solución que pueda predecir la cantidad de servidores que necesita implementar en cualquier momento del tiempo. Supongamos por el hecho de que su proveedor de alojamiento le ofrece una API para generar servidores y cada servidor tarda 15 minutos en arrancar. En función de los datos anteriores de tráfico y regresión, puede predecir el tráfico que afectaría a su aplicación en cualquier momento. Gracias a ese conocimiento, puede iniciar un servidor 15 minutos antes de la oleada, lo que evita que su aplicación se desconecte.
Agrupación
La agrupación se trata de agrupar objetos similares juntos. Es ampliamente utilizado para el reconocimiento de patrones. Clustering
se realiza bajo unsupervised machine learning
, por lo tanto, no se necesita capacitación. PHP-ML tiene soporte para los siguientes algoritmos de clustering
- k-medios
- dbscan
k-medios
k-Means separa los datos en n
grupos de igual varianza. Esto significa que debemos pasar un número n
que sería el número de clústeres que necesitamos en nuestra solución. El siguiente código ayudará a traer más claridad
// Our data set
$samples = [[1, 1], [8, 7], [1, 2], [7, 8], [2, 1], [8, 9]];
// Initialize clustering with parameter `n`
$kmeans = new KMeans(3);
$kmeans->cluster($samples); // return [0=>[[7, 8]], 1=>[[8, 7]], 2=>[[1,1]]]
Tenga en cuenta que la salida contiene 3 matrices porque ese era el valor de n
en el constructor KMeans
. También puede haber un segundo parámetro opcional en el constructor, que sería el initialization method
. Por ejemplo considera
$kmeans = new KMeans(4, KMeans::INIT_RANDOM);
INIT_RANDOM
coloca un centroide completamente aleatorio al intentar determinar los clústeres. Pero solo para evitar que el centroide esté demasiado lejos de los datos, está limitado por los límites de espacio de los datos.
El initialization method
predeterminado de initialization method
constructor es kmeans ++, que selecciona el centroide de una manera inteligente para acelerar el proceso.
DBSCAN
A diferencia de KMeans
, DBSCAN
es un algoritmo de agrupamiento basado en densidad, lo que significa que no pasaremos n
lo que determinaría la cantidad de clústeres que queremos en nuestro resultado. Por otro lado esto requiere dos parámetros para funcionar.
- $ minSamples: el número mínimo de objetos que deben estar presentes en un clúster
- $ epsilon: Cuál es la distancia máxima entre dos muestras para que se consideren en el mismo grupo.
Una muestra rápida para el mismo es la siguiente
// Our sample data set
$samples = [[1, 1], [8, 7], [1, 2], [7, 8], [2, 1], [8, 9]];
$dbscan = new DBSCAN($epsilon = 2, $minSamples = 3);
$dbscan->cluster($samples); // return [0=>[[1, 1]], 1=>[[8, 7]]]
El código es bastante autoexplicativo. Una diferencia importante es que no hay forma de saber la cantidad de elementos en la matriz de salida en lugar de KMeans.
Caso practico
Ahora echemos un vistazo al uso de agrupamiento en situaciones reales.
La agrupación en clústeres se utiliza ampliamente en el
pattern recognition
ydata mining
. Considera que tienes una aplicación de publicación de contenido. Ahora, para retener a sus usuarios, deben mirar el contenido que les encanta. Asumamos por simplicidad que si están en una página web específica durante más de un minuto y se van al fondo, les encanta ese contenido. Ahora, cada uno de sus contenidos tendrá un identificador único con él y el usuario también. Haga un cluster basado en eso y usted sabrá qué segmento de usuarios tiene un gusto similar al contenido. A su vez, esto podría usarse en el sistema de recomendaciones, donde puede asumir que si a algunos usuarios del mismo grupo les encanta el artículo, a otros les gustará, y eso puede mostrarse como recomendaciones en su aplicación.