[PYTHON] [Apprentissage automatique] Apprentissage supervisé utilisant l'estimation de la densité du noyau Partie 3

Apprentissage supervisé utilisant l'estimation de la densité du noyau

Cet article est écrit par des débutants en apprentissage automatique. Notez s'il vous plaît.

Le premier article est ici. Le deuxième article est ici.

Dans cet article, je vais expliquer le contexte de l'idée à l'aide de formules mathématiques.

Densité de probabilité et probabilité

L'estimation de la densité du noyau consistait à estimer la fonction de densité de probabilité avec la fonction de noyau. Alors, quelle était exactement la fonction de densité de probabilité?

La fonction de densité de probabilité représente la distribution de l'accessibilité ***. *** Pour l'événement A, une valeur x avec une densité de probabilité élevée *** signifie que lorsque l'événement A se produit, la probabilité que la valeur à ce moment-là soit x est relativement élevée ***. Remplaçons "événement A" par "étiquette 0". «À la valeur x, la densité de probabilité de l'étiquette 0 est élevée» signifie «lorsque certaines données sont l'étiquette 0, la probabilité que les données aient la valeur x est relativement élevée».

Il faut noter ici que la densité de probabilité ≠ la probabilité. La densité de probabilité est «une relative facilité d'apparition pour un événement spécifique», et il n'y a aucune garantie qu'elle puisse être comparée à la densité de probabilité d'autres événements. En premier lieu, la probabilité qu'une valeur spécifique apparaisse dans les données continues n'est pas définie. La probabilité ne peut pas être calculée sans une certaine plage.

P(X=x)=0 \\ P(X \leqq x)=p

En intégrant la fonction de densité de probabilité, vous pouvez trouver la probabilité dans cet intervalle (ou cette région s'il s'agit de deux dimensions ou plus). Ainsi, la probabilité d'une valeur particulière "proche" peut être calculée, probablement. Plus la densité de probabilité de la valeur x est élevée, plus la probabilité d'apparition de la valeur x "proche" est élevée, et plus la densité de probabilité de la valeur x est faible, plus la probabilité d'apparition de la valeur x "proche" est faible.

Je voudrais vous donner un exemple. À la valeur x, la densité de probabilité de l'étiquette 1 est supérieure à la densité de probabilité de l'étiquette 0. En ce moment,

--Probabilité de la valeur x "proche" lorsque l'étiquette vaut 0 --Probabilité de la valeur x "proche" lorsque l'étiquette vaut 1

Lequel est le plus élevé? Ce n'est pas strict, mais intuitivement, ce dernier semble être plus élevé (divers). A l'avenir, nous procéderons à des discussions en supposant que cette intuition est correcte.

Réécrivez «étiquette 0» comme «y = 0» et «étiquette 1» comme «y = 1». Ensuite, l'histoire jusqu'à présent

 Densité de probabilité de l'étiquette 0 à la valeur x \ leqq Densité de probabilité de l'étiquette 1 à la valeur x \\
 \ Rightarrow Probabilité de valeur x lorsque y = 0 \ leqq Probabilité de valeur x lorsque y = 1 \\
 \Rightarrow P(x|y=0) \leqq P(x|y=1)

Il se résume ainsi. Cependant, c'est exactement la valeur x "proche".

Probabilité conditionnelle et théorème de Bayes

Pour la valeur x

 P(y=0|x) \leqq P(y=1|x)

Si, alors il est logique d'attribuer l'étiquette 1 au lieu de l'étiquette 0. Par conséquent, si vous pouvez trouver la probabilité de «étiquette 0 ou étiquette 1» et la probabilité conditionnelle sous la condition «d'extraction de la valeur x», vous gagnerez.

Réécrivons cette inégalité en utilisant le théorème de Bayes.

 P(y=0|x) \leqq P(y=1|x) \\ \Leftrightarrow
 \frac{P(x|y=0)P(y=0)}{P(x)} \leqq \frac{P(x|y=1)P(y=1)}{P(x)}

Le dénominateur P (x) est commun et est supérieur ou égal à 0. Après tout

 P(x|y=0)P(y=0) \leqq P(x|y=1)P(y=1)

Si tu peux montrer

 P(y=0|x) \leqq P(y=1|x)

Peut être dit de tenir. Maintenant en utilisant l'estimation de la densité du noyau

 P(x|y=0) \leqq P(x|y=1)

Je le sais. Par conséquent, si nous pouvons connaître les valeurs de P (y = 0) et P (y = 1), il sera réglé.

Estimation du ratio d'étiquette

