Une introduction à Redis-ML (troisième partie)

Une introduction à Redis-ML (troisième partie)

Cet article est la troisième partie d’une série d’articles présentant le module Redis-ML. Le premier article de la série se trouve ici. L’exemple de code de cet article nécessite plusieurs bibliothèques Python et une instance Redis exécutant Redis-ML. Des instructions de configuration détaillées pour exécuter le code se trouvent dans la première ou la deuxième partie de la série.

Régression logistique

La régression logistique est un autre modèle linéaire pour construire des modèles prédictifs à partir de données observées. Contrairement à la régression linéaire, qui est utilisée pour prédire une valeur, la régression logistique est utilisée pour prédire des valeurs binaires (réussite/échec, gagnant/perdant, sain/malade). Cela fait de la régression logistique une forme de classification. La régression logistique de base peut être augmentée pour résoudre des problèmes de classification multiclasse.

L’exemple ci-dessus, tiré de la Article Wikipédia sur la régression logistique, montre un graphique de la probabilité de réussir un examen par rapport aux heures passées à étudier. La régression logistique est une bonne technique pour résoudre ce problème car nous essayons de déterminer la réussite/l’échec, un sélecteur binaire. Si nous voulions déterminer une note ou un pourcentage au test, une régression simple serait une meilleure technique.

Pour démontrer la régression logistique et comment elle peut être utilisée conjointement avec Redis, nous allons explorer un autre ensemble de données classique, le Ensemble de données sur les plantes Fisher Iris.

Base de données

La base de données Fisher Iris se compose de 150 points de données étiquetés avec l’une des 3 espèces différentes d’Iris : Iris setosa, Iris versicoloreet Iris de Virginie. Chaque point de données se compose de quatre attributs (caractéristiques) de la plante. En utilisant la régression logistique, nous pouvons utiliser les attributs pour classer un Iris dans l’une des trois espèces.

La base de données Fisher Iris est l’un des ensembles de données inclus dans le package d’apprentissage Python scikit. Pour charger l’ensemble de données, utilisez le code suivant :

from sklearn.datasets import load_iris
iris = load_iris()

Nous pouvons imprimer les données dans un tableau et voir que nos données consistent en sépale longueur, largeur des sépales, pétale longueur et largeur des pétales, le tout en centimètres.

     sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)
0                  5.1               3.5                1.4               0.2
1                  4.9               3.0                1.4               0.2
2                  4.7               3.2                1.3               0.2
3                  4.6               3.1                1.5               0.2
4                  5.0               3.6                1.4               0.2
5                  5.4               3.9                1.7               0.4

Notre classification cible est codée sous forme de valeurs entières 0, 1 et 2. Un 0 correspond à Iris Setosa, un 1 correspond à Iris Versicolor et un 2 correspond à un Iris Virginica.

Pour avoir une meilleure idée de la relation entre les différentes mesures et le type de fleur, nous avons généré deux graphiques : un de la largeur des sépales par rapport à la longueur et un autre de la largeur des pétales par rapport à la longueur. Chaque graphique montre les limites de classification (déterminées par régression logistique) des trois classes et les superpose avec les points de notre ensemble de données. Le bleu représente la zone classée comme Iris setosa, le vert représente Iris versicolor et le gris représente Iris Virginica :
Graphique des mesures sépales

logistic petal

Nous pouvons voir dans les deux graphiques qu’il y a quelques valeurs aberrantes qui sont mal classées, mais la plupart de nos types d’Iris se regroupent en groupes distincts.

Effectuer une régression logistique

Le code pour effectuer une régression logistique dans scikit est similaire au code que nous avons utilisé précédemment pour effectuer une régression linéaire. Nous devons d’abord créer nos ensembles d’entraînement et de test, puis nous adaptons une régression logistique.

Pour séparer les ensembles d’entraînement et de test, nous utilisons le code suivant :

