Machine learning pour les développeurs Java, Partie 1: Algorithmes pour l'apprentissage automatique

Les voitures autonomes, les logiciels de détection de visage et les haut-parleurs à commande vocale sont tous construits sur des technologies et des cadres d'apprentissage automatique - et ce ne sont que la première vague. Au cours de la prochaine décennie, une nouvelle génération de produits transformera notre monde, en lançant de nouvelles approches du développement logiciel et des applications et produits que nous créons et utilisons.

En tant que développeur Java, vous voulez prendre une longueur d'avance sur cette courbe, en particulier parce que les entreprises technologiques commencent à investir sérieusement dans l'apprentissage automatique. Ce que vous apprenez aujourd'hui, vous pouvez le développer au cours des cinq prochaines années, mais vous devez commencer quelque part.

Cet article vous aidera à démarrer. Vous commencerez par une première impression du fonctionnement de l'apprentissage automatique, suivi d'un petit guide sur la mise en œuvre et la formation d'un algorithme d'apprentissage automatique. Après avoir étudié les éléments internes de l'algorithme d'apprentissage et les fonctionnalités que vous pouvez utiliser pour entraîner, noter et sélectionner la fonction de prédiction la mieux adaptée, vous aurez un aperçu de l'utilisation d'un framework JVM, Weka, pour créer des solutions d'apprentissage automatique. Cet article se concentre sur l'apprentissage automatique supervisé, qui est l'approche la plus courante pour développer des applications intelligentes.

Machine learning pour les développeurs Java, partie 2

Êtes-vous prêt pour la prochaine étape? La seconde moitié de ce didacticiel vous montre comment développer et déployer votre pipeline de données de machine learning.

Apprentissage automatique et intelligence artificielle

L'apprentissage automatique est issu du domaine de l'intelligence artificielle, qui cherche à produire des machines capables d'imiter l'intelligence humaine. Bien que l'apprentissage automatique soit une tendance émergente en informatique, l'intelligence artificielle n'est pas un nouveau domaine scientifique. Le test de Turing, développé par Alan Turing au début des années 1950, a été l'un des premiers tests créés pour déterminer si un ordinateur pouvait avoir une vraie intelligence. Selon le test de Turing, un ordinateur pourrait prouver l'intelligence humaine en incitant un humain à croire qu'il était également humain.

De nombreuses approches d'apprentissage automatique de pointe sont basées sur des concepts vieux de plusieurs décennies. Ce qui a changé au cours de la dernière décennie, c'est que les ordinateurs (et les plates-formes informatiques distribuées) disposent désormais de la puissance de traitement nécessaire aux algorithmes d'apprentissage automatique. La plupart des algorithmes d'apprentissage automatique nécessitent un grand nombre de multiplications matricielles et d'autres opérations mathématiques à traiter. La technologie de calcul pour gérer ces calculs n'existait pas il y a à peine deux décennies, mais elle existe aujourd'hui.

L'apprentissage automatique permet aux programmes d'exécuter des processus d'amélioration de la qualité et d'étendre leurs capacités sans intervention humaine. Un programme construit avec l'apprentissage automatique est capable de mettre à jour ou d'étendre son propre code.

Apprentissage supervisé vs apprentissage non supervisé

L'apprentissage supervisé et l'apprentissage non supervisé sont les approches les plus populaires de l'apprentissage automatique. Les deux nécessitent d'alimenter la machine avec un nombre massif d'enregistrements de données pour corréler et tirer des leçons. Ces enregistrements de données collectées sont communément appelés vecteurs de caractéristiques. Dans le cas d'une maison individuelle, un vecteur de caractéristiques peut être constitué de caractéristiques telles que la taille globale de la maison, le nombre de pièces et l'âge de la maison.

Dans l' apprentissage supervisé , un algorithme d'apprentissage automatique est formé pour répondre correctement aux questions liées aux vecteurs de caractéristiques. Pour entraîner un algorithme, la machine reçoit un ensemble de vecteurs de caractéristiques et une étiquette associée. Les étiquettes sont généralement fournies par un annotateur humain et représentent la bonne «réponse» à une question donnée. L'algorithme d'apprentissage analyse les vecteurs de caractéristiques et leurs étiquettes correctes pour trouver les structures internes et les relations entre eux. Ainsi, la machine apprend à répondre correctement aux requêtes.

Par exemple, une application immobilière intelligente peut être formée avec des vecteurs de caractéristiques comprenant la taille, le nombre de pièces et l'âge respectif pour une gamme de maisons. Un étiqueteur humain étiqueterait chaque maison avec le prix correct en fonction de ces facteurs. En analysant ces données, l'application immobilière serait formée pour répondre à la question: " Combien d'argent pourrais-je obtenir pour cette maison? "

