[PYTHON] Une histoire sur la prédiction des préfectures à partir des noms de villes avec Jubatus

Vieille histoire

Lorsque j'ai commencé à apprendre le machine learning, il n'existait pas de github. J'ai laissé tomber la source sur le net, je l'ai compilée et j'ai dit: "Oh, je ne sais pas, mais ça ne marche pas ..." Ou, "Oh, je ne sais pas, mais ça a marché ...". Sinon, je ne sais pas dans quelle mesure j'ai bien écrit mon propre code et mis en œuvre correctement. J'expérimentais le code (ce qui est définitivement inefficace en termes d'informatique).

Mais de nos jours, même les implémentations les plus complexes de la théorie sont généralement sur github. Et le fait qu'il soit publié sur github signifie que l'utilisation est clairement indiquée et que tout le monde peut l'utiliser. L'interface simple est simple.

Jubatus est un tel cadre, c'est comme un rêve que vous puissiez faire de l'apprentissage automatique sans connaître de théorie compliquée. http://jubat.us/ja/

C'est la fin de la tenue de taiko.

C'est un article que j'ai essayé en utilisant Jubatus. La première chose à faire est de saisir le nom de la ville, de la ville et du village, puis de créer quelque chose qui vous indiquera de quelle préfecture est le nom du lieu. Puisque le but est «d'essayer d'utiliser», la cible était n'importe quoi, mais pour être clair, tout allait bien. Le carnet d'adresses du nom de la préfecture a été fourni sous forme de fichier csv sur le site [ici] 1, donc je l'ai utilisé.

pre-processing

J'utiliserai les données téléchargées ci-dessus, mais je n'aime pas le code de caractère dans SJIS, je vais donc le convertir en utf-8.

wget http://jusyo.jp/downloads/new/csv/csv_zenkoku.zip
unzip csv_zenkoku.zip
nkf -w zenkoku.csv > zenkoku_utf-8.csv

Je pense que les données peuvent maintenant être lues en japonais. À propos, cette conversion n'est pas nécessaire dans l'environnement Windows, mais cette fois nous supposons Linux (CentOS). (Si vous essayez d'utiliser jubatus sous Windows en premier lieu, cela ne devrait pas être simple, donc je ne pense pas que cette explication soit nécessaire.)

Donc, je n'aime pas la première ligne (explication de chaque colonne), donc je la supprime.

Avec cela, les données à manger par jubatus sont prêtes, mais si elles sont laissées telles quelles, la disposition des données est trop régulière. Peu importe ce que vous dites, l'Amant de Hokkaido, qui renvoie "Hokkaido", ne sera que terminé, alors mélangez les lignes à l'avance.

shuf zenkoku_utf-8.csv > shuffled_zenkoku.csv

Enregistrez-le dans un répertoire appelé data.

configration

Maintenant que les données sont en place, il est temps d'écrire les paramètres dans json pour alimenter Jubatus. https://github.com/chase0213/address_classifier/blob/master/adrs_clf.json

AROW est utilisé comme algorithme d'apprentissage. Il n'y a pas de raison particulière.

Donc, fondamentalement, comme c'est le cas maintenant, le vecteur d'entrée est un vecteur qui a une chaîne de caractères comme élément, donc Écrivez dans le champ string_rules comment gérer cette chaîne. Ce n'est pas un plan pour faire quelque chose de pratique, donc pour le moment, je vais juste compter le nombre de caractères divisé par unigramme.

"string_rules": [
      { "key": "*", "type": "unigram", "sample_weight": "bin", "global_weight": "bin" }
]

Bien sûr, si vous voulez faire quelque chose de pratique, vous devez bien réfléchir à cette partie. (En premier lieu, il n'y a rien de pratique car presque rien n'est fait dans la partie prétraitement)

Veuillez consulter la [Page officielle de Jubatus] 2 pour plus de détails sur le réglage.

starting jubatus server

Une fois les paramètres définis, démarrez le serveur jubatus.

$ jubaclassifier --configpath adrs_clf.json

S'il n'y a pas d'erreur, il est en cours d'exécution.

training

Après avoir terminé les réglages, nous entrerons enfin dans la phase d'apprentissage. C'est ce qu'on appelle la formation. https://github.com/chase0213/address_classifier/blob/master/train.py

Quand j'ai appris toutes les données, elles ont expiré, alors je donne environ 50 000 pour le moment.

tnum = 50000

Normalement, les données d'entraînement et les données de classification sont stockées séparément. Cette fois, c'est un problème (

Je n'ai rien fait de particulièrement difficile, donc si vous avez lu jusqu'ici, vous pouvez voir ce que vous faites en regardant le code. Je vais donc omettre l'explication.

Le seul point important est

# training data must be shuffled on online learning!
random.shuffle(train_data)

C'est ici. Étant donné que l'échantillon est détourné tel quel, j'ai soigneusement inclus des commentaires, mais Si vous transmettez les données de l'enseignant sans mélange, cela reflétera l'effet de l'ordre des données. Je ne comprends pas vraiment l'algorithme donc je ne peux rien dire en détail, Peut-être que l'influence des données consommées à la fin deviendra plus forte. Dans ce cas, les données ont été mélangées à l'origine, donc Même si vous ne mélangez pas ici, les performances ne se détérioreront pas autant, mais si vous l'oubliez lorsque vous la réutilisez, c'est tout.

Après la lecture aléatoire, commencez à apprendre.

# run train
client.train(train_data)

classification

Ce n'est pas particulièrement difficile non plus, alors jetez un œil au code. https://github.com/chase0213/address_classifier/blob/master/detect.py

Cette fois, j'ai donné trois noms de lieux, «Isezaki», «Takasaki» et «Kamakura», et de quelle préfecture s'agit-il? ?? Je le ferai.

Cliquez ici pour les résultats.

$ python detect.py
Préfecture de Gunma Isezaki
Préfecture de Gunma Takasaki
Kamakura, préfecture de Kanagawa

Oh! !! correct! !! Hou la la! !! !!

・ ・ ・ ・ ・ ・.

Enregistrez 50 000 paires "préfecture-ville" dans votre python, De quelle préfecture s'agit-il? Veuillez essayer quelque chose comme ça. Le total devrait être d'environ 160 000, donc il devrait y avoir 1/3 de chance de toucher.

C'est bien que je savais que cet exemple n'était pas intelligent avant de commencer, Cependant, il y a encore de bons points. Il s'agit de la «capacité de classification des données inconnues».

Le classificateur (ou apprentissage automatique) donne à l'origine des données connues pour prédire des données inconnues Parce que, même pour les noms de lieux qui n'ont pas été donnés comme données d'enseignant, Vous pouvez prédire (renvoyer la réponse pour le moment). Si vous essayez de faire cela avec python uniquement, cela devrait être assez difficile.

C'est tout pour essayer d'utiliser jubaclassifier.

Recommended Posts

Une histoire sur la prédiction des préfectures à partir des noms de villes avec Jubatus
L'histoire de la création d'une caméra sonore avec Touch Designer et ReSpeaker
Une histoire sur le calcul de la vitesse d'une petite balle tombant tout en recevant la résistance de l'air avec Python et Sympy
L'histoire du lancement d'un serveur Minecraft depuis Discord
Une histoire sur le changement du nom principal de BlueZ
Une histoire sur l'obtention du champ Atom (télégramme XML) de l'Agence météorologique avec une tarte à la râpe et de le tweeter
(Premier article) Une histoire sur le calcul numérique de la grippe et du nouveau coronavirus de la pneumonie avec Tensorflow
Une histoire sur le portage du code de "Essayez de comprendre comment fonctionne Linux" sur Rust
L'histoire du champ de modèle Django disparaissant de la classe
Une histoire sur la façon de traiter le problème CORS
L'histoire de la création d'un bot de boîte à questions avec discord.py
Une histoire coincée avec l'installation de la bibliothèque de machine learning JAX
L'histoire de la création d'un pilote standard pour db avec python.
Creusez le répertoire et créez une liste de chemins de répertoire + noms de fichiers
L'histoire de la création d'un module qui ignore le courrier avec python
L'histoire de Python et l'histoire de NaN
L'histoire de l'exportation d'un programme
Une histoire sur la création d'un programme qui augmentera le nombre d'abonnés Instagram de 0 à 700 en une semaine
Une histoire qui visualise le présent de Qiita avec Qiita API + Elasticsearch + Kibana
L'histoire de la création d'un robot LINE pour le petit-déjeuner d'une université de 100 yens avec Python
Calculer l'itinéraire le plus court d'un graphe avec la méthode Dyxtra et Python
Trouvez la broche inertielle et le moment d'inertie principal à partir du tenseur inertiel avec NumPy
Une histoire sur l'automatisation du mahjong en ligne (Jakutama) avec OpenCV et l'apprentissage automatique
Créez DNN-CRF avec Chainer et reconnaissez la progression des accords de la musique
Obtenez le salaire moyen d'un emploi avec des conditions spécifiées sur Indeed.com
[python] Une histoire sur la collecte de noms de compte Twitter à partir de noms de descripteurs (comme @ 123456) en combinant BeautifulSoup et Excel entrée / sortie.
Une histoire sur l'apprentissage automatique avec Kyasuket
L'histoire d'essayer deep3d et de perdre
Une histoire sur Python pop and append
L'histoire du traitement A du blackjack (python)
L'histoire de la fabrication d'une boîte qui interconnecte la mémoire AL de Pepper et MQTT
Apprenez les tendances des mots clés dans les textes avec Jubatus et classez vos textes d'entrée
Deep Learning from scratch La théorie et la mise en œuvre de l'apprentissage profond appris avec Python Chapitre 3
L'histoire de la création d'une application Web qui enregistre des lectures approfondies avec Django
Connexion SSH au serveur cible à partir de Windows en un clic sur un raccourci
Obtenez le cours de l'action d'une entreprise japonaise avec Python et faites un graphique