Introduction à la création d'IA avec Python! Partie 2 J'ai essayé de prédire le prix de l'immobilier dans la ville de Boston avec un réseau neuronal

À propos de cet article

En utilisant le "retour", qui est la base de l'apprentissage en profondeur, Je voudrais faire un programme pour prédire le prix de l'immobilier. J'écrirai autant que possible du point de vue d'un débutant. L'article précédent est ici .

Qu'est-ce qu'un retour?

La régression consiste à prédire des valeurs numériques basées sur des données caractéristiques. Cette fois, nous allons créer un programme pour prédire les prix des maisons, mais il est également possible de prédire les mouvements de prix des actions et des devises (opérations de change).

import

L'importation est ↓. Cette fois, importons des pandas pour vérifier les données.

Au fait, les pandas sont très faciles à manipuler, mais très lents. Il est courant d'utiliser numpy pour l'apprentissage et les pandas pour la confirmation visuelle et le prétraitement des données.

from tensorflow.keras.datasets import boston_housing
from tensorflow.keras.layers import Activation, Dense, Dropout
from tensorflow.keras.models import Sequential
from tensorflow.keras.callbacks import EarlyStopping
from tensorflow.keras.optimizers import Adam
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

Accueil Prix Télécharger

Cette fois, nous utiliserons une bibliothèque appelée boston_housing pour prédire les prix des maisons. boston_housing contient des informations caractéristiques et l'étiquette de réponse correcte lors du choix d'une maison à Boston, aux États-Unis. Les informations caractéristiques (ci-après dénommées variables explicatives) comprennent le taux de criminalité et l'accessibilité de la zone.

Évidemment, si cette variable explicative contient des informations bâclées, la prédiction sera inexacte. Par exemple, même si vous ajoutez le nombre de boutiques de pachinko à proximité aux variables explicatives Seul le pachinker ressent la valeur, donc cela interférera avec la prédiction. Nous devons ajouter quelque chose que tout le monde sent utile.

La partie la plus difficile de la prédiction de régression est la définition de cette variable explicative. Cette fois, c'est facile car il est inclus dans les données téléchargées.

Le téléchargement est le code ci-dessous. Les variables explicatives téléchargées séparent les étiquettes de réponse correctes pour l'apprentissage et la vérification. (train_data, train_labels) est pour la formation et (test_data, test_labels) est pour la vérification. Cette zone est la même que la classification de l'article précédent.

(train_data, train_labels), (test_data, test_labels) = boston_housing.load_data()

Vérifiez le nombre de formes. Il y a 404 données d'entraînement et 102 données de vérification. Par rapport au classement de l'article précédent, c'est beaucoup moins. C'est le nombre de cas qui me fait me demander si je peux vraiment le prédire.

Prétraitement des données

Vient ensuite la tâche la plus simple et la plus importante, le prétraitement des données. Ces prévisions de prix des logements ne sont pas des données chronologiques, il n'y a donc pas de continuité. Lors de la prédiction de telles données, il est plus sûr de mélanger les données.

Utilisez random.random () '' pour créer un nombre aléatoire et np.argsort () '' pour créer un index et trier.

order = np.argsort(np.random.random(train_labels.shape))
train_data = train_data[order]
train_labels = train_labels[order]

Ensuite, normalisez les variables explicatives qui déterminent le prix du logement. Cette fois, la normalisation est utilisée pour fixer la variable explicative à une valeur avec une variance de 1 avec une moyenne de 0.

Dans la prédiction de régression, la prédiction peut être tirée par un grand nombre de variables explicatives. On dit qu'il est bon de normaliser de cette manière.

La normalisation peut être calculée en soustrayant la moyenne des données que vous souhaitez normaliser et en la divisant par l'écart type. Le code est ↓.

mean = train_data.mean(axis=0)
std = train_data.std(axis=0)
train_data = (train_data - mean) / std
test_data = (test_data - mean) / std

Utilisez des pandas pour vous assurer que les variables explicatives sont normalisées.

#Confirmation des données après le prétraitement de l'ensemble de données
column_names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE',  'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT']
df = pd.DataFrame(train_data, columns=column_names)
df.head()

Créer un modèle

Créez un modèle du réseau neuronal. Cette fois, nous préparerons trois couches de connexion totale totale.

model = Sequential()
model.add(Dense(64, activation='relu', input_shape=(13,)))
model.add(Dense(64, activation='relu'))
model.add(Dense(1))

model.compile(loss='mse', optimizer=Adam(lr=0.001), metrics=['mae']) #compiler

