[PYTHON] Recherche de propriétés pour commencer avec TensorFlow-Part 1

TensorFlow publié par Google en novembre 2015. Le thème du didacticiel officiel est la reconnaissance des nombres manuscrits du MNIST. https://www.tensorflow.org/get_started/mnist/beginners

Cependant, je voulais faire quelque chose qui serait plus utile dans ma vie, alors j'ai choisi le thème «trouver des propriétés».

Remarquer

Reconnaissance des numéros manuscrits MNIST

MNIST Handwritten Number Recognition est un problème bien connu en intelligence artificielle, en particulier dans le domaine de la reconnaissance d'images. C'est une tâche de saisir des caractères manuscrits de 0 à 9 et de déterminer de quel nombre de 0 à 9 il s'agit. Plus le pourcentage de données de test pouvant être jugées correctement est élevé, mieux c'est (pour parler simplement).

Le nombre de données et les dimensions des données d'entrée et des données de sortie sont les suivants.

num_of_data=70,000(60,000 training data, 10,000 test data)
input=784 (28*28 pixels)
output=10 (Étiquettes de 0 à 9)

Formation d'image et d'étiquette, validation, dimensions des données de test

---- _images ----
(55000, 784)
(5000, 784)
(10000, 784)
<type 'numpy.ndarray'>
---- _labels ----
(55000, 10)
(5000, 10)
(10000, 10)
(agile_env)tensorflow $ pwd

Recherche de propriété: définition du problème

Réfléchissons au type de problème à poser concernant la "recherche de propriété" en référence à la "reconnaissance de nombres manuscrits MNIST". Cette fois, nous assumerons notamment les biens locatifs.

Lors de la recherche de propriétés locatives, il est courant d'affiner les propriétés en fonction de conditions telles que la zone dans laquelle vous souhaitez vivre, mais "Dans quelle mesure est-il approprié de payer un loyer mensuel pour les souhaits que vous avez, tels que la gare la plus proche et l'aménagement?" Je pense que c'est un point de vue qui sera certainement préoccupant à un moment donné.

Si vous pouvez utiliser d'autres données de propriété pour dériver quelque chose comme une "ligne directrice de loyer raisonnable", vous pourrez peut-être savoir si le loyer de la propriété qui vous intéresse est bon marché ou cher ...? J'ai pensé.

L'immobilier avec des caractéristiques différentes une par une semble être un monde où la prévision des prix est difficile à faire, mais au moins pour moi c'était un problème plus intéressant que de reconnaître des nombres manuscrits, donc je vais l'essayer.

◯◯ Je veux vivre dans un immeuble de 10 ans avec 1LDK, à 10 minutes à pied de la gare.
・ On m'a dit que c'était 10 000 yens par mois, mais est-ce une bonne affaire?
・ À titre indicatif, il semble être XX 10 000 yens. ◯◯ 10 000 yens ne sont-ils pas trop chers?

Considérons les données d'entrée et les données de sortie de la même manière que les données MNIST. J'ai fait référence à Évaluation du salaire des joueurs de baseball professionnels avec réseau neuronal.

input=34(29+1+3+1)Voir ci-dessous
output=10

*type d'entrée
・ Station la plus proche: 29 stations sur la ligne Yamate (une)-hot vector) *Diminuer si trop, augmenter si trop peu (autres itinéraires?).
Faire le tour de la gare de Shinagawa. Gare de Shinagawa:0e élément d'entrée,Gare d'Osaki:1,...
・ Marchez jusqu'à la station la plus proche ◯ minutes (0 en fonction de la valeur maximale des données-Normalisé à 1)
・ Disposition: 3 types de 1LDK, 2DK, 2LDK(one-hot vector) *La mise en page dans laquelle l'auteur est susceptible de vivre
·Âge(0 au maximum dans les données-Normalisé à 1)
##・ Avec ou sans caution
##・ Présence ou absence de récompense
##·zone(Normalisé avec la valeur maximale dans les données)
##・ Appartement, appartement: (one-hot vector)
…

*le type de sortie
0: 7.Moins de 50000 yens
1: 7.5-8.Moins de 0,000 yens
2: 8.0-8.Moins de 50000 yens
3: 8.5-9.Moins de 0,000 yens
4: 9.0-9.Moins de 50000 yens
5: 9.5-10.Moins de 0,000 yens
6: 10.0-10.Moins de 50000 yens
7: 10.5-11.Moins de 0,000 yens
8: 11.0-11.Moins de 50000 yens
9: 11.50000 yens ou plus