Une fois le processus d'apprentissage terminé, les nouvelles données d'entrée ne seront pas étiquetées. La machine pourra répondre correctement aux requêtes, même pour les vecteurs de caractéristiques invisibles et non étiquetés.

Dans l'apprentissage non supervisé , l'algorithme est programmé pour prédire des réponses sans étiquetage humain, ni même des questions. Plutôt que de prédéterminer les étiquettes ou quels devraient être les résultats, l'apprentissage non supervisé exploite des ensembles de données massifs et une puissance de traitement pour découvrir des corrélations jusque-là inconnues. Dans le marketing de produits de consommation, par exemple, l'apprentissage non supervisé pourrait être utilisé pour identifier des relations cachées ou des groupements de consommateurs, conduisant éventuellement à des stratégies de marketing nouvelles ou améliorées.

Cet article se concentre sur l'apprentissage automatique supervisé, qui est l'approche la plus courante de l'apprentissage automatique aujourd'hui.

Apprentissage automatique supervisé

Tout l'apprentissage automatique est basé sur des données. Pour un projet d'apprentissage automatique supervisé, vous devrez étiqueter les données de manière significative pour le résultat que vous recherchez. Dans le tableau 1, notez que chaque ligne de l'enregistrement de la maison comprend une étiquette pour «prix de la maison». En corrélant les données de ligne à l'étiquette de prix de la maison, l'algorithme sera finalement en mesure de prédire le prix du marché pour une maison ne figurant pas dans son ensemble de données (notez que la taille de la maison est basée sur les mètres carrés et le prix de la maison est basé sur les euros).

Tableau 1. Registres de la maison

FONCTIONNALITÉ FONCTIONNALITÉ FONCTIONNALITÉ ÉTIQUETTE
Taille de la maison Nombre de chambres Âge de la maison Coût estimé de la maison
90 m2 / 295 pi 2 pièces 23 années 249 000 €
101 m2 / 331 pi 3 pièces n / a 338 000 €
1330 m2 / 4363 pieds 11 chambres 12 ans 6 500 000 €

Au début, vous étiqueterez probablement les enregistrements de données à la main, mais vous pourriez éventuellement entraîner votre programme à automatiser ce processus. Vous avez probablement vu cela avec les applications de messagerie, où le déplacement du courrier électronique dans votre dossier spam entraîne la requête "Est-ce du spam?" Lorsque vous répondez, vous entraînez le programme à reconnaître les messages que vous ne souhaitez pas voir. Le filtre anti-spam de l'application apprend à étiqueter les futurs messages provenant de la même source, ou ayant un contenu similaire, et à s'en débarrasser.

Les ensembles de données étiquetés sont nécessaires à des fins de formation et de test uniquement. Une fois cette phase terminée, l'algorithme d'apprentissage automatique fonctionne sur des instances de données non étiquetées. Par exemple, vous pouvez alimenter l'algorithme de prédiction avec un nouvel enregistrement de maison non étiqueté et il prédirait automatiquement le prix de la maison prévu en fonction des données de formation.

Comment les machines apprennent à prédire

Le défi de l'apprentissage automatique supervisé est de trouver la fonction de prédiction appropriée pour une question spécifique. Mathématiquement, le défi consiste à trouver la fonction d'entrée-sortie qui prend les variables d'entrée x et renvoie la valeur de prédiction y . Cette fonction d'hypothèse (h θ ) est la sortie du processus d'apprentissage. Souvent, la fonction d'hypothèse est également appelée fonction cible ou fonction de prédiction .

Gregor Roth

In most cases, x represents a multiple-data point. In our example, this could be a two-dimensional data point of an individual house defined by the house-size value and the number-of-rooms value. The array of these values is referred to as the feature vector. Given a concrete target function, the function can be used to make a prediction for each feature vector x. To predict the price of an individual house, you could call the target function by using the feature vector { 101.0, 3.0 } containing the house size and the number of rooms:

 // target function h (which is the output of the learn process) Function h = ...; // set the feature vector with house size=101 and number-of-rooms=3 Double[] x = new Double[] { 101.0, 3.0 }; // and predicted the house price (label) double y = h.apply(x); 

Dans le listing 1, la valeur x de la variable tableau représente le vecteur caractéristique de la maison. La valeur y renvoyée par la fonction cible est le prix du logement prévu.

Le défi de l'apprentissage automatique est de définir une fonction cible qui fonctionnera aussi précisément que possible pour les instances de données inconnues et invisibles. En apprentissage automatique, la fonction cible (h θ ) est parfois appelée modèle . Ce modèle est le résultat du processus d'apprentissage.