Je vais expliquer chacun d'eux. Tout d'abord, créez un modèle séquentiel avec `` model = Sequential () ''.

model.add (Dense (64, activation = 'relu', input_shape = (13,))) est la couche d'entrée. Dense: Liaison totale totale, Nombre d'unités: 64, Fonction d'activation: ReLU, Variables explicatives: 13

model.add (Dense (64, activation = 'relu')) est une couche cachée. Dense: Liaison totale totale, Nombre d'unités: 64, Fonction d'activation: ReLU

`` model.add (Dense (1)) '' est la couche de sortie. Cette fois, il s'agit d'une prédiction numérique, il n'y a donc qu'une seule unité (nombre de sorties).

Compiler le modèle

Compilez avec model.compile (loss = 'mse', optimizer = Adam (lr = 0.001), metrics = ['mae']). Avec loss = 'mse', définissez la fonction de perte __ pour trouver l'erreur __ entre la valeur prédite et la valeur réelle. Définissons mse qui convient à la régression.

Avec optimizer = Adam (lr = 0,001), définissez Adam sur la fonction d'optimisation __ pour réduire l'erreur et définissez le taux d'apprentissage sur 0,01.

Avec metrics = ['mae'], définissez le mae de la fonction d'évaluation __ pour évaluer les performances du modèle __.

Apprentissage

Cette fois, j'aimerais apprendre à utiliser l'arrêt anticipé. Avec EarlyStopping, si vous ne voyez aucune amélioration dans l'apprentissage avec le nombre d'époques spécifié, il s'arrêtera automatiquement. Cette fois, s'il n'y a pas d'amélioration depuis 20 époques, je voudrais m'arrêter.

Pour l'apprentissage, définissez le nombre maximal d'époques sur 500, définissez les données de vérification sur 20% et activez l'arrêt anticipé avec callbacks = [early_stop].

#Préparez-vous à un arrêt anticipé
early_stop = EarlyStopping(monitor='val_loss', patience=30)

#Exécution de l'apprentissage
history = model.fit(train_data, train_labels, epochs=500, 
    validation_split=0.2, callbacks=[early_stop])

Ceci est une explication de la situation d'apprentissage. __loss est l'erreur de données d'entraînement __. Plus il est proche de 0, meilleur est le résultat. __mae est l'erreur absolue moyenne des données d'entraînement __. Plus il est proche de 0, meilleur est le résultat. __val_loss est l'erreur de données de validation __. Plus il est proche de 0, meilleur est le résultat. __val_mae est l'erreur absolue moyenne __ des données de validation. Plus il est proche de 0, meilleur est le résultat.

J'ai fixé le nombre d'époques à 500, mais je pense qu'il a été interrompu car aucune amélioration n'est visible en cours de route.

Afficher les résultats d'apprentissage dans un graphique

Dessinez history.history où le résultat d'apprentissage est enregistré avec matplotlib.

plt.plot(history.history['mae'], label='train mae')
plt.plot(history.history['val_mae'], label='val mae')
plt.xlabel('epoch')
plt.ylabel('mae [1000$]')
plt.legend(loc='best')
plt.ylim([0,5])
plt.show()

Évaluation de l'apprentissage

Évaluez les données d'entraînement avec model.evalute.

test_loss, test_mae = model.evaluate(test_data, test_labels)
print('loss:{:.3f}\nmae: {:.3f}'.format(test_loss, test_mae))

Le résultat est pire que les données d'entraînement, mais le résultat est presque le même. Il est étonnant que même avec un petit nombre de cas, environ 400, nous pouvons en approcher un certain nombre. Peut-être que la définition des variables explicatives est excellente.

inférence

Enfin, sortons les données de prédiction et vérifions-les. Affichez d'abord l'étiquette de réponse correcte, puis déduisez. Puisque le résultat de l'inférence en sortie est bidimensionnel, convertissons-le en unidimensionnel avec `` flatten () ''.

#Afficher l'étiquette de réponse correcte
print(np.round(test_labels[0:10]))

#Affichage du prix déduit
test_predictions = model.predict(test_data[0:10]).flatten()
print(np.round(test_predictions))
Il semble qu'une valeur numérique proche de l'étiquette de réponse correcte puisse être obtenue.