Collecte de données

Cette fois, j'utiliserai les résultats de recherche d'un site d'information complet sur un certain bien immobilier majeur et le logement. Par exemple, spécifiez une condition telle que "JR Yamate Line, 1LDK / 2DK / 2LDK, 100 éléments affichés par page".

Explorez avec python etc. et collectez de cette manière, par exemple.

train_Ligne JR Yamate/Gare de Tabata 14 2DK 15 11.8000001907 [URL de la propriété]
train_Ligne JR Yamate/Gare de Tabata 14 2DK 15 11.8000001907 [URL de la propriété]
train_Ligne JR Yamate/Gare de Tabata 14 2DK 15 11.8000001907 [URL de la propriété]
train_Ligne JR Yamate/Gare de Tabata 14 2DK 15 11.8000001907 [URL de la propriété]
…

Au total, 29786 affaires (au moment de l'exécution).

Formatage / lecture des données

Modifiez le fichier input_data.py fourni dans le didacticiel TensorFlow en Permet de lire les données d'entrée préparées en csv telles quelles.

Déterminez le rapport entre les données d'entraînement, de validation et de test (22000, 2000, 5786).

split -l 24000 attributes.csv
(after splitting, rename to train- and test- attributes.csv)
split -l 24000 labels.csv
(after splitting, rename to train- and test- labels.csv)

REAL_ESTATE_data $ tail -5 train-attributes.csv 
0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.06451612903225806,1,0,0,0.36666666666666664
0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.01935483870967742,0,1,0,0.6333333333333333
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0.0967741935483871,0,0,1,0.1111111111111111
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0.1032258064516129,1,0,0,0.32222222222222224
0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.05161290322580645,1,0,0,0.1
REAL_ESTATE_data $ tail -5 train-labels.csv 
8
9
9
6
9
REAL_ESTATE_data $ tail -5 test-attributes.csv 
0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0967741935483871,0,0,1,0.25555555555555554
0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.05806451612903226,0,1,0,0.34444444444444444
0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.12258064516129032,0,1,0,0.35555555555555557
0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.03870967741935484,0,1,0,0.5
0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.16129032258064516,1,0,0,0.022222222222222223
REAL_ESTATE_data $ tail -5 test-labels.csv 
9
9
9
9
9
REAL_ESTATE_data $ 

extract_images (nom de fichier) lit simplement csv tel quel (bien que ce ne soit plus "images").

def extract_images(filename):
  print('Extracting images ', filename)
  data = numpy.genfromtxt(filename, delimiter=',') # default is dtype=float
  return data

La classe DataSet est également omise car elle ne nécessite pas de conversion de dimension.

class DataSet(object):
  
  def __init__(self, images, labels, fake_data=False):
    if fake_data:
      self._num_examples = 10000
    else:
      assert images.shape[0] == labels.shape[0], ( "images.shape: %s labels.shape: %s" % (images.shape, labels.shape))
      self._num_examples = images.shape[0]

    self._images = images
    self._labels = labels
    self._epochs_completed = 0
    self._index_in_epoch = 0
…

modèle

Suivez le didacticiel TensorFlow (pour les débutants) pour créer un modèle de régression Softmax. Le modèle de régression Softmax semble généralement être un modèle populaire lorsque vous souhaitez attribuer une probabilité que quelque chose soit l'un des différents candidats. Dans l'exemple de la reconnaissance de nombres manuscrits, c'est une image qui attribue la probabilité de «9» à 80%, la probabilité de «8» à 4%, et ainsi de suite pour une certaine image.

[0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.04, 0.80]
softmax: exponentiating its inputs and then normalizing them. 

exponentiation:
- one more unit of evidence increases the weight given to any hypothesis multiplicatively. 
- one less unit of evidence means that a hypothesis gets a fraction of its earlier weight. 
- No hypothesis ever has zero or negative weight. 

normalization:
- they add up to one, forming a valid probability distribution.

Premier résultat

(agile_env)tensorflow $ python intro_mnist_refactor.py
##### prepare and read data set #####
Extracting images  REAL_ESTATE_data/train-attributes.csv
Extracting labels  REAL_ESTATE_data/train-labels.csv
Extracting images  REAL_ESTATE_data/test-attributes.csv
Extracting labels  REAL_ESTATE_data/test-labels.csv
##### init and run session #####
can't determine number of CPU cores: assuming 4
I tensorflow/core/common_runtime/local_device.cc:25] Local device intra op parallelism threads: 4
can't determine number of CPU cores: assuming 4
I tensorflow/core/common_runtime/local_session.cc:45] Local session inter op parallelism threads: 4
##### training #####
##### evaluation #####
0.859834
(agile_env)tensorflow $ 

Comme les données de test étaient de 5786, il semble que moins de 5 000 d'entre eux aient pu déterminer correctement le loyer. Si vous ne regardez que ce nombre, avez-vous fait un jugement décent ...?

Regarder les données

Vous l'avez peut-être remarqué dès l'étape de l'étiquetage des loyers, 9 (= le loyer est de 115000 yens ou plus cette fois) est extrêmement élevé ...! Après avoir lu l'ensemble de données, si vous agrégez de cette manière ...

print mnist.train._labels.shape
print mnist.validation._labels.shape
print mnist.test._labels.shape

print numpy.sum(mnist.train._labels, axis = 0)
print numpy.sum(mnist.validation._labels, axis = 0)
print numpy.sum(mnist.test._labels, axis = 0)
(22000, 10): training
(2000, 10): validation
(5786, 10): test
[   127.    158.    199.    235.    314.    407.    442.    539.    598.  18981.]
[    7.    10.    25.    19.    33.    33.    38.    49.    47.  1739.]
[   48.    41.    51.    71.    84.   123.   113.   133.   141.  4981.]

Il y a beaucoup plus de données étiquetées 9 que d'autres. L'écart type est

numpy.std(numpy.sum(mnist.train._labels, axis = 0))
numpy.std(numpy.sum(mnist.validation._labels, axis = 0))
numpy.std(numpy.sum(mnist.test._labels, axis = 0))
5595.73064041
513.175213743
1467.88052647

Qu'en est-il des données MNIST?

(55000, 10): training
(5000, 10): validation
(10000, 10): test
[ 5444.  6179.  5470.  5638.  5307.  4987.  5417.  5715.  5389.  5454.]
[ 479.  563.  488.  493.  535.  434.  501.  550.  462.  495.]
[  980.  1135.  1032.  1010.   982.   892.   958.  1028.   974.  1009.]

On peut dire que les données de 0 à 9 sont collectées de manière bien équilibrée avec des caractères manuscrits. L'écart type est

291.905806725
37.6218021897
59.1962836671

la prochaine fois

Je prévois de réessayer l'analyse tout en collectant les données de 0 à 9 de manière bien équilibrée et en examinant le contenu des données.

Recommended Posts

Recherche de propriétés pour commencer avec TensorFlow-Part 1
Pour ceux qui souhaitent démarrer l'apprentissage automatique avec TensorFlow2
Mémo pour demander des KPI avec python
Démarrez la dernière odo avec 2 commandes à l'aide de Docker Desktop pour Windows
Rejoignez Azure avec Go ~ Pour ceux qui veulent démarrer et connaître Azure avec Go ~
Recherche d'un moyen efficace d'écrire un Dockerfile avec Python avec de la poésie
Je veux recommencer avec Migrate de Django
J'ai essayé de démarrer Jupyter avec toutes les lumières d'Amazon
IoT facile pour démarrer avec Raspeye et MESH
Arrêter EC2 pendant l'heure spécifiée + démarrer avec Lambda (python)
De l'utilisateur à root ~ Recherche de promotion ~ (TAMUctf 2020: Writeup)
Préparation au démarrage de «Python Machine Learning Programming» (pour macOS)
Pour ceux qui veulent écrire Python avec vim
Choses à faire lorsque vous commencez à développer avec Django
Points à garder à l'esprit lors de la migration avec Django
Convertir 202003 en 2020-03 avec les pandas
Démarrez IPython avec virtualenv
Django à partir d'aujourd'hui
Mettre à jour Raspberry Pi Python vers 3.7 ou version ultérieure avec pyenv
Essayez d'afficher diverses informations utiles pour le débogage avec python
Je veux démarrer un environnement Jupyter avec une seule commande
Expérimentez pour créer un PDF indépendant pour Kindle avec Python
[NetworkX] Je souhaite rechercher des nœuds avec des attributs spécifiques
De la construction de l'environnement au déploiement pour flask + Heroku avec Docker
Introduction à Python pour les utilisateurs de VBA - Appeler Python depuis Excel avec xlwings -
Essayez d'automatiser le démarrage / l'arrêt des instances EC2 avec AWS Lambda
Pour les débutants, comment gérer les erreurs courantes dans les keras
Comment démarrer Apache en spécifiant httpd.conf avec systemd (CentOS7, CentOS8)