JavaRush /Blog Java /Random-FR /Apprentissage automatique pour les développeurs Java, par...

Apprentissage automatique pour les développeurs Java, partie 1

Publié dans le groupe Random-FR
Configurez un algorithme d'apprentissage automatique et développez votre première fonction prédictive à l'aide de Java. Les voitures autonomes, les systèmes de reconnaissance faciale et les assistants vocaux sont tous développés à l’aide de technologies et de cadres d’apprentissage automatique. Et ce n’est que la première vague. Au cours des 10 prochaines années, une nouvelle génération de produits transformera notre monde, donnant lieu à de nouvelles approches de développement de programmes, de produits et d'applications. Apprentissage automatique pour les développeurs Java, parties 1 - 1En tant que programmeur Java, vous souhaitez profiter de cette vague maintenant que les entreprises technologiques commencent à investir massivement dans l'apprentissage automatique. Ce que vous apprenez aujourd’hui, vous pourrez l’utiliser au cours des cinq prochaines années. Mais par où commencer ? Cet article a pour objectif de répondre à cette question. Vous aurez une première impression des principes du machine learning en suivant notre petit guide sur la mise en œuvre et la préparation d'un algorithme de machine learning. Après avoir découvert la structure d'un algorithme d'apprentissage et les fonctionnalités que vous pouvez utiliser pour l'entraîner, l'évaluer et sélectionner la fonction qui offre la meilleure précision de prédiction, vous comprendrez comment utiliser le framework JVM (Weka) pour créer des solutions d’apprentissage automatique. Cet article se concentre sur l’apprentissage automatique supervisé car c’est le principe le plus couramment utilisé dans le développement d’applications intelligentes.

Apprentissage automatique et intelligence artificielle

L'apprentissage automatique est issu du domaine de l'intelligence artificielle, qui vise à créer des machines capables d'imiter l'intelligence humaine. Bien que le terme « apprentissage automatique » trouve son origine dans l’informatique, l’intelligence artificielle n’est pas un nouveau domaine scientifique. Le test de Turing , développé par le mathématicien Alan Turing au début des années cinquante du 20e siècle, est l'un des premiers tests conçus pour déterminer si une machine informatique possède une véritable intelligence. Selon le test de Turing, un ordinateur prouve la présence de l’intelligence humaine en se faisant passer pour une personne sans que cette dernière se rende compte qu’elle parle à la machine.
Apprentissage automatique pour les développeurs Java, parties 1 à 2
De nombreuses approches d’apprentissage automatique populaires aujourd’hui sont basées sur des idées vieilles de plusieurs décennies. Mais la dernière décennie dans le domaine de l’informatique (et des plates-formes informatiques distribuées) a apporté suffisamment de puissance pour appliquer des algorithmes d’apprentissage automatique. La plupart d’entre eux nécessitent une énorme quantité de multiplication matricielle et d’autres calculs mathématiques. Il y a vingt ans, les technologies informatiques permettant de tels calculs n’existaient tout simplement pas, mais elles sont désormais devenues une réalité. Les algorithmes d'apprentissage automatique permettent aux programmes de mener à bien le processus d'amélioration de la qualité et d'étendre leurs capacités sans intervention humaine. Un programme développé à l’aide de l’apprentissage automatique est capable de mettre à jour ou d’étendre indépendamment son propre code.

Apprentissage supervisé vs apprentissage non supervisé