Les propriétés qui sont inférieures à cette prévision peuvent être vendues moins cher que le prix du marché. Cependant, cela peut être moins cher pour des raisons qui ne peuvent être exprimées par des variables explicatives (comme l'apparition de fantômes). Il est dangereux d'acheter et de vendre uniquement avec ce résultat de prédiction, mais je pense que ce sera utile.

Recommended Posts

Introduction à la création d'IA avec Python! Partie 2 J'ai essayé de prédire le prix de l'immobilier dans la ville de Boston avec un réseau neuronal
Introduction à la création d'IA avec Python! Partie 3 J'ai essayé de classer et de prédire les images avec un réseau de neurones convolutifs (CNN)
Introduction à la création d'IA avec Python! Partie 1 J'ai essayé de classer et de prédire le nombre à partir de l'image du numéro manuscrit
Django super introduction par les débutants Python! Partie 6 J'ai essayé d'implémenter la fonction de connexion
J'ai aussi essayé d'imiter la fonction monade et la monade d'état avec le générateur en Python
J'ai écrit un doctest dans "J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python"
Une histoire qui n'a pas fonctionné lorsque j'ai essayé de me connecter avec le module de requêtes Python
J'ai essayé de prédire l'année prochaine avec l'IA
Django super introduction par les débutants Python! Partie 3 J'ai essayé d'utiliser la fonction d'héritage de fichier de modèle
Django super introduction par les débutants Python! Partie 2 J'ai essayé d'utiliser les fonctions pratiques du modèle
J'ai essayé de refactoriser le code du modèle publié dans "Obtenir des images de l'API Flickr avec Python" (Partie 2)
J'ai essayé de prédire les chevaux qui seront dans le top 3 avec LightGBM
J'ai essayé de représenter graphiquement les packages installés en Python
J'ai essayé de toucher un fichier CSV avec Python
J'ai essayé de résoudre Soma Cube avec python
J'ai essayé d'implémenter un pseudo pachislot en Python
[Python & SQLite] J'ai analysé la valeur attendue d'une course avec des chevaux dans la fourchette 1x win ①
Je veux travailler avec un robot en python.
J'ai essayé de résoudre le problème avec Python Vol.1
J'ai essayé de faire de l'art créatif avec l'IA! J'ai programmé une nouveauté! (Article: Réseau Adversaire Créatif)
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé de simuler la propagation de l'infection avec Python
J'ai essayé d'implémenter un automate cellulaire unidimensionnel en Python
J'ai essayé "Comment obtenir une méthode décorée en Python"
J'ai essayé d'implémenter la fonction d'envoi de courrier en Python
J'ai essayé de prédire le prix de l'immobilier à Boston avec PyCaret
J'ai fait un chronomètre en utilisant tkinter avec python
J'ai créé une classe pour obtenir le résultat de l'analyse par MeCab dans ndarray avec python
J'ai essayé de prédire le genre de musique à partir du titre de la chanson sur le réseau neuronal récurrent
J'ai essayé de créer une fonction pour juger si les principaux stocks du monde sont l'heure d'été avec python
[5e] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de résoudre l'édition du débutant du livre des fourmis avec python
[2nd] J'ai essayé de créer un certain outil de type Authenticator avec python
[Introduction à Python] Comment fractionner une chaîne de caractères avec la fonction split
[3ème] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de créer une liste de nombres premiers avec python
J'ai essayé de traiter l'image en "style croquis" avec OpenCV
[Introduction à Python] Comment utiliser l'opérateur in dans l'instruction for?
J'ai essayé de mettre en œuvre un jeu de dilemme de prisonnier mal compris en Python
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
J'ai essayé de créer une application de notification de publication à 2 canaux avec Python
Je voulais résoudre le problème ABC164 A ~ D avec Python
J'ai essayé de créer une application todo en utilisant une bouteille avec python
[4th] J'ai essayé de créer un certain outil de type Authenticator avec python
[1er] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
J'ai essayé de prédire le nombre de personnes infectées au niveau national de la nouvelle corona avec un modèle mathématique
J'ai essayé de trouver la différence entre A + = B et A = A + B en Python, alors notez
J'ai essayé "Implémentation d'un algorithme génétique (GA) en python pour résoudre le problème du voyageur de commerce (TSP)"
[Python] J'ai essayé de visualiser la nuit du chemin de fer de la galaxie avec WordCloud!
[Python] J'ai essayé de résumer le type collectif (ensemble) d'une manière facile à comprendre.
J'ai essayé d'implémenter la permutation en Python
J'ai essayé de communiquer avec un serveur distant par communication Socket avec Python.
[Introduction à Udemy Python3 + Application] 47. Traitez le dictionnaire avec une instruction for