Récemment, je suis débutant depuis environ 3 mois depuis que j'ai commencé à utiliser l'apprentissage automatique.
Je veux utiliser tensorFlow, mais je pense toujours que le seuil est élevé, donc j'utilise actuellement "scikit-learn" qui a tout le nécessaire pour l'apprentissage automatique. (J'aimerais passer à tensorFlow à l'avenir.)
Ici, je laisserai une note personnelle sur la manière de gérer le modèle créé dans d'autres langues.
Je vous serais reconnaissant de bien vouloir signaler toute erreur.
À titre d'exemple, ce qui suit est ciblé.
Au départ, j'ai choisi l'algorithme suivant:
En regardant les données préparées, j'ai senti que la séparation linéaire n'était pas possible, alors je me suis entraîné avec SVM qui prend en charge la non-linéarité. Le noyau utilisé est le noyau gaussien.
En regardant la matrice de confusion des données de formation, le taux de réponse correcte était d'environ 99%.
Cependant, lorsque j'ai examiné la matrice de confusion des données de test, j'ai créé une situation dans laquelle tous les 0 ou 1 étaient prédits. Un soi-disant surapprentissage se produisait. (Il est logique de sur-ajuster compte tenu de la relation entre le nombre d'échantillons préparés et le nombre de dimensions. Il peut être possible de le traiter dans une certaine mesure en ajustant les hyper paramètres.)
Donc, tout récemment, une classe pour les réseaux de neurones a été implémentée dans scicit-learn, alors j'ai essayé de l'utiliser.
Classe utilisée: MLPClassifier Page officielle: http://scikit-learn.org/stable/modules/generated/sklearn.neural_network.MLPClassifier.html
En conséquence, il a appris correctement et les performances de généralisation étaient supérieures à celles du SVM non linéaire.
Dès la conclusion, si vous connaissez le «poids» et le «biais», c'est presque un objectif.
Le code ci-dessous montre comment l'obtenir à partir de MLPClassifier.
poids
MLPClassifier#coefs_
biais
MLPClassifier#intercepts_
Comme la méthode se termine au pluriel, s'il existe plusieurs couches du réseau neuronal, vous pouvez obtenir le poids et le biais de cette couche.
Lorsque le réseau de neurones est une couche d'entrée (100 dimensions) → couche cachée 1 (200 dimensions) → couche cachée 2 (300 dimensions) → couche de sortie
La matrice qui peut être obtenue avec MLPClassifier # coefs_
doit être une matrice d'une taille de 100x200 s'il s'agit d'un réseau de couche d'entrée (100 dimensions) → couche cachée 1 (200 dimensions).
En d'autres termes, si vous pouvez lire cette matrice dans une autre langue, ce n'est pas grave.
En fait, je veux l'intégrer dans Rails, donc je fais un calcul matriciel en utilisant les classes Matrix et Vector.
#Des lectures similaires se produisent autant de fois que de couches
file_path = File.expand_path('app/models/hogehoge.csv', ENV['RAILS_ROOT'])
csv_data = CSV.read(file_path, headers: false)
matrix = Matrix.rows(csv_data, true)
#La première ligne et la première colonne correspondent à l'en-tête, donc omettez les autres ...
matrix = matrix.first_minor(0, 0).map(&:to_f)
C'était un problème que le classificateur actuellement pris en charge peut classer même si le nombre de dimensions n'est pas si grand et la couche n'est pas profonde. Cependant, si le nombre de dimensions dépasse 10 000 et que le nombre de couches est énorme, il reste à savoir si cette méthode peut être utilisée.
Recommended Posts