x_train = [ x for (i, x) in enumerate(iris.data) if i%10 !=0 ]
x_test = [x for (i, x) in enumerate(iris.data) if i%10 == 0
y_train = [ y for (i, y) in enumerate(iris.target) if i%10 != 0 ]
y_test = [ y for (i, y) in enumerate(iris.target) if i%10 == 0 ]

Pour cet exemple, nous divisons nos données en blocs de 10 éléments, plaçons le premier élément dans l’ensemble de test et plaçons les 9 éléments restants dans l’ensemble d’apprentissage. Pour nous assurer que nos données contiennent des sélections des trois classes, nous devrons utiliser un processus plus complexe dans cet exemple que dans les exemples précédents.

Une fois que nous avons construit nos ensembles d’entraînement et de test, l’ajustement de la régression logistique nécessite deux lignes de code :

logr = LogisticRegression()
logr.fit(x_train, y_train)
y_pred = logr.predict(x_test)

La dernière ligne de code utilise notre régression logistique entraînée pour prédire les types d’Iris de notre ensemble de test.

Prédicteur Redis

Comme pour notre exemple de régression linéaire, nous pouvons créer un prédicteur de régression logistique à l’aide de Redis.

Le module Redis-ML fournit ML.LOGREG.SET et ML.LOGREG.PREDICT fonctions pour créer des clés de régression logistique.

Pour ajouter un modèle de régression logistique à Redis, vous devez utiliser le ML.LOGREG.SET commande pour ajouter la clé à la base de données. La ML.LOGREG.SET commande a la forme suivante :

ML.LINREG.SET key intercept coeef [...]

et le ML.LOGREG.PREDICT La fonction est utilisée pour évaluer la régression logistique à partir des valeurs des caractéristiques et a la forme :

ML.LOGREG.PREDICT key feature [...]

L’ordre des valeurs des caractéristiques dans le PRÉDIRE la commande doit correspondre aux coefficients. Le résultat de la PRÉDIRE commande est la probabilité qu’une observation appartienne à une classe particulière.

Pour utiliser Redis pour construire un classificateur multiclasse, nous devons émuler la procédure One vs. Rest utilisée pour la classification multiclasse. Dans la procédure One vs. Rest, plusieurs classificateurs sont créés, chacun utilisé pour déterminer la probabilité qu’une observation soit dans une classe particulière. L’observation est ensuite étiquetée avec la classe dont elle est le plus susceptible d’appartenir.

Pour notre problème Iris à trois classes, nous devrons créer trois classificateurs distincts, chacun déterminant la probabilité qu’un point de données se trouve dans cette classe particulière. Le scikit Régression logistique l’objet par défaut est One vs. Rest (ovr dans l’API scikit) et correspond aux coefficients de trois classificateurs distincts.

Pour émuler cette procédure dans Redis, nous créons d’abord trois clés de régression logistique correspondant aux coefficients ajustés par scikit :

r = redis.StrictRedis('localhost', 6379)
 for i in range(3):
     r.execute_command("ML.LOGREG.SET", "iris-predictor:{}".format(i), logr.intercept_[i], *logr.coef_[i])

Nous émulons la procédure de prédiction One vs. Rest qui a lieu dans le LogisticRegression.predictLogisticRegression.predict fonction en itérant sur nos trois clés, puis en prenant la classe avec la probabilité la plus élevée. Le code suivant exécute la procédure One vs. Rest sur nos données de test et stocke les étiquettes résultantes dans un vecteur :

# Run predictions in Redis  
r_pred = np.full(len(x_test), -1, dtype=int)

for i, obs in enumerate(x_test):
     probs = np.zeros(3)
     for j in range(3):
         probs[j] = float(r.execute_command("ML.LOGREG.PREDICT", "iris-predictor:{}".format(j), *obs))
     r_pred[i] = probs.argmax()

Nous comparons les classements finaux en imprimant les trois vecteurs de résultat :

# Compare results as numerical vector 
print("y_test = {}".format(np.array(y_test)))
print("y_pred = {}".format(y_pred))
print("r_pred = {}".format(r_pred))

Les vecteurs de sortie montrent les espèces réelles d’Iris (y_test) et les prédictions faites par scikit (y_pred) et Redis (r_pred). Chaque vecteur stocke la sortie sous la forme d’une séquence ordonnée d’étiquettes, codées sous forme d’entiers.

y_test = [0 0 0 0 0 1 1 1 1 1 2 2 2 2 2]
y_pred = [0 0 0 0 0 1 1 2 1 1 2 2 2 2 2]
r_pred = [0 0 0 0 0 1 1 2 1 1 2 2 2 2 2]

Redis et scikit ont fait des prédictions identiques, y compris l’étiquetage erroné d’un Virginica en tant que Versicolor.

Vous n’avez peut-être pas besoin d’un classificateur Iris en temps réel hautement disponible, mais en tirant parti de cet ensemble de données classique, vous avez appris à utiliser le Redis-ML module pour implémenter un classificateur en temps réel hautement disponible pour vos propres données.

Dans le prochain article, nous poursuivrons notre examen des fonctionnalités du module Redis-ML en examinant les opérations matricielles prises en charge par Redis-ML et comment elles peuvent être utilisées pour résoudre les problèmes de ML. Jusque-là, si vous avez des questions concernant ces messages, connectez-vous avec l’auteur sur Twitter (@tague).

Development Source

Related Posts

RLEC 4.2.1 apporte des contrôles granulaires à la haute disponibilité et aux performances

RLEC 4.2.1 apporte des contrôles granulaires à la haute disponibilité et aux performances

Comment HolidayMe utilise Redis Enterprise comme base de données principale

Comment HolidayMe utilise Redis Enterprise comme base de données principale

Annonce de RedisGears 1.0 : un moteur sans serveur pour Redis

Annonce de RedisGears 1.0 : un moteur sans serveur pour Redis

Clés Redis dans la RAM |  Redis

Clés Redis dans la RAM | Redis

No Comment

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *