Einführung in die KI-Erstellung mit Python! Teil 2 Ich habe versucht, den Hauspreis in Boston mit einem neuronalen Netz vorherzusagen

Über diesen Artikel

Verwenden von "Rückkehr", die die Grundlage für tiefes Lernen ist, Ich möchte ein Programm erstellen, um den Hauspreis vorherzusagen. Ich werde so viel wie möglich aus Anfängersicht schreiben. Der vorherige Artikel ist hier .

Was ist eine Rückkehr?

Regression ist die Aufgabe, __numerische Werte basierend auf charakteristischen Daten vorherzusagen. Dieses Mal werden wir ein Programm zur Vorhersage der Immobilienpreise erstellen, aber es ist auch möglich, Preisbewegungen von Aktien und Devisen (Devisentransaktionen) vorherzusagen.

import

Import ist ↓. Dieses Mal importieren wir Pandas, um die Daten zu überprüfen.

Pandas sind übrigens sehr einfach zu handhaben, aber sehr langsam. Es ist üblich, Numpy zum Lernen und Pandas zur visuellen Bestätigung und Datenvorverarbeitung zu verwenden.

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

Home Preis herunterladen

Dieses Mal werden wir eine Bibliothek namens boston_housing verwenden, um die Immobilienpreise vorherzusagen. boston_housing enthält charakteristische Informationen und das richtige Antwortetikett, wenn Sie sich für ein Haus in Boston, USA, entscheiden. Zu den charakteristischen Informationen (im Folgenden als erklärende Variablen bezeichnet) gehören die Kriminalitätsrate und die Zugänglichkeit des Gebiets.

Wenn diese erklärende Variable schlampige Informationen enthält, ist die Genauigkeit der Vorhersage offensichtlich schlecht. Zum Beispiel, selbst wenn Sie die Anzahl der Pachinko-Läden in der Nähe zu den erklärenden Variablen hinzufügen Nur der Pachinker fühlt den Wert, so dass er die Vorhersage stört. Wir müssen etwas hinzufügen, das jeder für wert hält.

Der schwierigste Teil der Regressionsvorhersage ist die Definition dieser erklärenden Variablen. Diesmal ist es einfach, weil es in den heruntergeladenen Daten enthalten ist.

Der Download ist der folgende Code. Die heruntergeladenen erklärenden Variablen trennen die richtigen Antwortetiketten zum Lernen und Verifizieren. (train_data, train_labels) dient zur Schulung und (test_data, test_labels) zur Überprüfung. Dieser Bereich entspricht der Klassifizierung des vorherigen Artikels.

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

Überprüfen Sie die Anzahl der Formen. Es gibt 404 Trainingsdaten und 102 Verifizierungsdaten. Im Vergleich zur Klassifizierung des vorherigen Artikels ist es viel weniger. Es ist die Anzahl der Fälle, die mich fragen lassen, ob ich es wirklich vorhersagen kann.

Datenvorverarbeitung

Als nächstes folgt die einfachste und wichtigste Aufgabe, die Datenvorverarbeitung. Bei dieser Immobilienpreisprognose handelt es sich nicht um Zeitreihendaten, daher besteht keine Kontinuität. Bei der Vorhersage solcher Daten ist es sicherer, die Daten zu mischen.

Verwenden Sie random.random (), um eine Zufallszahl zu erstellen, und np.argsort (), um einen Index zu erstellen und zu sortieren.

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

Normalisieren Sie als nächstes die erklärenden Variablen, die den Hauspreis bestimmen. Dieses Mal wird die Normalisierung verwendet, um die erklärende Variable auf einen Wert mit einer Varianz von 1 mit einem Durchschnitt von 0 zu setzen.

Bei der Regressionsvorhersage kann die Vorhersage durch eine große Anzahl von erklärenden Variablen gezogen werden. Es wird gesagt, dass es gut ist, auf diese Weise zu normalisieren.

Die Normalisierung kann berechnet werden, indem der Durchschnitt von den zu normalisierenden Daten subtrahiert und durch die Standardabweichung dividiert wird. Der Code ist ↓.

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

Verwenden Sie Pandas, um sicherzustellen, dass die erklärenden Variablen normalisiert sind.

#Bestätigung der Daten nach Vorverarbeitung des Datensatzes
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()

Modell erstellen

Erstellen Sie ein Modell des neuronalen Netzwerks. Dieses Mal werden wir drei Schichten der gesamten Verbindung vorbereiten.

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']) #kompilieren

Ich werde jeden erklären. Erstellen Sie zunächst ein sequentielles Modell mit model = Sequential ().

model.add (Dense (64, Aktivierung = 'relu', input_shape = (13,))) ist die Eingabeebene. Dicht: Gesamte Gesamtbindung, Anzahl der Einheiten: 64, Aktivierungsfunktion: ReLU, Erklärende Variablen: 13