L’apprentissage supervisé et non supervisé sont les deux approches les plus populaires de l’apprentissage automatique. Les deux options nécessitent de fournir à la machine d’énormes quantités d’enregistrements de données pour établir des relations et en tirer des enseignements. Ces données collectées sont généralement appelées « vecteur de caractéristiques » . Par exemple, nous avons un certain immeuble résidentiel. Dans ce cas, le vecteur de caractéristiques peut contenir des caractéristiques telles que : la superficie totale de la maison, le nombre de pièces, l'année de construction de la maison, etc. Dans l'apprentissage supervisé , un algorithme d'apprentissage automatique est formé pour répondre aux questions liées aux vecteurs de caractéristiques. Pour entraîner l'algorithme, il reçoit un ensemble de vecteurs de caractéristiques et d'étiquettes associées. L'étiquette associée est fournie par une personne (l'enseignant) et elle contient la bonne « réponse » à la question posée. L'algorithme d'apprentissage analyse les vecteurs de caractéristiques et corrige les étiquettes pour trouver la structure interne et les relations entre eux. De cette façon, la machine apprend à répondre correctement aux questions. A titre d'exemple, nous pouvons considérer une certaine application intelligente pour le commerce immobilier. Il peut être formé à l'aide d'un vecteur de caractéristiques comprenant la taille, le nombre de pièces et l'année de construction pour un ensemble de maisons. Une personne doit attribuer à chaque maison une étiquette indiquant le prix correct de la maison en fonction de ces facteurs. En analysant ces données, une application intelligente devrait s'entraîner à répondre à la question : « Combien d'argent puis-je obtenir pour cette maison ? »
Vous souhaitez en savoir plus sur Java ? Rejoignez le groupe Développeur Java !
Une fois le processus de préparation terminé, les nouvelles données d'entrée ne sont plus marquées. La machine doit être capable de répondre correctement aux questions, même pour des vecteurs de caractéristiques inconnus et non étiquetés. Dans l’apprentissage non supervisé, l’algorithme est conçu pour prédire les réponses sans étiquetage humain (ou même sans poser de questions). Au lieu de déterminer une étiquette ou un résultat, les algorithmes d’apprentissage non supervisé utilisent de vastes ensembles de données et une puissance de calcul pour découvrir des relations jusqu’alors inconnues. Par exemple, dans le marketing des produits de consommation, l’apprentissage non supervisé peut être utilisé pour identifier des relations cachées ou des groupes de clients, ce qui peut finalement contribuer à améliorer le programme marketing ou à en créer un nouveau. Dans cet article, nous nous concentrerons sur l’apprentissage automatique supervisé ; c'est actuellement l'approche la plus couramment utilisée.

Apprentissage automatique supervisé

Tout apprentissage automatique est basé sur des données. Pour un projet d'apprentissage automatique supervisé, vous devez marquer les données avec des marqueurs de manière à fournir des réponses significatives à la question posée. Ci-dessous, dans le tableau 1, chaque enregistrement d'informations sur la maison est étiqueté « prix de la maison ». En identifiant la relation entre les données enregistrées et le prix d'une maison, l'algorithme devrait éventuellement être capable de prédire le prix du marché pour les maisons non incluses dans la liste donnée. (Veuillez noter que la superficie de la maison est indiquée en mètres carrés, et le prix de la maison est en euros).
Tableau 1. Liste des maisons
Signe Signe Signe Étiquette
Quartier de la maison Nombre de chambres Âge de la maison Prix ​​​​attendu du logement
90 m2 / 295 pi 2 chambres 23 ans 249 000 €
101 m2 / 331 pi 3 chambres n / A 338 000 €
1330 m2 / 4363 pi 11 chambres 12 ans 6 500 000 €
Au début, vous étiqueterez probablement les données manuellement, mais vous finirez par apprendre à votre programme à le faire lui-même. Vous avez probablement déjà vu cette approche fonctionner avec des clients de messagerie : pour déplacer un e-mail vers le dossier Spam, vous répondez à la question « Cet e-mail est-il du spam ? Lorsque vous répondez, vous entraînez le programme à reconnaître les e-mails que vous ne souhaitez pas voir. Le filtre anti-spam de l'application est formé pour marquer les messages provenant de la même source ou contenant le même contenu et les gérer selon les règles appropriées. Les ensembles de données étiquetés sont requis uniquement à des fins de préparation et de test. Une fois cette étape terminée, l’algorithme de machine learning travaille sur les données non étiquetées. Par exemple, vous pouvez alimenter un algorithme de prédiction avec un nouvel enregistrement non étiqueté de données sur une maison, et il devrait automatiquement prédire le prix attendu de la maison sur la base des « connaissances » acquises à partir des données préparatoires.

Comment une machine apprend à prédire

Le défi de l’apprentissage automatique supervisé consiste à trouver la fonction de prédiction appropriée pour une question donnée. Mathématiquement, la difficulté est de trouver une fonction qui prend une variable en entrée хet renvoie la valeur prédite у. Cette fonction des hypothèses (hθ)est le résultat d’un processus de préparation. Souvent, la fonction d’hypothèse est également appelée fonction objectif ou fonction de prédiction.
y = h θ (x)
Dans la plupart des cas, хil s'agit d'un tableau de données. Dans notre exemple, il s'agit d'un tableau bidimensionnel d'éléments qui définissent une maison, composé du nombre de pièces et de la superficie de la maison. Un tableau de telles valeurs est un vecteur de caractéristiques. En spécifiant une fonction objectif spécifique, nous pouvons l'utiliser pour prédire chaque vecteur caractéristique х. Pour prédire le prix d'une maison, il faut appeler la fonction objectif à l'aide d'un vecteur de caractéristiques {101.0, 3.0}constitué de la superficie de la maison et du nombre de pièces :
// целевая функция h (результат процесса обучения)
Function<Double[], Double> h = ...;

// определяем целевой вектор с площадью дома=101 и количеством комнат=3
Double[] x = new Double[] { 101.0, 3.0 };

// и предсказываем цену дома (метка)
double y = h.apply(x);
Dans le code source de l'exemple 1, les valeurs du tableau хreprésentent un vecteur de caractéristiques de la maison. La valeur уrenvoyée par la fonction objectif est le prix prévu de la maison. Le but de l’apprentissage automatique est de déterminer la fonction objectif qui fonctionnera aussi précisément que possible compte tenu de paramètres d’entrée inconnus. En apprentissage automatique, la fonction objectif (hθ)est parfois appelée modèle. Ce modèle est le résultat d’un processus d’apprentissage.
Apprentissage automatique pour les développeurs Java, parties 1 à 3
Sur la base d'échantillons d'entraînement étiquetés, l'algorithme d'apprentissage recherche des structures ou des modèles dans les données d'entraînement. Il construit donc un modèle qui est généralement bon pour les données. En règle générale, le processus d’apprentissage est de nature exploratoire. Dans la plupart des cas, le processus est répété plusieurs fois en utilisant différentes variantes d’algorithmes et de configurations d’apprentissage. En conséquence, tous les modèles sont évalués sur la base de mesures de performances, parmi lesquelles le meilleur est sélectionné. Et ce modèle est utilisé pour calculer les valeurs estimées pour les futures données non balisées.

Régression linéaire

Pour apprendre à une machine à « penser », vous devez d’abord choisir l’algorithme d’apprentissage que vous utiliserez. Par exemple, régression linéaire. Il s’agit de l’un des algorithmes d’apprentissage automatique supervisé les plus simples et les plus populaires. L'algorithme suppose que la relation entre les entités d'entrée et les marqueurs de résultat est linéaire. La fonction de régression linéaire générale ci-dessous renvoie la valeur prédite en additionnant tous les éléments du vecteur de caractéristiques multipliés par le paramètre θ (thêta) . Ce paramètre est utilisé pendant le processus de formation pour adapter ou « régler » la fonction de régression en fonction des données de formation.
h θ (x) = θ 0 * 1 + θ 1 * x 1 + ... θ n * x n
Dans une fonction de régression linéaire, le paramètre thêta et les paramètres de caractéristiques sont numérotés avec des indices. L'indice détermine la position du paramètre (θ)et du paramètre de fonctionnalité (х)dans le vecteur. Notez que la caractéristique x 0 est un terme de décalage constant et est significative 1à des fins de calcul. De ce fait, l'indice des paramètres significatifs tels que la superficie de la maison commence par x 1 . Ainsi, si x 1 se voit attribuer la première valeur du vecteur caractéristique (superficie de la maison), alors x 2 prendra la valeur suivante (nombre de pièces) et ainsi de suite. L'exemple 2 montre l'implémentation Java de la fonction de régression linéaire, notée mathématiquement h θ (x). Pour plus de simplicité, les calculs sont effectués à l'aide du double. Dans la méthode apply(), il est prévu que le premier élément du tableau sera égal à 1,0 et sera défini en dehors de cette fonction. Exemple 2 : régression linéaire en Java
public class LinearRegressionFunction implements Function<Double[], Double> {
 private final double[] thetaVector;

 LinearRegressionFunction(double[] thetaVector) {
 this.thetaVector = Arrays.copyOf(thetaVector, thetaVector.length);
 }

 public Double apply(Double[] featureVector) {
 // с целью упрощения вычислений первый элемент должен быть equals 1.0
 assert featureVector[0] == 1.0;

 // простое последовательное сложение
 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);
 }
}
Pour créer une nouvelle instance LinearRegressionFunction, vous devez spécifier le paramètre θ. Ce paramètre ou vecteur est utilisé pour adapter la fonction de régression linéaire générale aux données d'entraînement sous-jacentes. Le paramètre θutilisé dans le programme sera ajusté au cours du processus de formation, sur la base d'exemples de formation. La qualité de la fonction cible entraînée dépendra de la qualité des données préparées pour la formation. Dans l’exemple ci-dessous, nous utilisons LinearRegressionFunctiondes prévisions de prix basées sur la taille de la maison pour illustrer. Considérant que x 0 doit être une constante de valeur 1,0, la fonction objectif est initialisée à l'aide de deux paramètres θ, où ils sont le résultat du processus d'apprentissage. Après avoir créé un nouvel exemple, le prix d'une maison d'une superficie de 1330 mètres carrés sera prédit comme indiqué ci-dessous :
// тета вектор, используемый в этом примере, является результатом процесса обучения
double[] thetaVector = new double[] { 1.004579, 5.286822 };
LinearRegressionFunction targetFunction = new LinearRegressionFunction(thetaVector);

// создание вектора признаков со значениями x0=1 (для удобства вычислений) и //x1=площадь дома
Double[] featureVector = new Double[] { 1.0, 1330.0 };

// выполняем расчеты
double predictedPrice = targetFunction.apply(featureVector);
Dans la figure ci-dessous, vous pouvez voir le graphique de la fonction objectif de prédiction (ligne bleue). Il est obtenu en calculant la fonction objectif pour toutes les valeurs de la superficie de la maison. Le graphique contient également des paires prix-zone utilisées pour la formation.
Apprentissage automatique pour les développeurs Java, parties 1 à 4
À l’heure actuelle, le tableau de prédiction semble plutôt bon. Les coordonnées du graphique (position et pente) sont déterminées par le vecteur θ { 1.004579, 5.286822 }. Mais comment déterminer quel θvecteur est le mieux adapté à votre application ? La fonction s'adaptera-t-elle mieux si vous modifiez le premier ou peut-être le deuxième paramètre ? Pour déterminer le vecteur thêta le mieux adapté, vous avez besoin d'une fonction utilitaire qui évalue dans quelle mesure la fonction objectif fait le travail. À SUIVRE Traduction de l’anglais. Auteur : Gregor Roth, architecte logiciel, JavaWorld.
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION