PHP
Apprentissage automatique
Recherche…
Remarques
Le sujet utilise PHP-ML pour tous les algorithmes d'apprentissage automatique. L'installation de la bibliothèque peut être faite en utilisant
composer require php-ai/php-ml
Le dépôt github de la même chose peut être trouvé ici .
Il convient également de noter que les exemples donnés sont de très petits ensembles de données uniquement à des fins de démonstration. Le jeu de données réel devrait être plus complet que cela.
Classification utilisant PHP-ML
La classification dans Machine Learning est le problème qui identifie à quel ensemble de catégories appartient une nouvelle observation. La classification entre dans la catégorie de l' Supervised Machine Learning
.
Tout algorithme qui implémente la classification est appelé classificateur
Les classificateurs supportés dans PHP-ML sont
- SVC (Classification vectorielle de support)
- k-voisins les plus proches
- Bayes naïves
Le train
et la méthode de predict
sont les mêmes pour tous les classificateurs. La seule différence serait dans l'algorithme sous-jacent utilisé.
SVC (Classification vectorielle de support)
Avant de pouvoir prédire une nouvelle observation, nous devons former notre classificateur. Considérez le code suivant
// 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);
Le code est assez simple. $cost
utilisé ci-dessus est une mesure de ce que nous voulons éviter de classer chaque exemple de formation par erreur. Pour une valeur de $cost
vous pourriez obtenir des exemples mal classés. Par défaut, il est défini sur 1.0
Maintenant que le classificateur est formé, nous pouvons commencer à faire des prédictions. Considérez les codes suivants que nous avons pour les prédictions
$classifier->predict([3, 2]); // return 'b'
$classifier->predict([[3, 2], [1, 5]]); // return ['b', 'a']
Le classificateur dans le cas ci-dessus peut prendre des échantillons non classifiés et prédit des étiquettes. méthode predict
peut prendre un seul échantillon ainsi qu'un tableau d'échantillons.
k-voisins les plus proches
Le classfier pour cet algorithme prend deux paramètres et peut être initialisé comme
$classifier = new KNearestNeighbors($neighbor_num=4);
$classifier = new KNearestNeighbors($neighbor_num=3, new Minkowski($lambda=4));
$neighbor_num
est le nombre de voisins les plus proches à analyser dans l'algorithme knn alors que le second paramètre est la distance metric qui par défaut dans le premier cas serait Euclidean
. Vous trouverez plus d'informations sur Minkowski ici .
Voici un bref exemple d'utilisation de ce classificateur
// 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']
NaiveBayes Classifier
NaiveBayes Classifier
est basé sur le Bayes' theorem
et ne nécessite aucun paramètre dans constructeur.
Le code suivant illustre une implémentation de prédiction 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']
Cas pratique
Jusqu'à présent, nous n'utilisions que des tableaux d'entiers dans tous nos cas, mais ce n'est pas le cas dans la vraie vie. Permettez-moi donc d'essayer de décrire une situation pratique sur la façon d'utiliser les classificateurs.
Supposons que vous ayez une application qui stocke les caractéristiques des fleurs dans la nature. Par souci de simplicité, nous pouvons considérer la couleur et la longueur des pétales. Donc, deux caractéristiques seraient utilisées pour former nos données.
color
est la plus simple où vous pouvez attribuer une valeur int à chacune d’entre elles et pour la longueur, vous pouvez avoir une plage comme(0 mm,10 mm)=1 , (10 mm,20 mm)=2
. Avec les données initiales, formez votre classificateur. Maintenant, l'un de vos utilisateurs a besoin d'identifier le type de fleur qui pousse dans sa cour. Ce qu'il fait, c'est sélectionner lacolor
de la fleur et ajouter la longueur des pétales. Votre classificateur en cours d'exécution peut détecter le type de fleur ("Etiquettes dans l'exemple ci-dessus")
Régression
Dans la classification utilisant PHP-ML
nous avons attribué des étiquettes aux nouvelles observations. La régression est presque la même, la différence étant que la valeur de sortie n'est pas une étiquette de classe mais une valeur continue. Il est largement utilisé pour les prévisions et les prévisions. PHP-ML supporte les algorithmes de régression suivants
- Régression de vecteur de support
- Régression LeastSquares Linear
La régression a le même train
et predict
méthodes utilisées dans la classification.
Régression de vecteur de support
Ceci est la version de régression pour SVM (Support Vector Machine). La première étape comme dans la classification est de former notre modèle.
// 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);
Dans la régression, les $targets
ne sont pas des étiquettes de classe, par opposition à la classification. C'est l'un des facteurs de différenciation pour les deux. Après avoir formé notre modèle avec les données, nous pouvons commencer par les prévisions réelles
$regression->predict([64]) // return 4.03
Notez que les prédictions renvoient une valeur en dehors de la cible.
Régression LeastSquares Linear
Cet algorithme utilise la least squares method
pour approcher la solution. Ce qui suit démontre un code simple de formation et de prédiction
// 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 fournit également l'option de Multiple Linear Regression
. Un exemple de code pour le même peut être comme suit
$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
est particulièrement utile lorsque plusieurs facteurs ou traits identifient le résultat.
Cas pratique
Prenons maintenant une application de régression dans le scénario réel.
Supposons que vous dirigiez un site Web très populaire, mais que le trafic ne cesse de changer. Vous voulez une solution qui prédit le nombre de serveurs à déployer à un moment donné. Supposons que votre hébergeur vous donne une API pour générer des serveurs et que chaque serveur prend 15 minutes pour démarrer. Sur la base des données de trafic précédentes et de la régression, vous pouvez prédire le trafic qui atteindrait votre application à tout moment. En utilisant cette connaissance, vous pouvez démarrer un serveur 15 minutes avant la surtension, empêchant ainsi votre application de se déconnecter.
Groupage
Le regroupement consiste à regrouper des objets similaires. Il est largement utilisé pour la reconnaissance de formes. Clustering
est unsupervised machine learning
, il n'y a donc pas de formation nécessaire. PHP-ML prend en charge les algorithmes de clustering suivants
- k-moyens
- dbscan
k-moyens
k-Means sépare les données en n
groupes de variance égale. Cela signifie que nous devons transmettre un nombre n
qui serait le nombre de clusters dont nous avons besoin dans notre solution. Le code suivant aidera à apporter plus de clarté
// 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]]]
Notez que la sortie contient 3 tableaux car parce que c'était la valeur de n
dans le constructeur KMeans
. Il peut également y avoir un second paramètre facultatif dans le constructeur qui serait la initialization method
. Par exemple, considérez
$kmeans = new KMeans(4, KMeans::INIT_RANDOM);
INIT_RANDOM
place un centroïde complètement aléatoire en essayant de déterminer les clusters. Mais pour éviter que le centroïde ne soit trop éloigné des données, il est lié aux limites d'espace des données.
La initialization method
constructeur par défaut est kmeans ++, qui sélectionne le centre de gravité de manière intelligente pour accélérer le processus.
DBSCAN
Contrairement aux KMeans
, DBSCAN
est un algorithme de regroupement basé sur la densité, ce qui signifie que nous ne transmettrions pas n
qui déterminerait le nombre de clusters que nous voulons dans notre résultat. Par contre, cela nécessite deux paramètres pour fonctionner
- $ minSamples: nombre minimal d'objets devant être présents dans un cluster
- $ epsilon: Quelle est la distance maximale entre deux échantillons pour qu'ils soient considérés comme appartenant au même cluster.
Un échantillon rapide pour la même chose est comme suit
// 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]]]
Le code est assez explicite. Une différence majeure est qu’il n’existe aucun moyen de connaître le nombre d’éléments dans le tableau de sortie, par opposition à KMeans.
Cas pratique
Voyons maintenant comment utiliser le clustering dans le scénario réel
Le clustering est largement utilisé dans
pattern recognition
etdata mining
. Considérez que vous avez une application de publication de contenu. Maintenant, afin de conserver vos utilisateurs, ils devraient regarder le contenu qu'ils aiment. Supposons, par souci de simplicité, que s'ils sont sur une page Web spécifique pendant plus d'une minute et qu'ils se retrouvent au fond, ils adorent ce contenu. Désormais, chacun de vos contenus aura un identifiant unique, tout comme l'utilisateur. Créez un cluster en fonction de cela et vous saurez quel segment d'utilisateurs a un goût de contenu similaire. Cela peut à son tour être utilisé dans un système de recommandation où vous pouvez supposer que si certains utilisateurs d’un même cluster aiment cet article, il en sera de même pour d’autres utilisateurs et que cela pourra être présenté comme une recommandation sur votre application.