Gregor Roth

Sur la base d'exemples d'apprentissage étiquetés, l'algorithme d'apprentissage recherche des structures ou des modèles dans les données d'apprentissage. À partir de ceux-ci, il produit un modèle qui se généralise bien à partir de ces données.

Typically, the learning process is explorative. In most cases, the process will be performed multiple times by using different variations of learning algorithms and configurations.

Eventually, all the models will be evaluated based on performance metrics, and the best one will be selected. That model will then be used to compute predictions for future unlabeled data instances.

Linear regression

Pour entraîner une machine à penser, la première étape consiste à choisir l'algorithme d'apprentissage que vous utiliserez. La régression linéaire est l'un des algorithmes d'apprentissage supervisé les plus simples et les plus populaires. Cet algorithme suppose que la relation entre les entités en entrée et l'étiquette en sortie est linéaire. La fonction de régression linéaire générique ci-dessous renvoie la valeur prédite en résumant chaque élément du vecteur de caractéristiques multiplié par un paramètre thêta (θ) . Les paramètres thêta sont utilisés dans le processus d'apprentissage pour adapter ou "régler" la fonction de régression en fonction des données d'apprentissage.

Gregor Roth

In the linear regression function, theta parameters and feature parameters are enumerated by a subscription number. The subscription number indicates the position of theta parameters (θ) and feature parameters (x) within the vector. Note that feature x0 is a constant offset term set with the value 1 for computational purposes. As a result, the index of a domain-specific feature such as house-size will start with x1. As an example, if x1 is set for the first value of the House feature vector, house size, then x2 will be set for the next value, number-of-rooms, and so forth.

Listing 2 shows a Java implementation of this linear regression function, shown mathematically as hθ(x). For simplicity, the calculation is done using the data type double. Within the apply() method, it is expected that the first element of the array has been set with a value of 1.0 outside of this function.

Listing 2. Linear regression in Java

 public class LinearRegressionFunction implements Function { private final double[] thetaVector; LinearRegressionFunction(double[] thetaVector) { this.thetaVector = Arrays.copyOf(thetaVector, thetaVector.length); } public Double apply(Double[] featureVector) { // for computational reasons the first element has to be 1.0 assert featureVector[0] == 1.0; // simple, sequential implementation double prediction = 0; for (int j = 0; j < thetaVector.length; j++) { prediction += thetaVector[j] * featureVector[j]; } return prediction; } public double[] getThetas() { return Arrays.copyOf(thetaVector, thetaVector.length); } } 

In order to create a new instance of the LinearRegressionFunction, you must set the theta parameter. The theta parameter, or vector, is used to adapt the generic regression function to the underlying training data. The program's theta parameters will be tuned during the learning process, based on training examples. The quality of the trained target function can only be as good as the quality of the given training data.

Dans l'exemple ci-dessous, le LinearRegressionFunctionsera instancié pour prédire le prix de la maison en fonction de la taille de la maison. Considérant que x 0 doit être une valeur constante de 1,0, la fonction cible est instanciée à l'aide de deux paramètres thêta. Les paramètres thêta sont le résultat d'un processus d'apprentissage. Après avoir créé la nouvelle instance, le prix d'une maison de 1330 mètres carrés sera prédit comme suit:

 // the theta vector used here was output of a train process double[] thetaVector = new double[] { 1.004579, 5.286822 }; LinearRegressionFunction targetFunction = new LinearRegressionFunction(thetaVector); // create the feature vector function with x0=1 (for computational reasons) and x1=house-size Double[] featureVector = new Double[] { 1.0, 1330.0 }; // make the prediction double predictedPrice = targetFunction.apply(featureVector); 

La ligne de prédiction de la fonction cible est représentée par une ligne bleue dans le graphique ci-dessous. La ligne a été calculée en exécutant la fonction cible pour toutes les valeurs de taille de maison. Le graphique comprend également les paires prix-taille utilisées pour la formation.

Gregor Roth

Jusqu'à présent, le graphique de prédiction semble convenir assez bien. Les coordonnées du graphe (l'intersection et la pente) sont définies par le vecteur thêta { 1.004579, 5.286822 }. Mais comment savez-vous que ce vecteur thêta est le mieux adapté à votre application? La fonction serait-elle mieux adaptée si vous changiez le premier ou le deuxième paramètre thêta? Pour identifier le vecteur de paramètres thêta le mieux adapté, vous avez besoin d'une fonction utilitaire , qui évaluera les performances de la fonction cible.

Notation de la fonction cible

En apprentissage automatique, une fonction de coût (J (θ)) est utilisée pour calculer l'erreur moyenne, ou «coût» d'une fonction cible donnée.

Gregor Roth