P (y = 0) peut être interprété comme "la probabilité que certaines données soient sélectionnées et qu'elles portent l'étiquette 0".

Trouver la population P (y = 0) et P (y = 1) n'est pas facile. Par conséquent, supposons que le rapport de composition de l'étiquette des données de l'enseignant soit la valeur estimée de P (y = 0) et P (y = 1). Sur 100 données d'enseignants, 40 sont l'étiquette 0 et 60 sont l'étiquette 1.

P(y=0)=0.4\\ P(y=1)=0.6

Je suppose.

En fait, les classificateurs que j'ai implémentés dans les articles précédents ignoraient les effets de P (y = 0) et P (y = 1). Il a fait une forte supposition que le rapport de chaque étiquette était égal.

Réimplémentation

Sur la base de l'explication jusqu'à présent, nous implémenterons à nouveau le classificateur orienté objet.

import numpy as np

class GKDEClassifier(object):
    
    def __init__(self, bw_method="scotts_factor", weights="None"):
 # Bande passante du noyau
        self.bw_method = bw_method
 # Poids du noyau
        self.weights = weights
        
    def fit(self, X, y):
 Nombre d'étiquettes pour # y
        self.y_num = len(np.unique(y))   
 #Calcul du ratio d'étiquette
        self.label, y_count = np.unique(y, return_counts=True)
        self.y_rate = y_count/y_count.sum()
 # Liste contenant les fonctions de densité de probabilité estimée
        self.kernel_ = []
 # Stocker la fonction de densité de probabilité
        for i in range(self.y_num):
            kernel = gaussian_kde(X[y==self.label[i]].T)
            self.kernel_.append(kernel)
        return self

    def predict(self, X):
 # Liste pour stocker les étiquettes prédictives
        pred = []
 #Ndarray qui stocke les probabilités des données de test par étiquette
        self.p_ = np.empty([self.y_num, len(X)])
 # Stocker la probabilité par étiquette
        for i in range(self.y_num):
            self.p_[i] = self.kernel_[i].evaluate(X.T)
 # Multipliez le ratio d'étiquette
        for j in range(self.y_num):
            self.p_[j] = self.p_[j] * self.y_rate[j]
 # Allocation d'étiquettes de prédiction
        for k in range(len(X)):
            pred.append(self.label[np.argmax(self.p_.T[k])])
        return pred

Les pièces ajoutées et modifiées sont expliquées ci-dessous.

Calcul du ratio d'étiquette

self.label, y_count = np.unique(y, return_counts=True)
self.y_rate = y_count/y_count.sum()

Ajout de la partie pour calculer le rapport d'étiquette des données de l'enseignant à la méthode d'ajustement. La valeur totale de y_rate est définie sur 1 en divisant le nombre d'apparitions y_count pour chaque étiquette par la valeur totale. Si vous utilisez y_count tel quel sans diviser par la valeur totale, le résultat ne changera pas.

De plus, la répartition des étiquettes *** (0, 1 ou chaîne de caractères) est sortie sous forme d'étiquette de liste. ***(important)

Calcul de la fonction de densité de probabilité

Voici le nouveau code. Correction pour correspondre à diverses étiquettes.

for i in range(self.y_num):
    kernel = gaussian_kde(X[y==self.label[i]].T)
    self.kernel_.append(kernel)

C'est le code jusqu'à présent ↓ ↓

kernel = gaussian_kde(X[y==i].T)

À l'origine, "données avec étiquette i" était spécifié, mais il a été modifié pour spécifier "données avec étiquette de type i". En spécifiant à partir de l'étiquette de sortie, cela correspond à une étiquette (chaîne de caractères etc.) qui n'est pas un entier non négatif.

Refléter le ratio d'étiquette

for j in range(self.y_num):
    self.p_[j] = self.p_[j] * self.y_rate[j]

Ajout d'une partie à la méthode de prédiction qui multiplie la densité de probabilité par le rapport d'étiquette.

Allocation d'étiquettes de prédiction

Voici le nouveau code.

for k in range(len(X)):
    pred.append(self.label[np.argmax(self.p_.T[k])])

En spécifiant l'étiquette attribuée à partir de l'étiquette de liste, les étiquettes autres que les entiers non négatifs sont également prises en charge.

Autre

J'ai réécrit la partie désordonnée de la méthode de prédiction en utilisant numpy. En créant d'abord le ndarray, puis en remplaçant le résultat, nous essayons d'améliorer la lisibilité et la vitesse de calcul.

finalement

J'ai réussi à finir d'écrire dans mon cerveau jusqu'au bout. Merci pour votre relation. Nous espérons que ceux qui liront l'article le trouveront encore un peu plus intéressant.

