Cet article est écrit par des débutants en apprentissage automatique. Notez s'il vous plaît.
Un exemple réellement utilisé est ici. Le contexte spécifique de l'idée et le contenu révisé sont ici.
Bukkake [WIkipedia](https://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E5%AF%86%E5% BA% A6% E6% 8E% A8% E5% AE% 9A) est plus rapide.
Imaginez un simple histogramme. On peut dire que la partie où l'histogramme est haut est *** relativement facile à réaliser dans l'ensemble, et la partie où l'histogramme est bas *** est relativement peu probable ***. Avez-vous déjà entendu une histoire similaire quelque part?
C'est la même idée que la fonction de densité de probabilité. Un histogramme est, en un sens, une *** vraie fonction de densité de probabilité *** estimée par une mesure réelle ***. *** L'estimation de la densité par noyau *** est une méthode d'estimation plus continue et plus fluide utilisant des fonctions de noyau.
[Wikipédia](https://ja.wikipedia.org/wiki/%E6%95%99%E5%B8%AB%E3%81%82%E3%82%8A%E5%AD%A6%E7%BF % 92) Voir l'enseignant ou lire la Qiita d'une autre personne.
Un «enseignant» en apprentissage supervisé est un ensemble de «données» et «d'étiquette correcte».
Considérez un ensemble de données avec l'étiquette correcte "0, 1, 2". Il est divisé en données d'étiquette 0, données d'étiquette 1 et données d'étiquette 2. Si vous estimez la densité du noyau en utilisant les données de l'enseignant avec le libellé de réponse correct de 0, vous pouvez trouver la fonction de densité de probabilité pour l'événement selon lequel "le libellé devient 0".
Trouvez la fonction de densité de probabilité basée sur les données de l'enseignant pour toutes les étiquettes et calculez la densité de probabilité des données de test. Ensuite, classons par la taille de la valeur. Voilà cette tentative.
À proprement parler, il faut vraiment calculer la proportion de chaque label dans la population ... Je voudrais résumer à nouveau l'histoire difficile.
Ce monde est merveilleux. Ceci est dû au fait que l'estimation de la densité du noyau utilisant le noyau gaussien a déjà été implémentée dans SciPy.
Voici un bref résumé de la façon d'utiliser gaussian_kde de SciPy.
kernel = gaussian_kde(X, bw_method="scotts_factor", weights="None")
--X: ensemble de données pour l'estimation de la densité du noyau. --bw_method: bande passante du noyau. Scotts_factor s'il n'est pas spécifié. --weights: poids pour estimer la densité du noyau. Si non spécifié, tous les poids sont égaux.
Entrez de nouvelles données dans la fonction de densité de probabilité estimée pour calculer la probabilité.
pd = kernel.evaluate(Z)
--Z: point (s) de données pour lesquels vous souhaitez calculer la probabilité.
Il est renvoyé sous forme de tableau de liste contenant les probabilités Z.
Essayez-le avec le jeu de données iris de Scikit-learn!
Le flux est comme ça jeu de données iris lu → Divisez les données d'entraînement et les données de test avec train_test_split → Standardisation des données d'entraînement et des données de test → Effectuer une estimation de la densité du noyau pour chaque étiquette à l'aide des données d'apprentissage → Calculer la densité de probabilité pour chaque étiquette des données de test → Sortie de l'étiquette avec la plus grande valeur
↓ Script ↓
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from scipy.stats import gaussian_kde
# Chargement du jeu de données iris
iris = datasets.load_iris()
X = iris.data
y = iris.target
# Division des données d'entraînement et des données de test
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3,
random_state=1, stratify=y)
# Standardisation
sc = StandardScaler()
sc = sc.fit(X_train)
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)
# Estimation de la densité du noyau
kernel0 = gaussian_kde(X_train_std[y_train==0].T)
kernel1 = gaussian_kde(X_train_std[y_train==1].T)
kernel2 = gaussian_kde(X_train_std[y_train==2].T)
# Calculer la densité de probabilité des données de test
p0s = kernel0.evaluate(X_test_std.T)
p1s = kernel1.evaluate(X_test_std.T)
p2s = kernel2.evaluate(X_test_std.T)
# Sortie d'étiquette de prédiction
y_pred = []
for p0, p1, p2 in zip(p0s, p1s, p2s):
if max(p0, p1, p2) == p0:
y_pred.append(0)
elif max(p0, p1, p2) == p1:
y_pred.append(1)
else:
y_pred.append(2)
Les données de test sont standardisées en utilisant la moyenne et l'écart type des données d'entraînement. En effet, si la normalisation est effectuée séparément, les données peuvent être biaisées ou mal alignées.
Si vous laissez gaussian_kde lire le jeu de données tel quel, il semble que le vecteur de colonne *** soit traité comme une seule donnée ***. Cependant, le jeu de données iris transpose les données car *** vecteur de ligne est une donnée ***. Il en va de même pour le calcul de la densité de probabilité des données de test.
y_pred = []
for p0, p1, p2 in zip(p0s, p1s, p2s):
if max(p0, p1, p2) == p0:
y_pred.append(0)
elif max(p0, p1, p2) == p1:
y_pred.append(1)
else:
y_pred.append(2)
La densité de probabilité des données de test est stockée dans p0s, p1s, p2s pour chaque étiquette. Sortez un chacun
--0 si la valeur de l'étiquette 0 est le maximum --1 si la valeur de l'étiquette 1 est le maximum
Les résultats sont stockés dans la liste y_pred dans l'ordre des données de test.
Vérifiez le taux de précision de l'étiquette de prédiction avec precision_score de scikit-learn. Palpiter.
from sklearn.metrics import accuracy_score
print(accuracy_score(y_test, y_pred))
1.0
Hourra.
J'ai essayé d'utiliser le résultat de l'estimation de la densité du noyau comme classificateur pour l'apprentissage supervisé. En réalité, de telles techniques sont rarement utilisées. Je pense que cela a les inconvénients d'augmenter la quantité de calcul et de réduire considérablement la précision en fonction des données. Cependant, comme vous pouvez le voir à partir de cet essai, il semble que certaines données peuvent être classées relativement rapidement et correctement.
Suite sur Partie 2
Recommended Posts