model.add (Dense (64, activity = 'relu')) ist eine versteckte Ebene. Dicht: Gesamte Gesamtbindung, Anzahl der Einheiten: 64, Aktivierungsfunktion: ReLU

model.add (Dense (1)) ist die Ausgabeschicht. Diesmal handelt es sich um eine numerische Vorhersage, daher gibt es nur eine Einheit (Anzahl der Ausgänge).

Modell kompilieren

Kompilieren Sie mit model.compile (Verlust = 'mse', Optimierer = Adam (lr = 0,001), Metriken = ['mae']). Stellen Sie mit loss = 'mse' die Verlustfunktion __ ein, um den Fehler __ zwischen dem vorhergesagten Wert und dem tatsächlichen Wert zu ermitteln. Stellen wir mse ein, das für die Regression geeignet sein soll.

Stellen Sie mit Optimierer = Adam (lr = 0,001) Adam auf die Optimierungsfunktion __ ein, um den Fehler zu reduzieren, und setzen Sie die Lernrate auf 0,01.

Stellen Sie mit Metriken = ['mae'] die mae der Bewertungsfunktion __ ein, um die Leistung des __- Modells zu bewerten.

Lernen

Dieses Mal möchte ich mit Early Stopping lernen. Wenn Sie bei EarlyStopping bei der angegebenen Anzahl von Epochen keine Verbesserung des Lernens feststellen, wird es automatisch gestoppt. Dieses Mal würde ich gerne aufhören, wenn es in 20 Epochen keine Verbesserung gibt.

Setzen Sie zum Lernen die maximale Anzahl von Epochen auf 500, setzen Sie die Verifizierungsdaten auf 20% und aktivieren Sie Early Stop mit Rückrufen = [Early_stop].

#Bereiten Sie sich auf ein frühes Anhalten vor
early_stop = EarlyStopping(monitor='val_loss', patience=30)

#Ausführung des Lernens
history = model.fit(train_data, train_labels, epochs=500, 
    validation_split=0.2, callbacks=[early_stop])

Dies ist eine Erklärung der Lernsituation. __verlust ist der Trainingsdatenfehler __. Je näher es an 0 liegt, desto besser ist das Ergebnis. __mae ist der durchschnittliche absolute Fehler der Trainingsdaten __. Je näher es an 0 liegt, desto besser ist das Ergebnis. __val_loss ist der Validierungsdatenfehler __. Je näher es an 0 liegt, desto besser ist das Ergebnis. __val_mae ist der durchschnittliche absolute Fehler __ der Validierungsdaten. Je näher es an 0 liegt, desto besser ist das Ergebnis.

Ich habe die Anzahl der Epochen auf 500 festgelegt, aber ich denke, dass sie eingestellt wurde, da auf dem Weg keine Verbesserung erkennbar ist.

Zeigen Sie die Lernergebnisse in einem Diagramm an

Zeichnen Sie history.history, in der das Lernergebnis mit matplotlib gespeichert wird.

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()

Bewertung des Lernens

Werten Sie die Trainingsdaten mit model.evalute aus.

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

Das Ergebnis ist schlechter als die Trainingsdaten, aber das Ergebnis ist fast das gleiche. Es ist erstaunlich, dass wir selbst mit einer kleinen Anzahl von Fällen, etwa 400, eine Zahl in der Nähe davon erreichen können. Vielleicht ist die Definition erklärender Variablen ausgezeichnet.

Inferenz

Lassen Sie uns abschließend die Vorhersagedaten ausgeben und überprüfen. Zeigen Sie zuerst das richtige Antwortetikett an und schließen Sie dann. Da das Ausgabeergebnis der Inferenz zweidimensional ist, konvertieren wir es mit flatten () in eindimensional.

#Zeigen Sie das richtige Antwortetikett an
print(np.round(test_labels[0:10]))

#Anzeige des abgeleiteten Preises
test_predictions = model.predict(test_data[0:10]).flatten()
print(np.round(test_predictions))
Es scheint, dass ein numerischer Wert nahe dem richtigen Antwortetikett erhalten werden kann.

Immobilien, die unter dieser Prognose liegen, werden möglicherweise billiger als der Marktpreis verkauft. Es kann jedoch aus Gründen billiger sein, die nicht durch erklärende Variablen ausgedrückt werden können (z. B. durch auftretende Geister). Es ist gefährlich, nur mit diesem Vorhersageergebnis zu kaufen und zu verkaufen, aber ich denke, es wird hilfreich sein.

Recommended Posts

Einführung in die KI-Erstellung mit Python! Teil 2 Ich habe versucht, den Hauspreis in Boston mit einem neuronalen Netz vorherzusagen
Einführung in die KI-Erstellung mit Python! Teil 3 Ich habe versucht, Bilder mit einem Convolutional Neural Network (CNN) zu klassifizieren und vorherzusagen.
Einführung in die KI-Erstellung mit Python! Teil 1 Ich habe versucht, die Nummer anhand des handgeschriebenen Zahlenbildes zu klassifizieren und vorherzusagen
Django super Einführung von Python-Anfängern! Teil 6 Ich habe versucht, die Login-Funktion zu implementieren
Ich habe auch versucht, die Funktionsmonade und die Zustandsmonade mit dem Generator in Python nachzuahmen
Ich schrieb einen Test in "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren".
Eine Geschichte, die nicht funktioniert hat, als ich versucht habe, mich mit dem Python-Anforderungsmodul anzumelden
Ich habe versucht, nächstes Jahr mit AI vorherzusagen
Django super Einführung von Python-Anfängern! Teil 3 Ich habe versucht, die Vererbungsfunktion für Vorlagendateien zu verwenden
Django super Einführung von Python-Anfängern! Teil 2 Ich habe versucht, die praktischen Funktionen der Vorlage zu nutzen
Ich habe versucht, den unter "Abrufen von Bildern von der Flickr-API mit Python" (Teil 2) veröffentlichten Vorlagencode zu überarbeiten.
Ich habe versucht, die Pferde vorherzusagen, die mit LightGBM unter den Top 3 sein werden
Ich habe versucht, die in Python installierten Pakete grafisch darzustellen
Ich habe versucht, eine CSV-Datei mit Python zu berühren
Ich habe versucht, Soma Cube mit Python zu lösen
Ich habe versucht, einen Pseudo-Pachislot in Python zu implementieren
[Python & SQLite] Ich habe den erwarteten Wert eines Rennens mit Pferden im 1x-Gewinnbereich ① analysiert
Ich möchte mit einem Roboter in Python arbeiten.
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Ich habe versucht, mit AI kreative Kunst zu machen! Ich habe eine Neuheit programmiert! (Artikel: Creative Adversarial Network)
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe versucht zu simulieren, wie sich die Infektion mit Python ausbreitet
Ich habe versucht, einen eindimensionalen Zellautomaten in Python zu implementieren
Ich habe versucht "Wie man eine Methode in Python dekoriert"
Ich habe versucht, die Mail-Sendefunktion in Python zu implementieren
Ich habe versucht, den Immobilienpreis in Boston mit PyCaret vorherzusagen
Ich habe eine Stoppuhr mit tkinter mit Python gemacht
Ich habe eine Klasse erstellt, um das Analyseergebnis von MeCab in ndarray mit Python zu erhalten
Ich habe versucht, das Musikgenre anhand des Songtitels im Recurrent Neural Network vorherzusagen
Ich habe versucht, eine Funktion zu erstellen, um zu beurteilen, ob die wichtigsten Aktien der Welt Sommerzeit mit Python sind
[5.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe versucht, die Anfängerausgabe des Ameisenbuchs mit Python zu lösen
[2nd] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
[Einführung in Python] So teilen Sie eine Zeichenfolge mit der Funktion split
[3.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe versucht, mit Python eine Liste von Primzahlen zu erstellen
Ich habe versucht, das Bild mit OpenCV im "Skizzenstil" zu verarbeiten
[Einführung in Python] Wie verwende ich den Operator in in der for-Anweisung?
Ich habe versucht, ein missverstandenes Gefangenendilemma in Python zu implementieren
Ich habe versucht, mit Selenium und Python einen regelmäßigen Ausführungsprozess durchzuführen
Ich habe versucht, mit Python eine 2-Kanal-Post-Benachrichtigungsanwendung zu erstellen
Ich wollte das ABC164 A ~ D-Problem mit Python lösen
Ich habe versucht, eine ToDo-App mit einer Flasche mit Python zu erstellen
[4.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
[1.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
Ich habe versucht, die Anzahl der im Inland infizierten Menschen der neuen Korona mit einem mathematischen Modell vorherzusagen
Ich habe versucht, den Unterschied zwischen A + = B und A = A + B in Python herauszufinden
Ich habe versucht, "einen genetischen Algorithmus (GA) in Python zu implementieren, um das Problem des Handlungsreisenden (TSP) zu lösen".
[Python] Ich habe versucht, die Nacht der Galaxienbahn mit WordCloud zu visualisieren!
[Python] Ich habe versucht, den kollektiven Typ (Satz) auf leicht verständliche Weise zusammenzufassen.
Ich habe versucht, Permutation in Python zu implementieren
Ich habe versucht, mit einem Remote-Server über Socket-Kommunikation mit Python zu kommunizieren.
[Einführung in die Udemy Python3 + -Anwendung] 47. Verarbeiten Sie das Wörterbuch mit einer for-Anweisung