(Corrigé le 5 août 2020)

Recommended Posts

[Apprentissage automatique] Apprentissage supervisé utilisant l'estimation de la densité du noyau Partie 2
[Apprentissage automatique] Apprentissage supervisé utilisant l'estimation de la densité du noyau Partie 3
[Apprentissage automatique] Apprentissage supervisé utilisant l'estimation de la densité du noyau
Apprentissage automatique: supervisé - AdaBoost
Machine Learning: Supervision - Régression linéaire
Python: Apprentissage supervisé: Hyper Paramètres Partie 1
Estimation de la densité du noyau en Python
Apprentissage automatique: forêt supervisée - aléatoire
Python: apprentissage supervisé: Hyper Paramètre partie 2
Machine Learning: Supervisé - Support Vector Machine
Machine learning supervisé (classification / régression)
Machine Learning: Supervisé - Arbre de décision
Les débutants en Python publient des applications Web à l'aide de l'apprentissage automatique [Partie 1] Introduction
Apprentissage automatique: analyse discriminante linéaire supervisée
Développement d'applications à l'aide d'Azure Machine Learning
Prévision du cours des actions à l'aide de l'apprentissage automatique (scikit-learn)
Prédire la demande de puissance avec l'apprentissage automatique, partie 2
[Apprentissage automatique] Classification des sujets LDA à l'aide de scikit-learn
[Apprentissage automatique] Prédiction FX à l'aide de l'arbre de décision
Apprentissage automatique
Les débutants en Python publient des applications Web à l'aide de l'apprentissage automatique [Partie 2] Introduction à Python explosif !!
Prévision du cours des actions à l'aide de l'apprentissage automatique (édition de retour)
[Apprentissage automatique] Analyse de régression à l'aide de scicit learn
Classification EV3 x Pyrhon Machine Learning Partie 3
Création d'un modèle d'estimation de position pour la compétition d'intelligence humaine de loup à l'aide de l'apprentissage automatique
Mémo d'apprentissage automatique d'un ingénieur débutant Partie 1
Classification des images de guitare par apprentissage automatique Partie 1
Une histoire sur l'apprentissage automatique simple avec TensorFlow
Apprentissage automatique à partir de Python Personal Memorandum Part2
Astuces de fourniture de données utilisant deque dans l'apprentissage automatique
Bases de l'apprentissage avec un enseignant Partie 1-Régression simple- (Remarque)
Apprentissage automatique à partir de Python Personal Memorandum Part1
EV3 x Pyrhon Machine Learning Partie 1 Construction de l'environnement
EV3 x Python Machine Learning Partie 2 Régression linéaire
Prévision du cours des actions à l'aide du Deep Learning (TensorFlow) - Partie 2
Mémo d'apprentissage automatique d'un ingénieur débutant Partie 2
Estimation raisonnable du prix de Mercari par apprentissage automatique
Classification des images de guitare par apprentissage automatique, partie 2
Essayez d'utiliser le bloc-notes Jupyter à partir d'Azure Machine Learning
Bases de l'apprentissage avec un enseignant Partie 3-Régression multiple (mise en œuvre) - (Notes) -
[Apprentissage automatique] Extraire des mots similaires mécaniquement en utilisant WordNet
Raisonnement causal utilisant l'apprentissage automatique (organisation des méthodes de raisonnement causal)
Report_Apprentissage approfondi (partie 2)
Report_Apprentissage approfondi (partie 1)
Report_Apprentissage approfondi (partie 2)
Apprentissage supervisé (classification)
[Memo] Apprentissage automatique
Classification de l'apprentissage automatique
Exemple d'apprentissage automatique
Ce que j'ai appris sur l'IA / l'apprentissage automatique avec Python (1)
Machine learning facile avec AutoAI (partie 4) Jupyter Notebook
Créez des projets d'apprentissage automatique à une vitesse explosive à l'aide de modèles
Ce que j'ai appris sur l'IA / l'apprentissage automatique avec Python (3)
Un spécialiste du marketing amateur en apprentissage automatique a contesté les prix des maisons de Kaggle (partie 1)
Python: Diagramme de distribution de données bidimensionnelle (estimation de la densité du noyau)
Apprentissage automatique avec des images de catégorie Caffe -1 à l'aide du modèle de référence
Tech-Circle Commençons le développement d'applications à l'aide de l'apprentissage automatique (auto-apprentissage)
[Apprentissage automatique] Essayez de détecter des objets à l'aide de la recherche sélective
[Apprentissage automatique] Classification de texte à l'aide du modèle Transformer (classificateur basé sur l'attention)